JMenuItem
次のコンストラクターがあります: (ソース: GrepCode )
public JMenuItem(Action a) {
this();
setAction(a);
}
ただし、私のコードが
import javax.swing.*;
import java.awt.event.ActionEvent;
public class ActionTest extends JApplet {
private final JFrame frame = new JFrame("Title");
private final JMenuBar menuBar = new JMenuBar();
private final JMenu fileMenu = new JMenu("File");
protected Action someAction;
private JMenuItem someButton = new JMenuItem(someAction);
public ActionTest() {}
@Override
public final void init() {
frame.setJMenuBar(menuBar);
menuBar.add(fileMenu);
fileMenu.add(someButton);
someButton.setText("Button");
someAction = new AbstractAction("Title") {
public void actionPerformed(ActionEvent event) {
//do stuff
}
};
frame.setVisible(true);
}
public static void main(String[] args) {
JApplet applet = new ActionTest();
applet.init();
}
}
を押してJMenuItem
、actionPerformed() も呼び出されません。
これはバグですか、それとも私のアプローチは完全に間違っていますか?
さらに調査を行った結果、これが最終的に突き詰める方法であることがわかりました。これは、コンストラクターで指定したのと同じメモリブロックを単に指す必要がある浅いコピーを実装しているようです。
ファイルメニューをメニューバーに追加すると、同じことが発生するはずです。ファイル メニューが追加されると、メモリ ブロックが参照されます。そのメモリブロック内にあるものは何でも表示されます。次に、メニュー項目を追加すると、 に表示されますJMenu
。
Action
s やコンストラクタを扱っているときは、どういうわけか違います。誰かが違いを説明できますか?