几个对象上的JavaFX Eventhandler

时间:2014-10-22 23:12:15

标签: java event-handling javafx

我做了一个带有包含矩形的网格面板的JavaFX应用程序:

private GridPane addGridPane() {

    GridPane grid = new GridPane();
    grid.setHgap(2);
    grid.setVgap(2);
    grid.setPadding(new Insets(0, 0, 10, 0));

    int rows = 5;
    int cols = 5;

    for(int i=1; i<=rows; i++) {
        for(int j=1; j<=cols; j++) {
            r = new Rectangle(70, 70, Color.AQUA);
            grid.add(r, j, i);
        }
    } 
    return grid;
}

现在,我希望在矩形上单击鼠标时,将矩形填充为红色。为此,我试着把它放到第二个for循环中:

r = new Rectangle(70, 70, Color.AQUA);
r.setOnMouseClicked(new EventHandler<MouseEvent>()
  {
      @Override
      public void handle(MouseEvent t) {
        r.setFill(Color.RED);
      }
  });
grid.add(r, j, i);

似乎每个Rectangle都有它的EventHandler,但只有最后一个Rectangle被填充为红色。事件目标有问题吗?

2 个答案:

答案 0 :(得分:0)

这对我来说是预期的(注意局部变量r):

   for(int i=1; i<=rows; i++) {
            for(int j=1; j<=cols; j++) {
                Rectangle r = new Rectangle(70, 70, Color.AQUA);
                r.setOnMouseClicked(new EventHandler<MouseEvent>()
                {
                    @Override
                    public void handle(MouseEvent t) {
                        r.setFill(Color.RED);
                    }
                });
                grid.add(r, j, i);
            }
        }

答案 1 :(得分:0)

问题是r是某个封闭对象的字段。所有处理程序都引用该字段,而不是它们所附加的矩形。在for循环之后,字段r保存最后一个矩形,这就是为什么只有最后一个矩形被填充为红色。

解决方案是将r声明为for循环中的局部变量:

for(int i=1; i<=rows; i++) {
    for(int j=1; j<=cols; j++) {
        Rectangle r = new Rectangle(70, 70, Color.AQUA);
        r.setOnMouseClicked(new EventHandler<MouseEvent>()
          {
              @Override
              public void handle(MouseEvent t) {
                r.setFill(Color.RED);
              }
          });
        grid.add(r, j, i);
    }
}