首页 文章

JavaFx处理从节点或主的FXML控制器拖动节点?

提问于
浏览
0

我试图拖动一些自定义节点 . 这些节点作为子节点添加到AnchorPane,如根FXML的Controller中所定义:

package sample;

import ...

public class Controller {
    @FXML
    AnchorPane anchorPane;

    public void add() {
        try {
            // Node.fxml is the custom node object
            Parent root = FXMLLoader.load(getClass().getResource("Node.fxml"));
            anchorPane.getChildren().add(root);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

我应该在根FXML控制器内还是在可拖动节点本身的FXML控制器内处理节点拖动?

如果我应该在根FXML控制器中完成它,我该怎么做?调用FXMLLoader.Load()只引用一个FXML文件,所以我不能将鼠标事件附加到它 .

我是Java和JavaFx的新手,所以一切都很有帮助 . (然而,不是编程的初学者) .

提前致谢 .

1 回答

  • 0

    感谢@fabian和@Gikkman,我找到了解决问题的方法 . 我的错误是没有理解Parent扩展Node - 我以为我需要引用其他东西 .

    为了实现我想要的拖动功能,我创建了一个具有Node输入变量的函数(感谢@Gikkman) - 然后这个Node对象可以附加事件处理程序 . 由于Parent扩展了Node(我没有意识到),我可以很容易地使用FXMLLoader.Load()作为输入 .

    所以我有:

    package sample;
    
    import ...
    
    import java.io.IOException;
    
    public class Controller {
        @FXML
        AnchorPane anchorPane;
    
        public void add() {
            try {
                // Node.fxml is the custom node object
                Parent root = FXMLLoader.load(getClass().getResource("Node.fxml"));
                // Sets the EventHandlers for dragging
                dragNode(root);
                // Adds the node to the scene
                anchorPane.getChildren().add(root);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        // Handles all dragging EventHandlers for any node object
        public void dragNode(Node node) {
            // Custom object to hold x and y positions
            final Delta dragDelta = new Delta();
    
            node.setOnMousePressed(new EventHandler<MouseEvent>() {
                @Override
                public void handle(MouseEvent mouseEvent) {
                    dragDelta.x = node.getLayoutX() - mouseEvent.getSceneX();
                    dragDelta.y = node.getLayoutY() - mouseEvent.getSceneY();
                }
            });
    
            node.setOnMouseReleased(new EventHandler<MouseEvent>() {
                @Override
                public void handle(MouseEvent mouseEvent) {
                    node.setCursor(Cursor.HAND);
                }
            });
    
            node.setOnMouseDragged(new EventHandler<MouseEvent>() {
                @Override
                public void handle(MouseEvent mouseEvent) {
                    node.setLayoutX(mouseEvent.getSceneX() + dragDelta.x);
                    node.setLayoutY(mouseEvent.getSceneY() + dragDelta.y);
                }
            });
    
            node.setOnMouseEntered(new EventHandler<MouseEvent>() {
                @Override
                public void handle(MouseEvent event) {
                    node.setCursor(Cursor.HAND);
                }
            });
        }
    
        class Delta { double x, y; }
    }
    

相关问题