2015-08-03 70 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有效最終(意味着它只分配一次,永遠不會被重新分配)。

相關問題