[英]JavaFx: Access an object from Event handler
我想用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”為最終版本,因為之后需要進行更改。
您所顯示的代碼中沒有地方重新分配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
是最終的 (意味着它僅被分配一次,並且永遠不會被重新分配)。
使用event.getSource() ,這樣可以為多個cicl編寫公共事件處理程序,而不必擔心單擊了哪個確切的事件:
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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.