JMenuItem构造函数不接受操作

时间:2012-05-30 21:41:20

标签: java swing jmenuitem

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()。

这是一个错误,还是我的方法完全错了?

经过更多的研究,我发现this是最终归结为的方法。它似乎实现了一个浅拷贝,should simply point to the same memory block that I gave it in the constructor

当我将文件菜单添加到菜单栏时,应该发生同样的事情。添加文件菜单时,它会引用内存块。内存块中的内容是显示的内容。然后,我添加了菜单项,它出现在JMenu中。

当我处理Action或构造函数时,它会有所不同。有人可以解释一下这个区别吗?

2 个答案:

答案 0 :(得分:3)

从您发布的内容看,您在初始化JMenuItem时尚未定义Action。因此,因为您传入的是null,所以没有触发任何操作

答案 1 :(得分:1)

someButtonsomeAction之前初始化,因此您将null传递给JMenuItem。 someButton之后初始化someAction,一切都会顺利。