我刚刚开始使用Java Swing,但遇到了问题。 我试图做一个简单的menuBar和menuItem'Exit',但是在将按钮链接到动作之前,菜单项出现了,现在我已经将按钮链接到System.exit(0)动作,它消失了。救命? 代码如下:
在 MainPanel 中(不包括来自swing的自动生成的代码):
public void init() {
initComponents();
initActions();
setLocationRelativeTo(null);
pack();
setVisible(true);
}
private void initActions() {
this.menuItemExit.setAction(Application.getInstance().getPanelControl().getActionExit());
}
在 PanelControl 中:
public class PanelControl {
private Action actionExit;
public Action getActionExit() {
return actionExit;
}
public class ActionExit extends AbstractAction{
public ActionExit(){
putValue(Action.NAME, "Exit");
putValue(Action.SHORT_DESCRIPTION, "Exit from the application");
putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("ctrl e"));
putValue(Action.MNEMONIC_KEY, KeyEvent.VK_E);
}
@Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
}
在应用中:
private void init() {
viewMainPanel = new MainPanel();
controlPanel = new ControlPanel();
viewMainPanel.init();
}
我认为问题出在这里,但我不知道在哪里。有什么帮助吗? (还有其他代码,但我只把最相关的部分,我也翻译了意大利语的代码,所以对不起,如果有任何问题或几个名称不匹配)
答案 0 :(得分:0)
private Action actionExit;
public Action getActionExit() {
return actionExit;
}
您的actionExit
变量为空。
您在代码中的任何地方都没有创建ActionExit
类的实例。
您需要的地方:
actionExit = new ActionExit();
您的设计似乎有点复杂,我不知道为什么您只有一个面板才能创建ActionExit类的实例。
我建议您仅在主类中创建ActionExit实例,并摆脱PanelControl类。
您应该考虑学习如何自己编写代码,而不是使用IDE来生成令人困惑的代码,以便更好地构造类。阅读有关How to Use Menus的Swing教程中的部分,以获取入门的实用示例。
答案 1 :(得分:0)
必须将菜单项添加到本机Java Swing组件。您必须将其添加到JFrame。您不能将MenuItem添加到面板中。任何Java Swing应用程序中的Parent“根”容器是“ native”和JFrame。使用您选择的外观,将容器中的所有其他内容“绘制”到矩形中。
然后,使用TAbstractAction项目创建一个MenuItem。该对象可用于创建JButton,JMenuItem或ToolBar按钮。在您的代码中保留对TAbstractAction的引用,您可以启用/禁用该对象,并实现“可观察”的模式,在该模式中,它将启用/禁用您用来与其构建的所有UI控件。我实际上写了一个Java Swing框架来执行Java应用程序。它曾经在Sun Open Source网站上。如果您愿意,我可以将它放在GitLab上供您使用。 Java Swing很不错,但JavaFX应该是JVM上UI的长期目标。
在JFrame对象中,您需要执行以下操作:
_menuBar = new JMenuBar();
// add controls to the frame
setJMenuBar(_menuBar);
然后,您需要将'exitMenuItem'添加到_MenuBar控件中。 干杯