当前位置: 首页 > 知识库问答 >
问题:

从node或Main的FXML控制器拖动节点的JavaFx句柄?

龚盛
2023-03-14
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();
        }
    }
}

我对Java和JavaFx很陌生,所以任何东西都有帮助。(不过不是编程的初学者)。

提前道谢。

共有1个答案

尚声
2023-03-14

多亏了“费边”和“吉克曼”,我找到了解决问题的办法。我的错误是不理解Parent extends Node--我假设我需要引用其他东西。

为了实现我想要的拖动功能,我创建了一个函数,它有一个节点输入变量(谢谢@gikkman),然后这个节点对象可以附加事件处理程序。由于Parent extends 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; }
}
 类似资料:
  • 问题内容: 我试图在JavaFX中获得TableView来动态显示内容。 当我运行程序时,出现此错误: 我的控制器名为“ UserInterfaceController.java”,它与FXML文件位于同一软件包下,我也已将该软件包导入了FXML中。为什么找不到控制器? FXML文件: 控制器: 主类: 问题答案: 使用FXML的全限定名来引用您的控制器: 后续问题的答案 对以下问题的回答解释了为

  • 我试图在JavaFX中获得一个TableView来动态显示内容。 当我运行程序时,出现以下错误: 我的控制器名为“UserInterfaceController.java”,它与FXML文件在同一个包下,我也在FXML中导入了包。为什么找不到控制器? FXML文件: 控制器: 主要类:

  • 在JavaFX中,我试图通过单击并拖动节点来移动它。如果节点不旋转,它工作得很好,但是当我旋转它时,它开始表现得很奇怪。 在45°左右,当我移动它时,它开始抖动,在60°时,它剧烈地来回抖动。在90°时,只要我开始移动节点,它就会飞离屏幕。 下面是我用来旋转和移动节点的代码。它来自连接到节点的鼠标侦听器。 编辑:这是一些示例输出,以及显示不同节点的图片。 未旋转且缓慢向左移动时的输出: 旋转时缓慢

  • 我已经用FXML创建了一个布局,它由一个带有sideMenu的BorderPane和一个用于其他内容的innerBorderPane组成... 但是,由于我刚刚开始使用JavaFX中的FXML,所以我只需要知道如何做下一件事... custom.FXML(这是主要的FXML布局) sideMenu.FXML(这是sideMenu FXML布局) java(这是sideMenu JavaFX控制器)

  • 我正在尝试将一个矩形拖动到VBox,然后从VBox内部再次拖动它。 如果矩形被放置在目标VBox之外的任何位置,那么它应该将其位置恢复到它所属的位置:如果它是左VBox的子级,则将其重置回其中;如果它是右VBox的子级,则将其重置回右VBox内部。 第一部分工作正常,我可以将其拖到VBox并将其添加为子级。第二部分是我遇到问题的地方。 重现问题的步骤:<br>1)将左矩形拖动到右矩形的顶部(在VB