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
或构造函数时,它会有所不同。有人可以解释一下这个区别吗?
答案 0 :(得分:3)
从您发布的内容看,您在初始化JMenuItem时尚未定义Action。因此,因为您传入的是null,所以没有触发任何操作
答案 1 :(得分:1)
someButton
在someAction
之前初始化,因此您将null传递给JMenuItem
。
someAction
,一切都会顺利。