JMenuBar абстрактная фабрика кнопок не добавляет кнопки
Я написал класс, который должен создавать абстрактные пункты меню, используя фабричный метод, но компоненты никогда не отображаются в строке меню. Я прошел через отладчик, и свойства, такие как текст, не были установлены. Я попытался аннулировать компонент без удачи.
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);
}
});
}
}
Добавление компонентов вручную работает нормально, но в моей ситуации это нежелательно.
public GameMenu() {
super();
file = new JMenu("File");
file.setMnemonic(KeyEvent.VK_F);
this.add(file);
}
1 ответ
Решение
Проблема, вероятно, потому что вы устанавливаете null
действия и тем самым сбрасывая текст и мнемонику на кнопках, которые создаются в createButton()
, Закомментируйте следующую строку:
button.setAction(action);
И вы должны увидеть меню ОК.
Посмотрите, Как Использовать Действия для некоторых примеров того, как определить и работать с действиями.