【问题标题】:JavaFx: Access an object from Event handlerJavaFx:从事件处理程序访问对象
【发布时间】:2015-08-03 13:08:48
【问题描述】:

我想在 JavaFX 中制作一个包含一个按钮的程序,当单击该按钮时,会创建一个圆圈并将其添加到形状的 ArrayList 中。以下是我的代码:

createCircleBtn.setOnMouseClicked(new EventHandler<MouseEvent>() {
    @Override
        public void handle(MouseEvent event) {
            Circle circle1 = new Circle();
            shapes.add(circle1);
            circle1.setCenterX(event.getX());
            circle1.setCenterY(event.getY());
            circle1.setOnMouseDragged(new EventHandler<MouseEvent>() {
                @Override
                public void handle(MouseEvent event) {
         // doesn't work because "circle1" must be declared final (constant) 
                    circle1.setCenterX(event.getX());
                    // "this" doesn't refer to "circle1"
                    this.setCenterY(event.getY());
                }
            });
            mainPane.getChildren().add(circle1);
        }
    });

我的问题是 - 如何从内部句柄方法访问“circle1”? 在 JavaScript 中,我们使用e.currentTarget

我无法将“circle1”声明为最终版本,因为之后我需要对其进行更改。

【问题讨论】:

  • 你在handle方法和EventHandler范围之外定义你的Circle实例。
  • @BranislavLazic 如果您指的是第二个句柄方法,我的 Circle 实例是在句柄方法之外定义的,我不能在第一个句柄方法之外声明,因为必须在单击按钮后创建圆圈。
  • 不能直接声明为final吗? IE。 final Circle circle1 = new Circle();?
  • "我不能宣布 "circle1" final 因为我需要更改它。" final 并不意味着不可变。它只是意味着你不能重新分配它。
  • 好的,非常感谢。

标签: java javafx eventhandler


【解决方案1】:

您显示的代码中没有任何地方重新分配circle1,因此您可以将其声明为final

createCircleBtn.setOnMouseClicked(new EventHandler<MouseEvent>() {
    @Override
        public void handle(MouseEvent event) {
            final Circle circle1 = new Circle();
            shapes.add(circle1);
            circle1.setCenterX(event.getX());
            circle1.setCenterY(event.getY());
            circle1.setOnMouseDragged(new EventHandler<MouseEvent>() {
                @Override
                public void handle(MouseEvent event) {
                    circle1.setCenterX(event.getX());
                }
            });
            mainPane.getChildren().add(circle1);
        }
    });

请注意,在 Java 8 中,您的代码将按照您的方式编译,因为circle1 实际上是最终的(意味着它只被分配一次并且永远不会重新分配)。

【讨论】:

    【解决方案2】:

    使用event.getSource(),这样可以为多个cicrles编写一个通用的事件处理程序,而不必担心点击了哪个确切的:

    EventHandler<MouseEvent> handler = new EventHandler<>()
    {
        @Override
        public void handle( MouseEvent event )
        {
            if (event.getSource() instanceof Circle) { // to be on safe side, you may 
                                                       // remove this if-statement 
                                                       // if you are sure
                Circle c = event.getSource();
                c.setCenterX( event.getX() );
            }
        }
    };
    
    // use it on multiple circles
    circle1.setOnMouseDragged(handler);
    circle2.setOnMouseDragged(handler);
    ...
    circleN.setOnMouseDragged(handler);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-06
      • 2014-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-02
      • 2011-02-09
      • 1970-01-01
      相关资源
      最近更新 更多