Java 组合多个ActionListener
如何将ActionListeners实现到执行不同任务的多个按钮?我需要他们访问这个类中的卡片,所以我尝试在Filled Frame类中创建一个类,如下所示: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
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
}
});
很好的解决方案,我认为它更具可读性。我要感谢你在我的答案上指出了那个错误,我不知道你为什么要删除它。再见!因为你修正了:)很好的解决方案,我认为它更可读。我要感谢你在我的答案上指出了那个错误,我不知道你为什么要删除它。再见!因为你修好了:)