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

从任务栏还原时,TornadoFx未修饰窗口变为全屏

郜修雅
2023-03-14

我一直在尝试龙卷风。试图创建一个自定义标题栏,下面是我目前正在尝试的代码

fun main(args: Array<String>) {
    launch<MyApp>(args)
}

class MyApp : App(Title::class) {
    override fun start(stage: Stage) {
        stage.initStyle(StageStyle.UNDECORATED)
        stage.minWidth = 600.0
        stage.minHeight = 450.0
        stage.isMaximized = false
        super.start(stage)
    }
}

class Title : View() {
    private var xOffset = 0.0
    private var yOffset = 0.0
    private var screenBounds: Rectangle2D = Screen.getPrimary().visualBounds
    private var originalBounds: Rectangle2D = Rectangle2D.EMPTY
    
    init {
        primaryStage.isMaximized = false
    }
    
    override val root = borderpane {
        onMousePressed = EventHandler { ev ->
            xOffset = primaryStage.x - ev.screenX
            yOffset = primaryStage.y - ev.screenY
        }
        
        onMouseDragged = EventHandler { ev ->
            primaryStage.x = xOffset + ev.screenX
            primaryStage.y = yOffset + ev.screenY
        }
        
        center = label("Forms")
        
        right = hbox {
            button("Mi") {
                action {
                    with(primaryStage) { isIconified = true }
                }
            }

            button("Ma") {
                action {
                    if (primaryStage.isMaximized) {
                        with(primaryStage) {
                            x = originalBounds.minX
                            y = originalBounds.minY
                            width = originalBounds.width
                            height = originalBounds.height
                            isMaximized = false
                        }
                        text = "Ma"
                    } else {
                        with(primaryStage) {
                            originalBounds = Rectangle2D(x, y, width, height)
                            x = screenBounds.minX
                            y = screenBounds.minY
                            width = screenBounds.width
                            height = screenBounds.height
                            isMaximized = true
                        }
                        text = "Re"
                    }
                }
            }

            button("X") {
                action {
                    app.stop()
                    println("exiting")
                    exitProcess(0)
                }
            }
        }
    }
}

以下工作没有问题

    null

共有1个答案

焦宏硕
2023-03-14

我认为这是JavaFX中的一个普遍问题(我的意思是TornadoFX中没有具体问题)。

其根本原因是将stage的最大化属性设置为true。不确定JavaFX在内部做什么,但当您从任务栏打开窗口时,如果最大化值为true,它将以全屏模式呈现。

您可以用两种方法来解决这个问题。

方法1:

primaryStage.iconifiedProperty().addListener((obs,old,iconified)->{
    if(!iconified && primaryStage.isMaximized()){
        primaryStage.setWidth(screenBounds.getWidth());
        primaryStage.setHeight(screenBounds.getHeight());
    }
});
boolean maximized = false;
ma.setOnAction(e -> {
    if (maximized) {
        // Set stage to original bounds
        maximized = false;
        ma.setText("Ma");
    } else {
        // Set stage to screen bounds
        maximized = false;
        ma.setText("Re");
    }
});

下面是两种方法的完整工作演示。你可以根据你的其他要求来决定走哪条路。

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Rectangle2D;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.stage.Screen;
import javafx.stage.Stage;
import javafx.stage.StageStyle;

public class UndecoratedWindowFullScreenDemo extends Application {
    private double xOffset = 0.0;
    private double yOffset = 0.0;
    private Rectangle2D screenBounds = Screen.getPrimary().getVisualBounds();
    private Rectangle2D originalBounds = Rectangle2D.EMPTY;
    private boolean maximized = false;

    @Override
    public void start(Stage primaryStage) throws Exception {
        BorderPane root = new BorderPane();
        root.setStyle("-fx-background-color:pink;");
        Scene scene = new Scene(root, 600, 450);
        primaryStage.setScene(scene);

        Label label = new Label("Forums");
        Button mi = new Button("Mi");
        Button ma = new Button("Ma");
        Button x = new Button("X");
        HBox pane = new HBox(mi, ma, x);
        pane.setPadding(new Insets(3));
        pane.setSpacing(5);
        root.setCenter(label);
        root.setRight(pane);

        primaryStage.initStyle(StageStyle.UNDECORATED);
        primaryStage.setMinWidth(600);
        primaryStage.setMinHeight(450);
        primaryStage.setMaximized(false);
        primaryStage.show();

        root.setOnMousePressed(e -> {
            xOffset = primaryStage.getX() - e.getScreenX();
            yOffset = primaryStage.getY() - e.getScreenY();
        });
        root.setOnMouseDragged(e -> {
            primaryStage.setX(xOffset + e.getScreenX());
            primaryStage.setY(yOffset + e.getScreenY());
        });
        mi.setOnAction(e -> primaryStage.setIconified(true));

        /* Use this approach if you want to go with the Stage maximized property */
        // approach1(primaryStage, ma);

        /* Use this approach if you want to avoid Stage maximized property and maintain a instance variable */
        approach2(primaryStage, ma);
    }

    private void approach1(Stage primaryStage, Button ma) {
        primaryStage.iconifiedProperty().addListener((obs, old, iconified) -> {
            if (!iconified && primaryStage.isMaximized()) {
                primaryStage.setWidth(screenBounds.getWidth());
                primaryStage.setHeight(screenBounds.getHeight());
            }
        });

        ma.setOnAction(e -> {
            if (primaryStage.isMaximized()) {
                primaryStage.setX(originalBounds.getMinX());
                primaryStage.setY(originalBounds.getMinY());
                primaryStage.setWidth(originalBounds.getWidth());
                primaryStage.setHeight(originalBounds.getHeight());
                primaryStage.setMaximized(false);
                ma.setText("Ma");
            } else {
                originalBounds = new Rectangle2D(primaryStage.getX(), primaryStage.getY(), primaryStage.getWidth(), primaryStage.getHeight());
                primaryStage.setX(screenBounds.getMinX());
                primaryStage.setY(screenBounds.getMinY());
                primaryStage.setWidth(screenBounds.getWidth());
                primaryStage.setHeight(screenBounds.getHeight());
                primaryStage.setMaximized(true);
                ma.setText("Re");
            }
        });
    }

    private void approach2(Stage primaryStage, Button ma) {
        ma.setOnAction(e -> {
            if (maximized) {
                primaryStage.setX(originalBounds.getMinX());
                primaryStage.setY(originalBounds.getMinY());
                primaryStage.setWidth(originalBounds.getWidth());
                primaryStage.setHeight(originalBounds.getHeight());
                maximized = false;
                ma.setText("Ma");
            } else {
                originalBounds = new Rectangle2D(primaryStage.getX(), primaryStage.getY(), primaryStage.getWidth(), primaryStage.getHeight());
                primaryStage.setX(screenBounds.getMinX());
                primaryStage.setY(screenBounds.getMinY());
                primaryStage.setWidth(screenBounds.getWidth());
                primaryStage.setHeight(screenBounds.getHeight());
                maximized = true;
                ma.setText("Re");
            }
        });
    }
}
 类似资料:
  • 问题内容: 我试图发出Windows PC Toast通知。现在,我混合使用了Swing和JavaFX,因为我没有找到使用FX制作未修饰窗口的方法。我更喜欢只使用JavaFX。 那么,如何制作未装饰的窗户? 编辑: 我发现您可以直接使用创建舞台。 现在我所需要知道的是如何初始化工具箱,以便可以在中调用我的方法。(其中) 我通常会打电话给我,但是这使我无法创建和初始化。 那么,如何做这些事情以允许我

  • 我用pyGtk制作了一扇没有装饰的窗户。该窗口隐藏在任务栏和所有窗口的顶部。在linux上,它可以正常工作,但在MS Windows窗口上,它有时会隐藏在其他窗口下,并且在Windows中的任务栏上总是有“python.exe”。 代表我问题的图片: 如何从任务栏隐藏这个“python.exe”窗口? 我的代码:

  • 我想删除Windows 10多桌面任务栏上的窗口。对于Windows 8.1,我使用了ITaskbarList::DeleteTab,效果非常好。 对于Windows 10,此方法也将Windows从任务栏中隐藏,但在它之后,我在所有桌面上看到此窗口。我只想在一个桌面上看到这个窗口。 有人知道在Windows 10中从任务栏隐藏窗口并将此窗口保留在一个桌面上的方法吗? 下面你们可以看到,我在“在W

  • 我有一个 窗口,我从该窗口中删除了标题栏,并添加了一个自定义的“关闭”和“最小化”按钮。当程序首次加载时,它不会向任务栏显示图标。当我单击定制的最小化按钮时,它会在任务栏上创建一个图标;然而,当我单击恢复窗口时,我无法再次摆脱标题栏。 我希望图标始终显示在任务栏上,并且当程序最小化然后还原时,我希望标题栏仍然从 中消失。不幸的是,我很难在最小化之前和之后重置标志而不使任务栏图标消失。 请让我知道我

  • 我正在用PySide和Python2.7编写一个程序。 这段代码显示一个工作任务栏图标和一个iconmenu。现在,当我点击“Show Window”时,我想在图标的相同位置加载一个停靠到任务栏的Widget/Windows。 如果我会使用几何学,这将永远不会工作,因为有些人的任务栏在顶部,或在屏幕的侧面。 如何用pyside将窗口/小部件停靠到任务栏? 谢谢。

  • 这个问题我已经找了很多遍了,但似乎没有人知道。我在python 2.7中创建了一个简单的tkinter窗口(tcl 8.5),并希望它最大化,就像我要按右上角的maximize按钮一样。使用 选项不是一个选项,因为它会删除标题栏。 我尝试了以下操作: 问题是窗口现在在Windows任务栏下面,因此我的一些元素没有显示出来。一个简单的方法是将height设置为screenheight-some_co