Приложение для скрытия и восстановления системного трея Java - PullRequest
0 голосов
/ 02 января 2019

Привет всем, у меня есть этот Java-код, который создает значок в системном трее, следуя примеру THIS :

    public static void createTray() {
            //Check the SystemTray is supported
            if (!SystemTray.isSupported()) {
                JOptionPane.showMessageDialog(null, "SystemTray is not supported", "DOH! An error", JOptionPane.ERROR_MESSAGE);
                return;
            }

            URL imageURL = winBuilder.class.getResource("/bulb.gif");
            trayIcon = new TrayIcon((new ImageIcon(imageURL, "")).getImage());
            tray = SystemTray.getSystemTray();
            trayIcon.setImageAutoSize(true);

            // Create a pop-up menu components
            MenuItem aboutItem = new MenuItem("About");
            MenuItem exitItem = new MenuItem("Exit");

            //Add components to pop-up menu
            popup.add(aboutItem);
            popup.addSeparator();
            popup.add(exitItem);

            trayIcon.setPopupMenu(popup);

            try {
                tray.add(trayIcon);
            } catch (AWTException e) {
                JOptionPane.showMessageDialog(null, "TrayIcon could not be added: " + e.getLocalizedMessage(), "DOH! An error", JOptionPane.ERROR_MESSAGE);
            }

            trayIcon.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    //Double-click action on icon
                    frmUftWebui.setVisible(true);
                    frmUftWebui.repaint();
                    SystemTray.getSystemTray().remove(trayIcon);
                }
            });

            aboutItem.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    JOptionPane.showMessageDialog(null,
                            "This dialog box is run from the About menu item");
                }
            });

            exitItem.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    trayIcon.displayMessage("Exit", "The cool program has closed.", TrayIcon.MessageType.INFO); //ERROR | WARNING | INFO | NONE
                tray.remove(trayIcon);
                System.exit(0);
            }
        });
    }

Это работает и показывает значок в системном трее, как и должно, но как только я дважды щелкну по значку, появится новое окно вместо моего исходного окна?

Это ГЛАВНЫЙ код, который у меня есть:

try {
    UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
} catch (UnsupportedLookAndFeelException ex) {
    ex.printStackTrace();
} catch (IllegalAccessException ex) {
    ex.printStackTrace();
} catch (InstantiationException ex) {
    ex.printStackTrace();
} catch (ClassNotFoundException ex) {
    ex.printStackTrace();
}

/* Turn off metal's use of bold fonts */
UIManager.put("swing.boldMetal", Boolean.FALSE);

try {
    frmUftWebui.setVisible(false);
    frmUftWebui.getContentPane().setLayout(null);
    frmUftWebui.setState(frmUftWebui.ICONIFIED);

    // Web HTML panel
    jfxPanel = new JFXPanel();
    jfxPanel.setBackground(Color.WHITE);
    jfxPanel.setBounds(0, 0, 1098, 523);
    frmUftWebui.getContentPane().add(jfxPanel);

    javafx.application.Platform.runLater(new Runnable() {
@SuppressWarnings({ "unchecked", "unused" })
public void run() {
    createTray();
    ............................
} catch (Exception e) {
     JOptionPane.showMessageDialog(null, "Error: " + e.getLocalizedMessage(), "DOH! An error", JOptionPane.ERROR_MESSAGE);
}
}

Чего мне не хватает, чтобы заставить его открывать исходное окно вместо того, чтобы создавать новое, когда я щелкаю по значку на панели задач?

...