【问题标题】:Add informations to listeners向侦听器添加信息
【发布时间】:2014-01-30 09:42:42
【问题描述】:

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

我在 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");
            }
        }
    }

希望你能帮助我!

制造 巴克斯熊

ps.:如果你愿意,你可以纠正我的句子——它会帮助我提高我的英语^^

【问题讨论】:

    标签: java javafx listener visibility


    【解决方案1】:

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

    但是,您可以使用 getScreenX 和 getScreenY 或 MouseEvent 来获取用户单击的坐标,并以编程方式将它们与线的坐标进行比较,以找出用户单击的线。

    【讨论】:

      【解决方案2】:

      您可以做两件事。
      第一个是使用您在事件发生时收到的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();
              }
      
          });
      

      由于您可以在for 循环中的每次迭代中声明一个新的final int arg,因此您可以将不同的值传递给每个Listener。通常,您只想拥有正在迭代的整数的当前值(在您的情况下,i 或 j),因此您只需按如下方式声明您的“参数”:final int arg = i;完成。

      就是这么简单!

      【讨论】:

      • 嗯看到了鲁珀特的回答,我想我会这样做,但无论如何感谢您的帮助
      • 没问题 :) 编码愉快!
      【解决方案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();
          }
      });
      

      在当前情况下,您还可以将“路径”变量设为 final 并直接在侦听器中使用它:

      final Path path = new Path();
      
      //...
      
      path.setOnMouseClicked(new EventHandler<MouseEvent>() {
      
          @Override
          public void handle(MouseEvent t) {
              path.setStroke(Color.RED);
              path.getStrokeDashArray().clear();
          }
      });
      

      如果有效,请告诉我。

      【讨论】:

      • 是的,它有效,我真的很喜欢用这种方式来解决我的问题,谢谢!
      • 不客气 :) 当您不想将 EventHandler 实现为匿名内部类时,使用 t.getSource() 很有用。我倾向于尽可能地精简循环中的代码。
      猜你喜欢
      • 2010-11-26
      • 2014-02-08
      • 2017-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多