0

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

Actions やコンストラクタを扱っているときは、どういうわけか違います。誰かが違いを説明できますか?

4

2 に答える 2

3

JMenuItem を初期化するときに Action を定義していないことが投稿されたようです。したがって、null を渡しているため、アクションはトリガーされません

于 2012-05-30T21:42:50.377 に答える
1

someButtonの前に初期化されるsomeActionため、null を に渡していますJMenuItemsomeButton作成後に初期化someActionすると、すべてがうまくいきます。

于 2012-05-30T21:44:51.913 に答える