1

悪い考えかもしれませんが、新しいコンストラクターを追加するためにJMenuItemのサブクラスを作成しました。それを呼びましょうJMenuItemX

import java.awt.event.ActionListener;
import javax.swing.JMenuItem;

@SuppressWarnings("serial")
public class JMenuItemX extends JMenuItem
{
  public JMenuItemX(final String the_text, final char the_mnemonic,
                    final ActionListener the_action)
  {
    super(the_text);
    setMnemonic(the_mnemonic);
    addActionListener(the_action);
  }
}

今、私はAbstractActionを使用してコンポーネントにツールチップを追加しようとしています:

import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.JOptionPane;

@SuppressWarnings("serial")
public class AboutAction extends AbstractAction
{

  public AboutAction()
  {
    super("About");
    putValue(SHORT_DESCRIPTION, "Show the popup window");
  }

  @Override
  public void actionPerformed(final ActionEvent the_event)
  {
    JOptionPane.showMessageDialog(null, "Hello World!");
  }
}

コンポーネントをそのように構築します (JFrame、JMenuBar、および JMenu は既にセットアップされています)。

menu.add(new JMenuItemX("About", 'a', new AboutAction()));

(ご覧のとおり、複数のメニュー項目を追加する場合、この 1 行形式の方が読みやすいです。)


メニュー項目は正しいテキストで表示され、ニーモニックとアクションは期待どおりに機能します。しかし、ツールチップはありません...しかし、単純にJMenuItemを使用すると、ツールチップが機能します!

JMenuItem about = new JMenuItem(new AboutAction());
about.setMnemonic('a');
menu.add(about);

AbstractAction を JMenuItem サブクラスで動作させるにはどうすればよいですか?

4

1 に答える 1

3

オーバーライドされたコンストラクターは、引数としてActionをとるJMenuItemコンストラクターを使用せず、setAction()どちらも呼び出しません。したがって、メニュー項目はアクションに関連付けられていません。

コンストラクターを追加するためだけにサブクラスを作成することはありません。単純にファクトリメソッドを作成してみませんか?

public JMenuItem createMenuItemWithListener(String text, 
                                            char mnemonic, 
                                            ActionListener action) {
    JMenuItem result = new JMenuItem(text);
    result.setMnemonic(mnemonic);
    result.addActionListener(action);
    return result;
}

public JMenuItem createMenuItemWithAction(char mnemonic, 
                                          Action action) {
    JMenuItem result = new JMenuItem(action);
    result.setMnemonic(mnemonic);
    return result;
}
于 2012-05-20T06:27:24.227 に答える