【问题标题】:How to make an undecorated window movable / draggable in JavaFX?如何在 JavaFX 中使未装饰的窗口可移动/可拖动?
【发布时间】:2012-10-23 18:13:12
【问题描述】:

我必须创建一个应用程序,其中最小化和最大化按钮将被禁用。

我使用了"StageStyle.UNDECORATED",应用程序将不再是可移动或可拖动的,因此我正在寻找任何其他替代方案来制作我的应用程序。

有人对此有解决方案吗?

【问题讨论】:

  • 上述属性是否将标题栏全部隐藏起来?你打算如何拖动窗口?
  • 是的 NeilGhosh,上面的属性隐藏了整个标题栏。

标签: javafx-2 minimize maximize


【解决方案1】:

要使窗口不装饰但仍可移动/可拖动,您必须在您选择的任何节点上处理适当的MouseEvent

示例:

import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
import javafx.stage.StageStyle;

public class SimpleWindowApplication extends Application {
    private double xOffset = 0;
    private double yOffset = 0;

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(final Stage primaryStage) {
        primaryStage.initStyle(StageStyle.UNDECORATED);
        BorderPane root = new BorderPane();

        root.setOnMousePressed(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent event) {
                xOffset = event.getSceneX();
                yOffset = event.getSceneY();
            }
        });
        root.setOnMouseDragged(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent event) {
                primaryStage.setX(event.getScreenX() - xOffset);
                primaryStage.setY(event.getScreenY() - yOffset);
            }
        });

        Scene scene = new Scene(root, 800, 600);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
}

从 Oracle 的 JavaFX 下载页面中包含的非常有价值的示例中了解更多信息:JavaFX Demos and Samples

【讨论】:

  • 是的 pmoule,这是解决我问题的最佳方法,对我真的很有帮助。非常感谢您的努力。
  • 就这样工作了,非常感谢您的研究时间...我们已经使用了 urs :-D
【解决方案2】:

此类的唯一目的是允许拖动未装饰的窗口。它还负责确保 TaskBar 在 FullScreen 中保持可见,并确保未装饰的窗口不会拖出屏幕。 最后,它为错误“未找到 css 资源”提供了错误修复。 只需将下面的代码粘贴到重写的 start() 方法中的主类中,就在 Stage 即将显示或之后。

WindowStyle.allowDrag(root, stage);
WindowStyle.stageDimension(stage.getWidth(), stage.getHeight());

注意:当舞台即将显示或之后粘贴以上内容。 对于全屏窗口使用:

WindowStyle.fullScreen(Stage stage);

要重新调整大小以恢复以前的使用:

WindowStyle.restoreScreen(Stage stage);

要将自定义样式表添加到您的场景,只需在定义场景后将以下代码粘贴到覆盖的 start() 方法中的主类中。

scene.getStylesheets().add(WindowStyle.addStyleSheet(String css));

用于样式的css名称可以是:main.cssstyles/main.css

import javafx.geometry.Rectangle2D;
import javafx.scene.Parent;
import javafx.scene.input.MouseEvent;
import javafx.stage.Screen;
import javafx.stage.Stage;

/**
 * @author:   BENJAH
 */

public class WindowStyle {
    private static final Rectangle2D SCREEN_BOUNDS= Screen.getPrimary()
            .getVisualBounds();
    private static double[] pref_WH, offset_XY;
    private static String styleSheet;

    private WindowStyle(String css) {
        styleSheet= getClass().getResource(css).toString();
    }

    protected static void allowDrag(Parent root, Stage stage) {
        root.setOnMousePressed((MouseEvent p) -> {
            offset_XY= new double[]{p.getSceneX(), p.getSceneY()};
        });

        root.setOnMouseDragged((MouseEvent d) -> {
            //Ensures the stage is not dragged past the taskbar
            if (d.getScreenY()<(SCREEN_BOUNDS.getMaxY()-20))
                stage.setY(d.getScreenY() - offset_XY[1]);
            stage.setX(d.getScreenX() - offset_XY[0]);
        });

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

    //Sets the default stage prefered width and height.
    protected static void stageDimension(Double width, Double height) {
        pref_WH= new double[]{width, height};
    }

    protected static void fullScreen(Stage stage) {
        stage.setX(SCREEN_BOUNDS.getMinX());
        stage.setY(SCREEN_BOUNDS.getMinY());
        stage.setWidth(SCREEN_BOUNDS.getWidth());
        stage.setHeight(SCREEN_BOUNDS.getHeight());
    }

    protected static void restoreScreen(Stage stage) {
        stage.setX((SCREEN_BOUNDS.getMaxX() - pref_WH[0])/2);
        stage.setY((SCREEN_BOUNDS.getMaxY() - pref_WH[1])/2);
        stage.setWidth(pref_WH[0]);
        stage.setHeight(pref_WH[1]);
    }

    protected static String addStyleSheet(String css) {
        new WindowStyle(css);
        return styleSheet;
    }
}

【讨论】:

    猜你喜欢
    • 2015-03-21
    • 1970-01-01
    • 2013-09-18
    • 2013-08-12
    • 2011-12-29
    • 1970-01-01
    • 2011-07-26
    • 1970-01-01
    • 2011-04-29
    相关资源
    最近更新 更多