繁体   English   中英

多个JButton,Java中的一个事件监听器

[英]Multiple JButtons, one Eventlistener in Java

我有一个2D的JButton数组

JButton[][] ledBtns = new JButton[8][8];

然后循环执行所有初始化工作。 现在,我想向每个JButton添加一个EventListener,当单击Button os时将触发该事件。 然后,我想更改按钮上的图像。

for(int i = 0; i < ledBtns.length; i++){
  for(int j = 0; j < ledBtns[i].length; j++){
     //init stuff
     ledBtns[i][j].addActionListener(new ActionListener() {
       public void actionPerformed(ActionEvent evt) {
       changeImage();
  }
});
  }
}

现在将调用'changeImage()',但我需要知道调用它的按钮。 我不能使用参数,如果这样做会告诉我将它们声明为“ final”。 除了编写完全相同的64个方法并将它们手动添加到每个JButton中之外,还有其他方法吗?

ActionEvent类具有用于获取生成事件的组件的getSource()方法。

最简单的方法是声明两个临时的final整数,然后引用它们。

for(int i = 0; i < ledBtns.length; i++){
  for(int j = 0; j < ledBtns[i].length; j++){
    //init stuff
    final int finalI = i;
    final int finalJ = j;
    ledBtns[i][j].addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
      changeImage(finalI,finalJ);
    }
  });
}

您可以设置JButton对象的“名称”属性,并根据mre的回答,可以调用getSource()方法。 这样您就可以点击身份确认按钮

另一个选择是让您的类实现ActionListner(即, implements ActionListner )。

然后,当您循环浏览按钮时,您可以说ledBtns[i][j].addActionListener(this)

当然,那么您必须找出事件的源是哪个对象(通常使用if...else块)。 现在,这对于64个对象可能变得笨拙,但是对于较小的项目,通常不是问题。

或者,您可以让actionPerformed方法调用更改图像并传递按钮对象,等等来完成您的工作。

我建议的只是另一种选择。 我会做最适合您的代码,并且最干净,最易读的代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM