我有一组 Circle 对象,如果单击它,我需要填充一个圆。如何为此编写事件处理?

I have an array of Circle objects and I need to fill a circle if it is clicked. How do I write the event handling for this?

//making the circles clickable
   circle[i].setOnMouseClicked(new EventHandler<MouseEvent>() { 
       @Override 
       public void handle(MouseEvent e) { 
          
           
         circle[i].setFill(Color.BLUE);
          
       } 
    });  

有什么方法可以更改 i 处的元素而不会出现“在封闭范围中定义的局部变量 i 必须是最终的或实际上是最终的”错误?

复制变量i应该就够了:

// making the circles clickable
final int copyOfI = i;
circle[i].setOnMouseClicked(new EventHandler<MouseEvent>() { 
  @Override 
  public void handle(MouseEvent e) { 
    circle[copyOfI].setFill(Color.BLUE);     
  } 
}); 

但是,由于以后数组可以改变,所以我会复制圆圈:

final Circle c = circle[i];
c.setOnMouseClicked(new EventHandler<MouseEvent>() { 
  @Override 
  public void handle(MouseEvent e) { 
    c.setFill(Color.BLUE);     
  } 
}); 

如果您查看 docs for MouseEvent, you will see that it has a source field that it inherits from EventObject

The object on which the Event initially occurred.

所以你可以像这样直接使用它:

   circle[i].setOnMouseClicked(new EventHandler<MouseEvent>() { 
       @Override 
       public void handle(MouseEvent e) { 
         ((Button)e.source).setFill(Color.BLUE);
       } 
    });  

一点建议:setOnMouseClicked()是一个非常低级的事件。 Java 提供其他更高级别的事件,例如 ActionListener。使用它非常相似。您可以将其与 circle[i].setActionListener() 一起使用并覆盖 actionPerformed() 方法。我建议您阅读更多有关可用的不同侦听器的信息,以便您知道为特定事件选择哪个侦听器。

注意:所有链接都是针对 Java 7 文档的。请务必查看您正在使用的 Java 版本的文档。