• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:JMenuに最近使ったファイルを追加
#navi(../)
*JMenuに最近使ったファイルを追加 [#a3e2a135]
>編集者:[[Terai Atsuhiro>terai]]~
作成日:2003-10-07~
更新日:&lastmod;
---
category: swing
folder: FileHistory
title: JMenuに最近使ったファイルを追加
tags: [JMenu, JMenuBar, File]
author: aterai
pubdate: 2003-11-10
description: JMenuに「最近使ったファイル(F)」を履歴として追加していきます。
image: https://lh3.googleusercontent.com/_9Z4BYR88imo/TQTMffElRbI/AAAAAAAAAZQ/1d47Mop5D-0/s800/FileHistory.png
---
* 概要 [#summary]
`JMenu`に「最近使ったファイル(`F`)」を履歴として追加していきます。

#contents
#download(https://lh3.googleusercontent.com/_9Z4BYR88imo/TQTMffElRbI/AAAAAAAAAZQ/1d47Mop5D-0/s800/FileHistory.png)

**概要 [#z0413747]
JMenuに、「最近使ったファイル(F)」を履歴として追加していきます。
* サンプルコード [#sourcecode]
#code(link){{
private int MAXHISTORY = 3;
private void updateHistory(String str) {
  fileHistoryMenu.removeAll();
  fileHistoryCache.remove(str);
  fileHistoryCache.add(0, str);
  if (fileHistoryCache.size() > MAX_HISTORY) {
    fileHistoryCache.remove(fileHistoryCache.size() - 1);
  }
  for (int i = 0; i < fileHistoryCache.size(); i++) {
    String name = fileHistoryCache.get(i);
    String num  = Integer.toString(i + 1);
    JMenuItem mi = new JMenuItem(new HistoryAction(name));
    mi.setText(num + ": " + name);
    mi.setMnemonic((int) num.charAt(0));
    fileHistoryMenu.add(mi, i);
  }
}

#screenshot
class HistoryAction extends AbstractAction {
  private final String fileName;
  public HistoryAction(String fileName) {
    super();
    this.fileName = fileName;
  }

**サンプルコード [#u0f87931]
 private int MAXHISTORY = 3;
 private void updateHistory(String str) {
   fileHistory.removeAll();
   fh.removeElement(str);
   fh.insertElementAt(str, 0);
   if(fh.size()>MAXHISTORY) fh.remove(fh.size()-1);
   for(int i=0;i<fh.size();i++) {
     String name = (String)fh.elementAt(i);
     String num  = Integer.toString(i+1);
     JMenuItem mi = new JMenuItem(new HistoryAction(new File(name)));
     mi.setText(num + ": "+ name);
     byte[] bt = num.getBytes();
     mi.setMnemonic((int) bt[0]);
     fileHistory.add(mi, i);
   }
 }
 class HistoryAction extends AbstractAction{
   final private File file;
   public HistoryAction(File file_) {
     super();
     file = file_;
   }
   public void actionPerformed(ActionEvent evt) {
     historyActionPerformed(file);
   }
 }
 private void historyActionPerformed(File file) {
   Object[] obj = {"本来はファイルを開いたりする。\n",
                   "このサンプルではなにもせずに\n",
                   "履歴の先頭にファイルを移動する。"};
   JOptionPane.showMessageDialog(this, obj, APP_NAME,
                   JOptionPane.INFORMATION_MESSAGE);
   repaint();
   updateHistory(file.getAbsolutePath());
 }
  @Override public void actionPerformed(ActionEvent e) {
    Object[] obj = {"本来はファイルを開いたりする。\n",
                    "このサンプルではなにもせずに\n",
                    "履歴の先頭にファイルを移動する。"};
    JComponent c = (JComponent) e.getSource();
    JOptionPane.showMessageDialog(c.getRootPane(), obj, VersionAction.APP_NAME,
        JOptionPane.INFORMATION_MESSAGE);
    updateHistory(fileName);
  }
}
}}

//-&jnlp;
-&jar;
-&zip;
* 解説 [#explanation]
上記のサンプルでは「ファイル、開く」の`JMenuItem`をクリックするとファイルのオープン履歴を「最近使ったファイル(`F`)」の`JMenu`中に追加しています。

**解説 [#p7efb749]
上記のサンプルでは、「ファイル->開く」で、ファイルの履歴が残ります。履歴は3件まで残り、履歴をメニューから選択すると、そのファイルが履歴の先頭に移動します。
- 履歴を表示する`JMenuItem`は`3`件までに制限
- 履歴用の`JMenuItem`をメニューから選択するとそのファイルを履歴の先頭に移動(ファイルを開く処理などはない)
-- 実際に使用する場合はファイルを使用している箇所を修正したり、アプリケーションを終了する際に履歴を保存したりするコードを追加する必要がある

アプリケーションを再起動しても、これらのファイル履歴を残しておきたい場合は、Preferencesなどを使用する必要があります。
* 参考リンク [#reference]
- [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/JMenu.html JMenu (Java Platform SE 8)]
- [[Resourceファイルからメニューバーを生成>Swing/ResourceMenuBar]]
- [[JFrameの位置・サイズを記憶する>Swing/Preferences]]

**参考リンク [#k3eb0d01]
-[[Resourceファイルからメニューバーを生成>Swing/ResourceMenuBar]]
-[[JFrameの位置・サイズを記憶する>Swing/Preferences]]

**コメント [#j906ef87]
* コメント [#comment]
#comment
#comment