JavaFx 将 Window-Control-Buttons 添加到菜单栏(类似 IntelliJ)

Posted

技术标签:

【中文标题】JavaFx 将 Window-Control-Buttons 添加到菜单栏(类似 IntelliJ)【英文标题】:JavaFx add Window-Control-Buttons to Menubar (IntelliJ like) 【发布时间】:2020-03-21 20:34:00 【问题描述】:

自 IntelliJ 2019.2 版以来,Jetbrains 从 IDE 中移除了标题栏,并将窗口的最小化、最大化和关闭按钮放入了菜单栏中。到目前为止,我还没有找到如何使用 javafx 来做到这一点。有没有办法实例化一个“WindowControlButtons”类,这样我就可以轻松地将它们添加到菜单栏,还是我必须自己添加一个按钮组并为每个平台设置按钮样式?

在 Windows 上的外观示例:

【问题讨论】:

JavaFX 没有用于此的 API。据我所知,Swing 也没有。 IntelliJ 可能以某种方式使用docs.microsoft.com/en-us/windows/win32/dwm/customframe。 一个可能的选择是使用没有装饰的窗口。所以窗口布局完全掌握在程序员手中。 mcwolf 的方法可能没有很好地融入操作系统的“标准窗口外观”,即使它只是不同版本的窗口...... 完全正确。窗口装饰本身是由操作系统(窗口管理器)制作的。因此,自定义解决方案可能与其他窗口的布局有所不同,但无论平台如何,都相同。这可能是优点或缺点,具体取决于具体要求。 【参考方案1】:

根据@mr mcwolf 的建议,您可以尝试以下解决方案。

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuBar;
import javafx.scene.control.MenuItem;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import javafx.stage.Stage;
import javafx.stage.StageStyle;

public class JavaFXApplication1 extends Application 

    @Override
    public void start(Stage primaryStage) 
        Button closeButton = new Button();
        closeButton.setText("X");
        closeButton.setOnAction((ActionEvent event) -> 
            javafx.application.Platform.exit();
        );
        Button hideButton = new Button();
        hideButton.setText("-");
        hideButton.setOnAction((ActionEvent event) -> 
            primaryStage.setIconified(true);
        );
        Menu menu = new Menu("Menu");
        MenuItem menuItem1 = new MenuItem("item 1");
        MenuItem menuItem2 = new MenuItem("item 2");
        menu.getItems().add(menuItem1);
        menu.getItems().add(menuItem2);
        MenuBar menuBar = new MenuBar();
        menuBar.getMenus().add(menu);
        HBox hBox = new HBox(menuBar, hideButton, closeButton);
        HBox.setHgrow(menuBar, Priority.ALWAYS);
        HBox.setHgrow(hideButton, Priority.NEVER);
        HBox.setHgrow(closeButton, Priority.NEVER);
        BorderPane root = new BorderPane();
        root.setTop(hBox);
        Scene scene = new Scene(root, 300, 250);
        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.initStyle(StageStyle.UNDECORATED);
        primaryStage.show();
    

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


Windows 上的输出如下所示。

【讨论】:

i.ibb.co/VVXvd8j/decoration.gif 这是一个类似的解决方案,在 linux 下。 @mrmcwolf 感谢您的验证,我目前没有linux机器可以检查这个。

以上是关于JavaFx 将 Window-Control-Buttons 添加到菜单栏(类似 IntelliJ)的主要内容,如果未能解决你的问题,请参考以下文章

无法将值插入 tableview - JavaFx

如何将 Spring 与 JavaFX 一起使用?

使用 Eclipse 将 JavaFX 项目导出到可运行文件

JavaFX:将图像插入 GridPane

如何将 java (javaFX) 模块添加到默认模块路径?

JavaFX / FXML 将 ChoiceBox 添加到根窗格