2015-08-03 60 views
1

我想在JavaFX中创建一个包含按钮的程序,点击该按钮后,会创建一个圆并将其添加到形状的ArrayList中。以下是我的代码:JavaFx:从事件处理程序中访问对象

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”最终,因为我需要在之后进行更改。

+0

您可以在'handle'方法和'EventHandler'作用域之外定义'Circle'实例。 –

+0

@BranislavLazic如果你的意思是第二个句柄方法,我的Circle实例被定义在句柄方法的外部,并且我不能在第一个句柄方法之外声明,因为必须在单击该按钮之后创建该圆圈。 – user3870075

+0

难道你不能只声明它是'最后的'吗?即'final Circle circle1 = new Circle();'? –

回答

0

使用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); 
2

无处在你展示你重新分配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有效最终(意味着它只分配一次,永远不会被重新分配)。

相关问题