我的问题可能听起来有点奇怪,因为我不确定我是否能以一种简单的方式描述我的问题 - 但是我们走了:
我向JavaFx-Object添加了很多行并向每一行添加了一个监听器 - 现在用户将点击其中一行并且我不知道他点击了哪一行。有没有办法向听众添加信息?
public void addConnections(ICityLinker a[][]) {
int x1, y1, x2, y2;
for (int i = 0; i < a.length; i++) {
for (int j = i; j < a[i].length; j++) {
if (!(a[i][j] == null)) {
Path path = new Path();
x1 = map.getCountry(intToCity(i)).getX() + 5;
y1 = map.getCountry(intToCity(i)).getY() + 5;
MoveTo moveTo = new MoveTo();
moveTo.setX(x1);
moveTo.setY(y1);
x2 = map.getCountry(intToCity(j)).getX() + 5;
y2 = map.getCountry(intToCity(j)).getY() + 5;
LineTo lineTo = new LineTo();
lineTo.setX(x2);
lineTo.setY(y2);
path.getElements().add(moveTo);
path.getElements().add(lineTo);
path.setStrokeWidth(2);
path.setStroke(Color.BLACK);
paths.add(path);
path.getStrokeDashArray().addAll(5.0, 5.0);
path.setOnMouseClicked(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent t) {
//instead of 4 it would be helpful to have the list-position (paths is my list)
paths.get(4).setStroke(Color.RED);
paths.get(4).getStrokeDashArray().clear();
}
});
Label label = new Label();
label.setFont(Font.font(label.getFont().getFamily(), 8));
label.setText("" + a[i][j].getList().getFirst().getLength()
+ " " + a[i][j].getList().getFirst().getColor());
label.relocate((x1 + x2) / 2, (y1 + y2) / 2);
label.idProperty().set("trackName");
field.getChildren().addAll(path, label);
System.out.println("linie");
}
}
}
希望你能帮助我!
MFG baxbear
ps。:如果你想要你可以纠正我的句子 - 这将有助于我提高我的英语^^
答案 0 :(得分:3)
您是否尝试过请求活动来源? t.getSource()应返回已收到鼠标事件的路径实例。但是我还没有测试它,所以没有保证。
path.setOnMouseClicked(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent t) {
Path p = (Path)t.getSource()
p.setStroke(Color.RED);
p.getStrokeDashArray().clear();
}
});
在当前情况下,您还可以将“path”变量设为final并直接在侦听器中使用它:
final Path path = new Path();
//...
path.setOnMouseClicked(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent t) {
path.setStroke(Color.RED);
path.getStrokeDashArray().clear();
}
});
如果有效,请告诉我。
答案 1 :(得分:1)
你可以做两件事
第一个是使用事件发生时收到的MouseEvent
所持有的数据:通常,您可以在屏幕上获取鼠标的位置并尝试将其追溯到您感兴趣的行。但可能有一种更简单的方法:
实际上,您可以使用final
的任何变量。随着Java8将出现最终的最终的概念,你不必太在意它 - 但这不是你现在的问题:)
所以,基本上,您可以做的是声明一些final int
并在创建EventHandler
之前将其初始化为您感兴趣的值:
final int arg = 4;
path.setOnMouseClicked(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent t) {
paths.get(arg).setStroke(Color.RED);
paths.get(arg).getStrokeDashArray().clear();
}
});
由于您可以在final int arg
循环中的每次迭代中声明新的for
,因此可以为每个Listener
传递不同的值。通常,您只想获得正在迭代的整数的当前值(在您的情况下,i
或j
),因此您只需声明您的“参数”如下:{{1你已经完成了。
这很简单!
答案 2 :(得分:0)
您似乎为整个“行集合”添加了一个侦听器(包装为路径)。因此,监听器本身不知道用户点击了哪一行。
但是,您可以使用getScreenX
的{{1}}和getScreenY
来获取用户点击的坐标,并以编程方式将它们与线条的坐标进行比较,以找出用户的哪一行点击了。