【问题标题】:How do I minimize a javafx stage on close to the system tray?如何最小化靠近系统托盘的 javafx 阶段?
【发布时间】:2016-11-09 22:27:48
【问题描述】:

我有一个包含 2 个阶段的应用程序,我不希望用户关闭第二个阶段,只需将其图标化即可。

目前我正在使用 oncloseRequest 处理程序来最小化窗口 -

secondaryStage.setOnCloseRequest(event -> {
    secondaryStage.setIconified(true);
    event.consume();
});

当用户关闭窗口时,我想在系统托盘中显示一个图标。并且用户应该能够从托盘重新打开窗口。

另外,我如何确保当一级关闭时,二级也关闭?

【问题讨论】:

标签: javafx javafx-8


【解决方案1】:

在 start 方法中设置以下属性

Platform.setImplicitExit(false);

然后设置关闭事件

secondaryStage.setOnCloseRequest(event -> {
    // Your code here
});

要制作系统托盘,请尝试以下代码:

原文链接:https://docs.oracle.com/javase/tutorial/uiswing/misc/systemtray.html

    //Check the SystemTray is supported
    if (!SystemTray.isSupported()) {
        System.out.println("SystemTray is not supported");
        return;
    }
    final PopupMenu popup = new PopupMenu();

    URL url = System.class.getResource("/images/new.png");
    Image image = Toolkit.getDefaultToolkit().getImage(url);

    final TrayIcon trayIcon = new TrayIcon(image);

    final SystemTray tray = SystemTray.getSystemTray();

    // Create a pop-up menu components
    MenuItem aboutItem = new MenuItem("About");
    CheckboxMenuItem cb1 = new CheckboxMenuItem("Set auto size");
    CheckboxMenuItem cb2 = new CheckboxMenuItem("Set tooltip");
    Menu displayMenu = new Menu("Display");
    MenuItem errorItem = new MenuItem("Error");
    MenuItem warningItem = new MenuItem("Warning");
    MenuItem infoItem = new MenuItem("Info");
    MenuItem noneItem = new MenuItem("None");
    MenuItem exitItem = new MenuItem("Exit");

    //Add components to pop-up menu
    popup.add(aboutItem);
    popup.addSeparator();
    popup.add(cb1);
    popup.add(cb2);
    popup.addSeparator();
    popup.add(displayMenu);
    displayMenu.add(errorItem);
    displayMenu.add(warningItem);
    displayMenu.add(infoItem);
    displayMenu.add(noneItem);
    popup.add(exitItem);

    trayIcon.setPopupMenu(popup);

    try {
        tray.add(trayIcon);
    } catch (AWTException e) {
        System.out.println("TrayIcon could not be added.");
    }

系统托盘图像示例:

要从 awt 事件处理程序调用 Javafx 的方法,您可以按照以下方式:

yourAwtObject.addActionListener(e -> {
    Platform.runLater(() -> primaryStage.show());
});

【讨论】:

    【解决方案2】:

    另外,我如何确保初级阶段关闭时,第二阶段 也关门了?

    当初级阶段关闭时,您可以使用这样的东西来关闭次级阶段:

    primaryStage.setOnCloseRequest((WindowEvent we) -> {
        secondaryStage.close();
    }
    

    【讨论】:

    • 不会因为另一个 onCloseRequest 处理程序而仅仅图标化了secondaryStage吗?
    • 您可以在辅助 onCloseRequest 处理程序中添加一个 if 语句,以检查主要阶段是否正在关闭
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-30
    • 1970-01-01
    • 1970-01-01
    • 2012-11-17
    • 1970-01-01
    • 2015-01-14
    • 2010-12-08
    相关资源
    最近更新 更多