向听众添加信息

时间:2014-01-11 09:56:44

标签: java javafx listener visibility

我的问题可能听起来有点奇怪,因为我不确定我是否能以一种简单的方式描述我的问题 - 但是我们走了:

我向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。:如果你想要你可以纠正我的句子 - 这将有助于我提高我的英语^^

3 个答案:

答案 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传递不同的值。通常,您只想获得正在迭代的整数的当前值(在您的情况下,ij),因此您只需声明您的“参数”如下:{{1你已经完成了。

这很简单!

答案 2 :(得分:0)

您似乎为整个“行集合”添加了一个侦听器(包装为路径)。因此,监听器本身不知道用户点击了哪一行。

但是,您可以使用getScreenX的{​​{1}}和getScreenY来获取用户点击的坐标,并以编程方式将它们与线条的坐标进行比较,以找出用户的哪一行点击了。