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