To Hide JavaFx fxml or JavaFx swing application to System Tray

后端 未结 2 472
醉话见心
醉话见心 2020-12-23 08:58

I want to develop a client app for website .

I want the app to reside in system tray when minimised.

I dont know how to accomplish this task

相关标签:
2条回答
  • 2020-12-23 09:19

    The key here is to set the implicit exit to false Platform.setImplicitExit(false); Also is important to show and hide the stage in a new thread.

     Platform.runLater(new Runnable() {
        @Override
        public void run() {
            stage.show();
        }
     });
    
     Platform.runLater(new Runnable() {
        @Override
        public void run() {
            stage.hide();
        }
     });
    

    Next, the whole code:

    import java.awt.AWTException;
    import java.awt.MenuItem;
    import java.awt.PopupMenu;
    import java.awt.SystemTray;
    import java.awt.TrayIcon;
    import java.awt.event.ActionListener;
    import java.io.IOException;
    import java.net.URL;
    import javafx.application.Application;
    import javafx.application.Platform;
    import javafx.event.EventHandler;
    import javafx.scene.Group;
    import javafx.scene.Scene;
    import javafx.stage.Stage;
    import javafx.stage.WindowEvent;
    import javax.imageio.ImageIO;
    
    /**
     *
     * @author alvaro
     */
    public class TrayTest extends Application {
    
        private boolean firstTime;
        private TrayIcon trayIcon;
    
    
        public static void main(String[] args)
        {
            launch(args);
        }
    
        @Override
        public void start(Stage stage) throws Exception {
            createTrayIcon(stage);
            firstTime = true;
            Platform.setImplicitExit(false);
            Scene scene = new Scene(new Group(), 800, 600);
            stage.setScene(scene);
            stage.show();
    
        }
    
        public void createTrayIcon(final Stage stage) {
            if (SystemTray.isSupported()) {
                // get the SystemTray instance
                SystemTray tray = SystemTray.getSystemTray();
                // load an image
                java.awt.Image image = null;
                try {
                    URL url = new URL("http://www.digitalphotoartistry.com/rose1.jpg");
                    image = ImageIO.read(url);
                } catch (IOException ex) {
                    System.out.println(ex);
                }
    
    
                stage.setOnCloseRequest(new EventHandler<WindowEvent>() {
                    @Override
                    public void handle(WindowEvent t) {
                        hide(stage);
                    }
                });
                // create a action listener to listen for default action executed on the tray icon
                final ActionListener closeListener = new ActionListener() {
                    @Override
                    public void actionPerformed(java.awt.event.ActionEvent e) {
                        System.exit(0);
                    }
                };
    
                ActionListener showListener = new ActionListener() {
                    @Override
                    public void actionPerformed(java.awt.event.ActionEvent e) {
                        Platform.runLater(new Runnable() {
                            @Override
                            public void run() {
                                stage.show();
                            }
                        });
                    }
                };
                // create a popup menu
                PopupMenu popup = new PopupMenu();
    
                MenuItem showItem = new MenuItem("Show");
                showItem.addActionListener(showListener);
                popup.add(showItem);
    
                MenuItem closeItem = new MenuItem("Close");
                closeItem.addActionListener(closeListener);
                popup.add(closeItem);
                /// ... add other items
                // construct a TrayIcon
                trayIcon = new TrayIcon(image, "Title", popup);
                // set the TrayIcon properties
                trayIcon.addActionListener(showListener);
                // ...
                // add the tray image
                try {
                    tray.add(trayIcon);
                } catch (AWTException e) {
                    System.err.println(e);
                }
                // ...
            }
        }
    
        public void showProgramIsMinimizedMsg() {
            if (firstTime) {
                trayIcon.displayMessage("Some message.",
                        "Some other message.",
                        TrayIcon.MessageType.INFO);
                firstTime = false;
            }
        }
    
        private void hide(final Stage stage) {
            Platform.runLater(new Runnable() {
                @Override
                public void run() {
                    if (SystemTray.isSupported()) {
                        stage.hide();
                        showProgramIsMinimizedMsg();
                    } else {
                        System.exit(0);
                    }
                }
            });
        }
    }
    
    0 讨论(0)
  • 2020-12-23 09:22

    As far as I know it will be possible in JFX 8. Right now the best solution is to embed your application into AWT and hide the AWT window itself.

    0 讨论(0)
提交回复
热议问题