如何在用户点击关闭窗口时将Java应用程序放入系统托盘

5

我从这里学到了如何使用托盘。所以我按照以下方式使用:

private void checkTray() throws IOException {
    if (SystemTray.isSupported()) {
        System.out.println("system tray supported");
        tray = SystemTray.getSystemTray();
        Image image = ImageIO.read(new FileInputStream(new File("logo.png")));
        ActionListener exitListener = new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                System.out.println("Exiting....");
                System.exit(0);
            }
        };
        PopupMenu popup = new PopupMenu();
        MenuItem defaultItem = new MenuItem("Exit");
        defaultItem.addActionListener(exitListener);
        popup.add(defaultItem);
        defaultItem = new MenuItem("Open");
        defaultItem.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                setVisible(true);
                setExtendedState(JFrame.NORMAL);
            }
        });
        popup.add(defaultItem);
        trayIcon = new TrayIcon(image, "SystemTray Demo", popup);
        trayIcon.setImageAutoSize(true);
    }
    addWindowStateListener(new WindowStateListener() {

        public void windowStateChanged(WindowEvent e) {
            if (e.getNewState() == ICONIFIED) {
                try {
                    tray.add(trayIcon);
                    setVisible(false);
                    System.out.println("added to SystemTray");
                } catch (AWTException ex) {
                    System.out.println("unable to add to tray");
                }
            }
            if(e.getNewState() == WindowEvent.WINDOW_CLOSING){
               try {
                    tray.add(trayIcon);
                    setVisible(false);
                    System.out.println("added to SystemTray");
                } catch (AWTException ex) {
                    System.out.println("unable to add to system tray");
                }
            }
            if (e.getNewState() == 7) {
                try {
                    tray.add(trayIcon);
                    setVisible(false);
                    System.out.println("added to SystemTray");
                } catch (AWTException ex) {
                    System.out.println("unable to add to system tray");
                }
            }
            if (e.getNewState() == MAXIMIZED_BOTH) {
                tray.remove(trayIcon);
                setVisible(true);
                System.out.println("Tray icon removed");
            }
            if (e.getNewState() == NORMAL) {
                tray.remove(trayIcon);
                setVisible(true);
                System.out.println("Tray icon removed");
            }
        }
    });
}

并且在构造函数中:

this.setDefaultCloseOperation(JFrame.ICONIFIED);

当我点击关闭窗口时,我的应用程序不会进入系统托盘,而是自动关闭。我该如何解决这个问题?有人可以帮帮我吗?

自从JFrame.ICONIFIED成为setDefaultCloseOperation() ? WindowConstants http://docs.oracle.com/javase/6/docs/api/javax/swing/WindowConstants.html)的一个值以来,它是什么时候发生的? - ecle
那我必须使用 Nothing_on_close 吗? - Jayyrus
是的,因为您想要使用 setVisible(true) 使框架再次可见。 - ecle
是的,在系统托盘中有“退出…”弹出菜单选项,可以使用System.exit(0)退出整个应用程序。 - ecle
1
很明显,在窗口关闭操作中使用DO_NOTHING_ON_CLOSE将什么也不会发生 ;) - ecle
显示剩余2条评论
1个回答

4
我解决了这个问题,添加了以下内容:
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent windowEvent) {
    setExtendedState(JFrame.ICONIFIED); 
    }
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接