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);

И вы должны увидеть меню ОК.

введите описание изображения здесь

Посмотрите, Как Использовать Действия для некоторых примеров того, как определить и работать с действиями.

Другие вопросы по тегам