簡體   English   中英

JavaFx:從事件處理程序訪問對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM