Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.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 2 如何在JavaFX中使未装饰的窗口可移动/拖动?_Javafx 2_Minimize_Maximize - Fatal编程技术网

Javafx 2 如何在JavaFX中使未装饰的窗口可移动/拖动?

Javafx 2 如何在JavaFX中使未装饰的窗口可移动/拖动?,javafx-2,minimize,maximize,Javafx 2,Minimize,Maximize,我必须创建一个应用程序,其中最小化和最大化按钮将被禁用 我使用了“StageStyle.UNDECORATED”,应用程序将不再可移动或拖动,因此我正在寻找任何其他替代方案来制作我的应用程序 有人对此有解决办法吗 要使窗口不装饰但仍可移动/拖动,您必须在您选择的任何节点上处理相应的MouseEvent 示例: import javafx.application.Application; import javafx.event.EventHandler; import javafx.scene.S

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

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


有人对此有解决办法吗

要使窗口不装饰但仍可移动/拖动,您必须在您选择的任何节点上处理相应的
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();
    }
}
导入javafx.application.application;
导入javafx.event.EventHandler;
导入javafx.scene.scene;
导入javafx.scene.input.MouseEvent;
导入javafx.scene.layout.BorderPane;
导入javafx.stage.stage;
导入javafx.stage.StageStyle;
公共类SimpleWindowApplication扩展了应用程序{
专用双xOffset=0;
专用双yOffset=0;
公共静态void main(字符串[]args){
发射(args);
}
@凌驾
公共作废开始(最终阶段初级阶段){
初级阶段。初始风格(阶段风格。未装饰);
BorderPane根=新的BorderPane();
setOnMousePressed(新的EventHandler(){
@凌驾
公共无效句柄(MouseeEvent事件){
xOffset=event.getSceneX();
yOffset=event.getSceneY();
}
});
setOnMouseDrawed(新的EventHandler(){
@凌驾
公共无效句柄(MouseeEvent事件){
setX(event.getScreenX()-xOffset);
setY(event.getScreenY()-yOffset);
}
});
场景=新场景(根,800600);
初级阶段。场景(场景);
primaryStage.show();
}
}

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

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

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.css
styles/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;
    }
}
导入javafx.geometry.Rectangle2D;
导入javafx.scene.Parent;
导入javafx.scene.input.MouseEvent;
导入javafx.stage.Screen;
导入javafx.stage.stage;
/**
*@作者:BENJAH
*/
公共类窗口样式{
私有静态最终矩形2D SCREEN_BOUNDS=SCREEN.getPrimary()
.getVisualBounds();
专用静态双[]pref_WH,offset_XY;
私有静态字符串样式表;
私有窗口样式(字符串css){
样式表=getClass().getResource(css).toString();
}
受保护的静态无效allowDrag(父根,阶段){
root.setOnMousePressed((MouseEvent p)->{
offset_XY=新的双精度[]{p.getSceneX(),p.getSceneY()};
});
root.setonmousedrable((MouseEvent d)->{
//确保阶段不会拖过任务栏
如果(d.getScreenY(){
//确保舞台不会拖过屏幕顶部

if(stage.getY()上面的属性会同时隐藏标题栏吗?你打算如何拖动窗口?是的,NeilGhosh,上面的属性会隐藏整个标题栏。是的,这是解决我问题的最佳方法,对我真的很有帮助。非常感谢你的努力。就这样工作,非常感谢你的研究时间…我们已经使用了utiliz教育署署长:-D