Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 组合多个ActionListener_Java_Actionlistener - Fatal编程技术网

Java 组合多个ActionListener

Java 组合多个ActionListener,java,actionlistener,Java,Actionlistener,如何将ActionListeners实现到执行不同任务的多个按钮?我需要他们访问这个类中的卡片,所以我尝试在Filled Frame类中创建一个类,如下所示: JButton player1Move7 = new JButton("Player 1: Move 7's"); player1Move7.addActionListener( new ActionListener() { @Override public void actionPerformed( ActionEve

如何将ActionListeners实现到执行不同任务的多个按钮?我需要他们访问这个类中的卡片,所以我尝试在Filled Frame类中创建一个类,如下所示:

JButton player1Move7 = new JButton("Player 1: Move 7's");

player1Move7.addActionListener( new ActionListener() {
    @Override
    public void actionPerformed( ActionEvent e ) {
        // Player1Move7 Action
    }
});

JButton player1Move8 = new JButton("Player 1: Move 8's");

player1Move8.addActionListener( new ActionListener() { 
    @Override
    public void actionPerformed( ActionEvent e ) {
        // Player1Move8 Action
    }
});
类ClickListener实现ActionListener{

public void actionPerformed(ActionEvent event)  {
  label.setText("Red 7");
}
}

然而,在每个JButton上实现这一点意味着我必须在我的原始类中创建6个新类来执行更多任务(当我添加更多按钮时可能会更多)。是否有一种方法可以只在原始类中创建一个类,并改变ActionListener的响应方式,以便它可以用于所有按钮

导入javax.swing.*

公共类FilledFrame扩展了JFrame{

static int FRAME_WIDTH = 500;
static int FRAME_HEIGHT = 100;

public FilledFrame () {
    createComponents();
    createCards();
    setSize(FRAME_WIDTH, FRAME_HEIGHT);
}

private void createComponents() {

    JButton Player1Move7 = new JButton("Player 1: Move 7's");
    JButton Player1Move8 = new JButton("Player 1: Move 8's");
    JButton Player1Move9 = new JButton("Player 1: Move 9's");
    JButton Player2Move7 = new JButton("Player 2: Move 7's");
    JButton Player2Move8 = new JButton("Player 2: Move 8's");
    JButton Player2Move9 = new JButton("Player 2: Move 9's");

    JPanel panel = new JPanel();

    panel.add(Player1Move7);
    panel.add(Player1Move8);
    panel.add(Player1Move9);
    panel.add(Player2Move7);
    panel.add(Player2Move8);
    panel.add(Player2Move9);

    add(panel);
}

private void createCards() {
    ...
}

public static void main (String args[]) {

    FilledFrame frame = new FilledFrame();
    frame.setVisible(true);

}

}

您可以动态覆盖
actionListener
,以避免创建类,如下所示:

JButton player1Move7 = new JButton("Player 1: Move 7's");

player1Move7.addActionListener( new ActionListener() {
    @Override
    public void actionPerformed( ActionEvent e ) {
        // Player1Move7 Action
    }
});

JButton player1Move8 = new JButton("Player 1: Move 8's");

player1Move8.addActionListener( new ActionListener() { 
    @Override
    public void actionPerformed( ActionEvent e ) {
        // Player1Move8 Action
    }
});

注意:按钮名称应以小写开头,根据

的规定,您可以动态覆盖
actionListener
,以避免创建类,如下所示:

JButton player1Move7 = new JButton("Player 1: Move 7's");

player1Move7.addActionListener( new ActionListener() {
    @Override
    public void actionPerformed( ActionEvent e ) {
        // Player1Move7 Action
    }
});

JButton player1Move8 = new JButton("Player 1: Move 8's");

player1Move8.addActionListener( new ActionListener() { 
    @Override
    public void actionPerformed( ActionEvent e ) {
        // Player1Move8 Action
    }
});
注意:根据

然而,在每个JButton上实现这一点意味着我必须在原始类中创建6个新类来执行更多任务

为什么你认为你需要一个完整的类,而你只需要实现一个接口

public class FilledFrame extends JFrame implements ActionListener {

    JButton player1Move7, player1Move8;

    private void createComponents() {
        // Same listener for all buttons
        player1Move7 = new JButton("Player 1: Move 7's");
        player1Move7.addActionListener(this);

        player1Move8 = new JButton("Player 1: Move 8's");
        player1Move8.addActionListener(this);
        ...
    }

    @Override
    public void actionPerformed(ActionEvent event)  {
        // Check which button
        if (e.getSource() == player1Move7) {
            label.setText("Red 7");
        } else if (e.getSource() == player1Move8) {
            ...
        } else { }
    }
}
即使这不是一个选项,也只需要一个类就可以在单击时更改标签

class ClickListener implements ActionListener {

    JLabel label;
    String text;

    public ClickListener(JLabel label, String text) {
        this.label = label; 
        this.text = text;
    }

    @Override
    public void actionPerformed(ActionEvent event)  {
        this.label.setText(this.text);
    }
}
再加上

button.addActionListener(new ClickListener(label, "Red 7")); 
然而,在每个JButton上实现这一点意味着我必须在原始类中创建6个新类来执行更多任务

为什么你认为你需要一个完整的类,而你只需要实现一个接口

public class FilledFrame extends JFrame implements ActionListener {

    JButton player1Move7, player1Move8;

    private void createComponents() {
        // Same listener for all buttons
        player1Move7 = new JButton("Player 1: Move 7's");
        player1Move7.addActionListener(this);

        player1Move8 = new JButton("Player 1: Move 8's");
        player1Move8.addActionListener(this);
        ...
    }

    @Override
    public void actionPerformed(ActionEvent event)  {
        // Check which button
        if (e.getSource() == player1Move7) {
            label.setText("Red 7");
        } else if (e.getSource() == player1Move8) {
            ...
        } else { }
    }
}
即使这不是一个选项,也只需要一个类就可以在单击时更改标签

class ClickListener implements ActionListener {

    JLabel label;
    String text;

    public ClickListener(JLabel label, String text) {
        this.label = label; 
        this.text = text;
    }

    @Override
    public void actionPerformed(ActionEvent event)  {
        this.label.setText(this.text);
    }
}
再加上

button.addActionListener(new ClickListener(label, "Red 7")); 

如果您使用Java8,thrasher的建议可以通过lambdas更简洁地实现:

JButton player1Move7 = new JButton().addActionListener(e ->{
            // Player1Move7 Action
        }
    });

JButton player1Move8 = new JButton().addActionListener(e ->{
            // Player1Move8 Action
        }
    });

如果您使用Java8,thrasher的建议可以通过lambdas更简洁地实现:

JButton player1Move7 = new JButton().addActionListener(e ->{
            // Player1Move7 Action
        }
    });

JButton player1Move8 = new JButton().addActionListener(e ->{
            // Player1Move8 Action
        }
    });

很好的解决方案,我认为它更具可读性。我要感谢你在我的答案上指出了那个错误,我不知道你为什么要删除它。再见!因为你修正了:)很好的解决方案,我认为它更可读。我要感谢你在我的答案上指出了那个错误,我不知道你为什么要删除它。再见!因为你修好了:)