我有以下类:一个JPanel扩展,一个接口和3个JmenuItem类。

public class RedFrame extends javax.swing.JFrame implements ActionListener {
private JMenuBar jMenuBar1;
private JPanel jPanel1;
private fileExitCommand jMenuItem3;
private fileOpenCommand jMenuItem2;
private btnRedCommand jMenuItem1;
private JMenu jMenu1;

/**
 * Auto-generated main method to display this JFrame
 */
public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            RedFrame inst = new RedFrame();
            inst.setLocationRelativeTo(null);
            inst.setVisible(true);
        }
    });
}

public RedFrame() {
    super();
    initGUI();
}

private void initGUI() {
    try {
        setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        {
            jPanel1 = new JPanel();
            getContentPane().add(jPanel1, BorderLayout.CENTER);
        }
        {
            jMenuBar1 = new JMenuBar();
            setJMenuBar(jMenuBar1);
            {
                jMenu1 = new JMenu();
                jMenuBar1.add(jMenu1);
                jMenu1.setText("Meniu");
                {
                    jMenuItem1 = new btnRedCommand(jPanel1, "RED");
                    jMenu1.add(jMenuItem1);

                }
                {
                    jMenuItem2 = new fileOpenCommand("Open");
                    jMenu1.add(jMenuItem2);

                }
                {
                    jMenuItem3 = new fileExitCommand("Exit");
                    jMenu1.add(jMenuItem3);

                }
            }
        }
        jMenuItem1.addActionListener(this);
        jMenuItem2.addActionListener(this);
        jMenuItem3.addActionListener(this);
        pack();
        setSize(300 * 16 / 9, 300);
    } catch (Exception e) {
        // add your error handling code here
        e.printStackTrace();
    }
}

@Override
public void actionPerformed(ActionEvent event) {
     Execute();

}

 }




public class btnRedCommand extends JMenuItem implements Command {

protected JPanel p;
protected String text;

public btnRedCommand(JPanel p, String text) {

    p.setBackground(Color.cyan);
    this.setText(text);
}

public void Execute() {
    // TODO Auto-generated method stub
    p.setBackground(Color.red);
}

}




public interface Command  {

public void Execute();

}


我希望根据从Menu中选择哪个jMenuItem来调用3个JMenuItems中实现的Execute方法。我该怎么做呢?我是否需要3个jMenuItems的包装器类?

最佳答案

对于这些简单的GUI任务,此模式在这里是过大的,但是在您的ActionListener中,您可以执行以下操作:

Command command = (Command) event.getSource();
command.Execute();


说明:由于每个自定义JMenuItem都实现了Command接口,因此可以将它们这样强制转换,从而可以使用Execute方法。

出现NullPoinerException的原因是JPanel实例未在Command构造函数中分配:

public btnRedCommand(JPanel p, String text) {
   this.p = p;
   ...

关于java - 命令设计模式简单GUI空指针,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13102692/

10-12 20:36