Java JMenuBar抽象按钮工厂不添加按钮
我已经编写了一个类,该类应该使用工厂方法创建抽象菜单项,但这些组件从未显示在菜单栏中。我已经通过了调试器,但没有设置文本等属性。我尝试过使组件失效,但没有成功Java JMenuBar抽象按钮工厂不添加按钮,java,swing,generics,abstract-class,jmenubar,Java,Swing,Generics,Abstract Class,Jmenubar,我已经编写了一个类,该类应该使用工厂方法创建抽象菜单项,但这些组件从未显示在菜单栏中。我已经通过了调试器,但没有设置文本等属性。我尝试过使组件失效,但没有成功 import java.awt.event.KeyEvent; import javax.swing.*; public class GameMenu extends JMenuBar { private static final long serialVersionUID = -8058207339633024354L;
import java.awt.event.KeyEvent;
import javax.swing.*;
public class GameMenu extends JMenuBar {
private static final long serialVersionUID = -8058207339633024354L;
private JMenu file;
private JMenu help;
private JMenuItem newGame;
private JMenuItem about;
private static NewGameAction newGameAction = new NewGameAction();
private static AboutAction aboutAction = new AboutAction();
public GameMenu() {
super();
file = (JMenu) createButton(JMenu.class, "File",
KeyEvent.VK_F, this, null);
help = (JMenu) createButton(JMenu.class, "Help",
KeyEvent.VK_H, this, null);
newGame = (JMenuItem) createButton(JMenuItem.class, "New Game",
KeyEvent.VK_N, file, newGameAction);
about = (JMenuItem) createButton(JMenuItem.class, "About",
KeyEvent.VK_A, help, aboutAction);
}
@SuppressWarnings("unchecked")
public <T extends AbstractButton> AbstractButton createButton(
Class<T> buttonClazz, String text, int mnemonic, JComponent parent,
Action action) {
AbstractButton button = null;
try {
button = buttonClazz.newInstance();
button.setText(text);
button.setMnemonic(mnemonic);
button.setAction(action);
button.invalidate();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return (T) parent.add(button);
}
private static class AboutAction extends AbstractAction {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("About");
}
}
private static class NewGameAction extends AbstractAction {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("New Game");
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame f = new JFrame("Abstract Menu Test");
GameMenu menu = new GameMenu();
f.setJMenuBar(menu);
f.setSize(300, 200);
f.setLocationRelativeTo(null);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
});
}
}
问题可能是因为您正在设置
null
操作,从而重置在createButton()
中创建的按钮上的文本和助记符。注释掉以下行:
button.setAction(action);
你应该会看到菜单OK
有关如何定义和使用动作的一些示例,请参见 我知道了,谢谢你。我只是将
setAction()
行移到newInstance()之后。这样,设置文本和助记符可以覆盖操作属性。如果您愿意,您可以更改您的答案。@polywhill先生,不客气!是的,这也解决了眼前的问题:)但是为什么要覆盖操作参数,为什么要设置null操作呢?null
是占位符,我后来添加了操作。我只是在类内部创建了一个私有静态NewGameAction扩展了AbstractAction{}
。我为JMenuItem
按钮添加了操作,这样它们就不是全部null
。
button.setAction(action);