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 或构造函数时,它会有所不同。有人可以解释其中的区别吗?