如何在JavaFX中创建一个可移动/可拖动的未修饰窗口?

时间:2012-11-03 05:16:07

标签: javafx-2 minimize maximize

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

我已经使用了"StageStyle.UNDECORATED",应用程序将无法移动或拖动,因此我正在寻找其他任何替代方案来进行申请。

有人为此解决了问题吗?

1 个答案:

答案 0 :(得分:0)

此类的唯一目的是允许拖动未修饰的Window。它还执行以确保TaskBar在FullScreen中保持可见的任务,并确保未将未修饰的窗口拖出屏幕。 最后,它提供了错误修复“css资源未找到”。 只需在舞台显示为关闭时或之后,在主要类中的代码中粘贴下面的代码。

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;
    }
}