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 时还没有定义您的操作。因此,因为您传入 null,所以不会触发任何操作

于 2012-05-30T21:42:50.377 回答
1

someButton is initialized before someAction, so you are passing null to the JMenuItem. Initialize someButton after you have created someAction and everything will go fine.

于 2012-05-30T21:44:51.913 回答