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

JavaFX窗口拖动快且不平滑

公冶谦
2023-03-14

我正在处理一个应用程序,它以透明的锚窗格开始(没有标题栏和圆角)。我想要能够拖动和移动窗口周围。我已经让它工作了,但是当我点击它时,窗口会向上弹到你从中心拖动的地方,而不是你点击的地方。

CSS:

.root {
    -fx-background-radius: 20; 
    -fx-border-radius: 20;
    -fx-background-color: transparent;
}

main.java:

public void start(Stage primaryStage) throws Exception {
    primaryStage.initStyle(StageStyle.TRANSPARENT);
    FXMLLoader loader = new FXMLLoader();
    loader.setLocation(Main.class.getResource("../Scenes/Login.fxml"));

    //Creates the layout for the new scene
    AnchorPane layout = (AnchorPane) loader.load();             
    Scene scene = new Scene(layout);
    scene.setFill(Color.TRANSPARENT);
    scene.getStylesheets().add(getClass().getResource("../StyleSheets/application.css").toExternalForm());
    LoginController.allowDrag(layout, primaryStage);

    primaryStage.setScene(scene);   
    primaryStage.setResizable(false);
    primaryStage.show();
}

控制器:

private static final Rectangle2D SCREEN_BOUNDS = Screen.getPrimary().getVisualBounds();

public static void allowDrag(AnchorPane root, Stage primaryStage) {
    root.setOnMousePressed((MouseEvent mouseEvent1) -> {
            xOffset = mouseEvent1.getSceneX();
            yOffset = mouseEvent1.getScreenY();
    });

    root.setOnMouseDragged((MouseEvent mouseEvent2)-> {
            if (!mouseEvent2.isPrimaryButtonDown()) return;

            //Ensures the stage is not dragged past the taskbar
            if (mouseEvent2.getScreenY()<(SCREEN_BOUNDS.getMaxY()-20))
                primaryStage.setY(mouseEvent2.getScreenY() - yOffset);

            primaryStage.setX(mouseEvent2.getScreenX() - xOffset);
            primaryStage.setY(mouseEvent2.getScreenY() - yOffset);
    });

    root.setOnMouseReleased((MouseEvent mouseEvent3)-> {
        //Ensures the stage is not dragged past top of screen
        if (primaryStage.getY()<0.0) primaryStage.setY(0.0);
    });
}

我有一种感觉,我需要说明光标在哪里,但我不确定如何。我是正确的还是我遗漏了一些更容易的东西?

共有1个答案

巫马修然
2023-03-14

是的!你是对的!我有一个更简单的变通方法可供您使用:)

main.java类中添加以下代码,

private double gapX = 0, gapY = 0;

private void calculateGap(MouseEvent event, Stage stage) {
    gapX = event.getScreenX() - stage.getX();
    gapY = event.getScreenY() - stage.getY();
}

private void dragStage(MouseEvent event, Stage stage) {
    stage.setX(event.getScreenX() - gapX);
    stage.setY(event.getScreenY() - gapY);
}
  • calculateGap(MouseEvent event,Stage Stage)正如方法名称所说,它计算MouseEvent和Stage坐标之间的间隙。
  • DragStage(MouseEvent event,Stage Stage)它允许您根据MouseEvent和计算的间隙拖动您的Stage。

start()方法中的父根布局上设置这些EventHandlers,

layout.setOnMouseDragged(e -> this.dragStage(e, primaryStage));
layout.setOnMouseMoved(e -> this.calculateGap(e, primaryStage));

现在您可以顺利拖动您的窗口:)

 类似资料:
  • 我正在尝试一个简单的Java FX程序,它可以创建一个窗口,我所需要的只是增加读取已删除文件的能力。我得到了以下代码片段,它不会抛出任何错误,但也不允许我删除任何内容。当我试图删除文件时,它会显示一个红色光标(不允许使用windows光标) 我使用的是Windows 8机器和JDK 8.0_60版。不确定问题出在哪里。代码有问题吗?我错过什么了吗? 我试过的- 已尝试更改传输模式 尝试检查文件权限

  • 我有一扇没有装饰的窗户: 我想知道我怎样才能把它做成一扇可拖动的未装饰窗户?我想在用户用鼠标右键选择窗口时更改其位置,然后在按住鼠标键的同时移动鼠标。 附言:我测试了这个解决方案,但它不起作用:

  • 我一直在尝试在JavaFX中实现节点拖动,我遇到了一个似乎应该相对容易解决的问题。我猜这与调整窗口大小后JavaFX场景图如何更新(或不更新)有关。 无论如何,问题如下: 应用程序在一个小窗口中启动,其中有一个节点可以在窗口中单击和拖动。这在两种情况下都可以正常工作: 在调整大小之前,单击并在窗口中拖动节点。 调整大小后,单击节点并在窗口中拖动。 但在第三种情况下失败: 拖动事件似乎无法识别窗口边

  • 有人能举一个简单的例子来说明如何设置EventHandler以在窗格(JavaFX)上拖动图像视图。对于拖动,我的意思是在图像上按下鼠标,拖动和图像应该跟随,然后释放鼠标,图像视图将停止在该位置。

  • 作业并行性(4,8,16):[自动生成源]-->[Map1]-->[滚动窗口(10s)]-->[Map2]-->[接收器] Flink窗口性能eps 4p、8p、16p 作业以上的性能最高达到了每秒50k+-左右,不管我如何将集群缩放成4-16的并行度。 闪烁性能无窗口4p、8p 我已经删除了窗口的逻辑,以消除瓶颈性能的应用程序逻辑,但似乎窗口仍然导致我的整个流性能下降,即使该窗口只是一个通过函数

  • 我有A. fxml和B. fxml。运行Java应用程序覆盖启动方法。我想每40分钟循环(5次){打开新阶段B. fxml并等待stage.close,如果阶段关闭继续循环打开新阶段B fxml。循环五次。我尝试定时器timerment我不能。我尝试JavaFX服务我不能。我创建My线程扩展线程对象。这一次,我无法控制下一阶段的循环。当用于声明开始打开5阶段。但是我想循环等待当前阶段关闭,然后进入