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

时间:2011-11-17 13:58:25

标签: java swing jbutton event-listener

我有一个JButtons的2D数组

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中吗?

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

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

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);
    }
  });
}

答案 2 :(得分:2)

您可以设置JButton对象的“name”属性,根据mre的回答,您可以调用getSource()方法。所以你可以识别单击按钮

答案 3 :(得分:0)

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

然后当你循环循环中的按钮时,你可以说 ledBtns[i][j].addActionListener(this)

当然,您必须弄清楚哪个对象是事件的来源(通常使用if...else块)。现在,对于64个对象来说可能会变得难以处理,但对于较少的项目,它通常不是问题。

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

我建议的只是另一种选择。我会为你的代码做最有意义的事情,并且是最干净,最易读的。