Java SystemTray.add (TrayIcon) вешает Swing GUI при выходе - PullRequest
3 голосов
/ 11 декабря 2011

Вот интересная ошибка (читай: я, наверное, что-то пропустил) в Java Swing. Последние два дня я пытался отследить.

Перво-наперво, создайте SSCCE .Вот, пожалуйста.

class GUI extends JFrame{
    public static void main(String[] args){
        // All GUI work should be handled in the EDT.
        SwingUtilities.invokeLater(new Runnable(){
            @Override
            public void run() {
                new GUI().setVisible(true);
            }
        });
    }

    GUI(){
         // Make a nice icon
        ImageIcon img = new ImageIcon(this.getClass().getClassLoader().getResource("img/1.png"));

        // Make a TrayIcon with the image
        SystemTray sysTray = SystemTray.getSystemTray();
        TrayIcon trayIcon = new TrayIcon(img.getImage());
        try {
            sysTray.add(trayIcon);
        }
        catch(AWTException e) {
            e.printStackTrace();
           System.out.println("System Tray unsupported!");
        }

        this.setTitle("Example GUI");
        this.setIconImage(img.getImage());
        this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    }
}

Если бы я запустил это и закрыл окно, я бы ожидал, что оно будет уничтожено, а различные потоки завершатся.Это тот случай, если я закомментирую блок try / catch «Make a TrayIcon».

Кажется, что строка sysTray.add () не создает исключение, но наличие в коде останавливает завершение потоков, поскольку код зависает в функции wait () в потоке AWT-EventQueue.

Это ошибка или что-то, чего мне не хватает?

Приветствует всех.

1 Ответ

2 голосов
/ 11 декабря 2011

Для правильного завершения программы при закрытии необходимо установить DefaultCloseOperation на EXIT_ON_CLOSE, например:

GUI.setDefaultCloseOperation(EXIT_ON_CLOSE);

EXIT_ON_CLOSE определено в JFrame, поэтому вам не нужно определять его или импортировать из любого места.

Проверьте API для других операций выхода:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...