我有以下类:一个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/