JAVAFX,当任务栏的位置发生变化时,如何在屏幕上更新最大化未修饰窗口的宽度和高度?

标签 javafx controller javafx-8

我正在尝试做的是... enter image description here 1

我正在尝试为我的 Undecorated-window 添加功能,使其在最大化和任务栏的位置发生变化时自动调整大小。

通过使用 onMouseMove 通过 getVisualBounds() 检测屏幕尺寸变化并检查它,我已经接近了。 onMouseMove() 的一个问题是它仅在鼠标移过窗口时调整大小,而不是在更改任务栏后调整大小。

这是我想出的演示代码。

/////// controller Class////////
private Stage stage;
boolean lock = false;
ObservableList<Screen> screenSizes;

public void setUp(Stage stage){
        this.stage = stage;
        screenSizes  = Screen.getScreensForRectangle(new Rectangle2D(this.stage.getX(), this.stage.getY(), this.stage.getWidth(), this.stage.getHeight()));
}


@FXML
protected void onMaximizedButton() {
        if(lock == true){
            stage.setMaximized(false);
            lock = false;
        }else{
            stage.setMaximized(true);
            lock = true;
            stage.setX(screenSizes.get(0).getVisualBounds().getMinX());
            stage.setY(screenSizes.get(0).getVisualBounds().getMinY());
            stage.setWidth(screenSizes.get(0).getVisualBounds().getWidth());
            stage.setHeight(screenSizes.get(0).getVisualBounds().getHeight());
        }


}

@FXML
private void onMouseMove(){
        ObservableList<Screen> newScreenSizes = Screen.getScreensForRectangle(new Rectangle2D(stage.getX(), stage.getY(), stage.getWidth(),stage.getHeight()));
        if(!(newScreenSizes.get(0).getVisualBounds().equals(screenSizes.get(0).getVisualBounds()))){
            if(lock == true){
                //stage.setMaximized(true);
                screenSizes = newScreenSizes;
                stage.setX(screenSizes.get(0).getVisualBounds().getMinX());
                stage.setY(screenSizes.get(0).getVisualBounds().getMinY());
                stage.setWidth(screenSizes.get(0).getVisualBounds().getWidth());
                stage.setHeight(screenSizes.get(0).getVisualBounds().getHeight());

            }

        }

}
///// main class////////
@Override
public void start(Stage stage) throws IOException {
        FXMLLoader fxmlLoader = new FXMLLoader(HelloApplication.class.getResource("hello-view.fxml"));
        Parent root = fxmlLoader.load();
        HelloController helloController = fxmlLoader.getController();

        Scene scene = new Scene(root, 320, 240);
        stage.setTitle("Hello!");
        stage.setScene(scene);
        stage.initStyle(StageStyle.UNDECORATED);
        stage.show();
        helloController.setUp(stage);


}

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

我在问是否有办法获取任务栏的位置并在更改时更新它?

我想过但没有做的其他事情,也许使用 Observable 屏幕列表并向其添加一个监听器并以某种方式将其绑定(bind)到某些东西以使其在任务栏更改时自动更改?

最佳答案

这可能不是一个正确的解决方案,但如果您准备好冒险使用 com.sun.* 类,您可以采用以下方法。

import com.sun.glass.ui.Screen;

@Override
public void start(final Stage stage) throws Exception {
    // Your code....

    Screen.setEventHandler(new Screen.EventHandler() {

        @Override
        public void handleSettingsChanged() {
            System.out.println("Resize the window here......");
        }
    });
}

关于JAVAFX,当任务栏的位置发生变化时,如何在屏幕上更新最大化未修饰窗口的宽度和高度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73547171/

相关文章:

java - TableView - 尝试使其表现得像 Excel

javascript - 我希望根据当前路线将多个变量切换为 true 或 false

controller - 从另一个 Controller 调用另一个模块中的 Controller

JavaFX ControlsFX 自动完成 : How to get popup result into a new ObservableList

java - 如何计算用户从 5 个组合框中选择的项目的总成本

java - 如何在 JavaFX 中重新加载应用程序?

java - Core.rectangle 返回 cannot resolve method 错误 in openCv 3.0

JavaFX:如何设置 TabPane header onClick 事件的监听器

JavaFX:滚动 Pane 不适合父级

c# - 找到与名为 'Home' 的 Controller 匹配的多个类型