我做了一个带有包含矩形的网格面板的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被填充为红色。事件目标有问题吗?
答案 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);
}
}