Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX拖动事件受窗口大小调整的影响_Javafx_Drag And Drop_Javafx 2_Java 8 - Fatal编程技术网

JavaFX拖动事件受窗口大小调整的影响

JavaFX拖动事件受窗口大小调整的影响,javafx,drag-and-drop,javafx-2,java-8,Javafx,Drag And Drop,Javafx 2,Java 8,我一直在尝试在JavaFX中实现节点拖动,我遇到了一个似乎应该相对容易解决的问题。我猜这与调整窗口大小后JavaFX场景图如何更新(或不更新)有关 无论如何,问题如下: 应用程序在一个小窗口中启动,其中有一个节点可以在窗口中单击和拖动。这在两种情况下都可以正常工作: 在调整大小之前,将在窗口中单击并拖动节点 调整大小后,在窗口中单击并拖动节点 但在第三种情况下失败: 在调整窗口大小(放大)之前和之后,都会单击并拖动节点 拖动事件似乎无法识别窗口边界中的更改。换句话说,如果单击并拖动节点,则放大窗

我一直在尝试在JavaFX中实现节点拖动,我遇到了一个似乎应该相对容易解决的问题。我猜这与调整窗口大小后JavaFX场景图如何更新(或不更新)有关

无论如何,问题如下:

应用程序在一个小窗口中启动,其中有一个节点可以在窗口中单击和拖动。这在两种情况下都可以正常工作:

  • 在调整大小之前,将在窗口中单击并拖动节点
  • 调整大小后,在窗口中单击并拖动节点
  • 但在第三种情况下失败:

  • 在调整窗口大小(放大)之前和之后,都会单击并拖动节点
  • 拖动事件似乎无法识别窗口边界中的更改。换句话说,如果单击并拖动节点,则放大窗口。随后的单击和拖动尝试将限于窗口的原始边界

    无论如何,下面是我为演示这个问题而编写的JavaFX应用程序示例。它复制了我上面描述的三个测试用例

    谢谢

    import javafx.geometry.Point2D;
    import javafx.scene.Scene;
    import javafx.scene.control.Label;
    import javafx.scene.input.ClipboardContent;
    import javafx.scene.input.DragEvent;
    import javafx.scene.input.MouseEvent;
    import javafx.scene.input.TransferMode;
    import javafx.scene.layout.AnchorPane;
    import javafx.scene.layout.BorderPane;
    import javafx.scene.layout.Pane;
    import javafx.stage.Stage;
    import javafx.application.Application;
    import javafx.event.EventHandler;
    
    public class Main extends Application {
    
    private AnchorPane node_root;
    private BorderPane mRoot;
    
    @Override
    public void start(Stage primaryStage) {
    
        try {
            node_root = new AnchorPane();
            mRoot = new BorderPane();
            Scene scene = new Scene(mRoot,400,400);
    
            primaryStage.setScene(scene);
            primaryStage.show();
    
        } catch(Exception e) {
            e.printStackTrace();
        }
    
        addFileSystemNode ();
    
        mRoot.setOnDragDone (new EventHandler <DragEvent>() {
    
            @Override
            public void handle(DragEvent event) {
    System.out.println ("Drag done");
                event.consume();
            }
        });     
    }
    
    public static void main(String[] args) {
        launch(args);
    }
    
    public final void addFileSystemNode () {
    
        Label node_title = new Label();
        node_title.setText("drag me!");
    
        node_root.getChildren().add (node_title);
        mRoot.getChildren().add (node_root);
    
        buildNodeDragHandlers();        
    
        node_root.setLayoutX(100.0);
        node_root.setLayoutY(100.0);
    }
    
    public void relocateToPoint (Point2D p) {
        Point2D p2 = mRoot.sceneToLocal(p);
    
        node_root.relocate (
                (int) (p2.getX()),
                (int) (p2.getY())
            );
    }
    
    public void buildNodeDragHandlers() {
    
        mRoot.setOnDragOver(new EventHandler <DragEvent>() {
    
            //dragover to handle node dragging in the right pane view
            @Override
            public void handle(DragEvent event) {   
    
                System.out.println("parent node drag over" + " "  + ((Pane) event.getSource()).getId());
    
                event.acceptTransferModes(TransferMode.ANY);
                relocateToPoint(new Point2D( event.getSceneX(), event.getSceneY()));
                event.consume();
            }
        });
    
        mRoot.setOnDragDropped(new EventHandler <DragEvent> () {
    
            @Override
            public void handle(DragEvent event) {
    
                System.out.println("node drag dropped");                
    
                event.setDropCompleted(true);
                event.consume();
            }
        });     
    
        //drag detection for node dragging
        node_root.setOnDragDetected( new EventHandler <MouseEvent> () {
    
            @Override
            public void handle(MouseEvent event) {
    
                System.out.println("Drag detected");                
    
                //begin drag ops
                relocateToPoint(new Point2D(event.getSceneX(), event.getSceneY()));
    
                ClipboardContent content = new ClipboardContent();
                content.putString("node_drag");
    
                node_root.startDragAndDrop (TransferMode.ANY).setContent(content);                
    
                event.consume();                    
            }
    
        });     
    }   
    }
    
    导入javafx.geometry.Point2D;
    导入javafx.scene.scene;
    导入javafx.scene.control.Label;
    导入javafx.scene.input.ClipboardContent;
    导入javafx.scene.input.DragEvent;
    导入javafx.scene.input.MouseEvent;
    导入javafx.scene.input.TransferMode;
    导入javafx.scene.layout.ancorpane;
    导入javafx.scene.layout.BorderPane;
    导入javafx.scene.layout.Pane;
    导入javafx.stage.stage;
    导入javafx.application.application;
    导入javafx.event.EventHandler;
    公共类主扩展应用程序{
    私有锚烷节_根;
    私有边界窗格mRoot;
    @凌驾
    公共无效开始(阶段primaryStage){
    试一试{
    node_root=新的锚烷();
    mRoot=新边框窗格();
    场景=新场景(mRoot,400400);
    初级阶段。场景(场景);
    primaryStage.show();
    }捕获(例外e){
    e、 printStackTrace();
    }
    addFileSystemNode();
    mRoot.setOnDragDone(新的EventHandler(){
    @凌驾
    公共无效句柄(DrageEvent事件){
    System.out.println(“拖动完成”);
    event.consume();
    }
    });     
    }
    公共静态void main(字符串[]args){
    发射(args);
    }
    公共最终作废addFileSystemNode(){
    标签节点_title=新标签();
    node_title.setText(“拖动我!”);
    node_root.getChildren().add(node_title);
    mRoot.getChildren().add(node\u root);
    buildNodeDragHandlers();
    node_root.setLayoutX(100.0);
    node_root.setLayoutY(100.0);
    }
    公共空间重新定位点(点2D p){
    point2dp2=mRoot.sceneToLocal(p);
    node_root.relocate(
    (int)(p2.getX()),
    (int)(p2.getY())
    );
    }
    public void buildNodeDragHandlers(){
    setOnDragOver(新的EventHandler(){
    //dragover在右窗格视图中处理节点拖动
    @凌驾
    公共无效句柄(DrageEvent事件){
    System.out.println(“父节点拖到“+”+((窗格)event.getSource()).getId()上);
    event.acceptTransferModes(TransferMode.ANY);
    重新定位点(新的点2D(event.getSceneX(),event.getSceneY());
    event.consume();
    }
    });
    setOnDragDrop(新的EventHandler(){
    @凌驾
    公共无效句柄(DrageEvent事件){
    System.out.println(“节点拖放”);
    事件。setDropCompleted(true);
    event.consume();
    }
    });     
    //节点拖动的拖动检测
    检测到node_root.setOnDragDetected(新的EventHandler(){
    @凌驾
    公共无效句柄(MouseeEvent事件){
    System.out.println(“检测到阻力”);
    //开始拖动操作
    重新定位点(新的点2D(event.getSceneX(),event.getSceneY());
    ClipboardContent=新的ClipboardContent();
    content.putString(“节点拖动”);
    node_root.startdragandrop(TransferMode.ANY).setContent(content);
    event.consume();
    }
    });     
    }   
    }
    
    这似乎是JavaFX中真正的错误。提交了一份bug报告。目前计划在JDK 9中进行修复


    此错误特定于Linux平台。 我测试了我的代码和你的,在Windows7上一切正常,但在Linux上出现了错误。(我还没有在MacOs上测试过)

    我使用了:OpenJdk 11.0.2

    JDK问题跟踪程序中的问题:

    还有一个与拖放和GTK3相关的错误:


    请编辑答案以提供指向您提交的错误报告的链接。Joel,除了升级JDK 9之外,您是否找到了其他解决方案?我遇到了同样的问题,我不知道。这对我来说不是什么大问题,只是我注意到了一些问题,所以除了提交bug报告之外,我从来没有进行过修复。