Как перехватить событие минимизации окна? - PullRequest
6 голосов
/ 21 ноября 2011

Я хочу создать экземпляр JFrame и по щелчку его minimize button я хотел бы скрыть его в System Tray, который обычно является taskbar окон.

Я бы узнал, что с помощью класса SystemTray в пакете java.awt я могу это сделать, но я не получаю ни учебника, ни примера работающей программы.

Я бы задал этот вопрос здесь, чтобы получить ссылку на учебный сайт для класса SystemTray или, если кто-либо знает, как перехватить событие минимизации окна, рабочий пример.

Ответы [ 5 ]

5 голосов
/ 21 ноября 2011

Интерфейс WindowListener и метод JFrame addWindowListener() должны помочь определить, когда кадр был свернут.

4 голосов
/ 21 ноября 2011

Это приведет к тому, что событие сворачивается в окно, и появится иконка в трее.Он также удалит окно с панели задач и добавит слушателя на иконку в трее, чтобы щелчок мышью восстановил окно.Код немного неаккуратен, но должен быть достаточно хорош для ваших учебных целей:

public class Qwe extends JFrame {

public static void main(String[] args) {
    final Qwe qwe = new Qwe();

    qwe.addWindowStateListener(new WindowStateListener() {
        public void windowStateChanged(WindowEvent e) {
            if (e.getNewState() == ICONIFIED) {
                try {
                    final TrayIcon trayIcon = new TrayIcon(new ImageIcon("/usr/share/icons/gnome/16x16/emotes/face-plain.png").getImage());
                    trayIcon.addMouseListener(new MouseAdapter() {
                        @Override
                        public void mouseClicked(MouseEvent e) {
                            qwe.setVisible(true);
                            SystemTray.getSystemTray().remove(trayIcon);
                        }
                    });
                    SystemTray.getSystemTray().add(trayIcon);
                    qwe.setVisible(false);
                } catch (AWTException e1) {
                    e1.printStackTrace();
                }
            }
        }
    });
    qwe.setSize(200, 200);
    qwe.setVisible(true);
}

}
2 голосов
/ 21 ноября 2011

лучшим способом было бы создать следующее

1) SystemTray

2) добавить JPopopMenu в набор SystemTray's Icon

3)DefaultCloseOperation для TopLevelContainer (в вашем случае JFrame )

  • с использованием WindowListener setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);

  • в других случаях всегда работает setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);

  • уведомление не забудьте объявить System.exit(1) SystemTray's JpopupMenu, JMenuItem или другимAction/Event, потому что в этой форме текущая JVM никогда не переходила из Native OS до выключения или перезапуска ПК

1 голос
/ 21 ноября 2011
private void windowStateChanged(java.awt.event.WindowEvent evt) {
    // Use getExtendedstate here.
}
0 голосов
/ 21 сентября 2015
frame.addWindowListener(new WindowAdapter() {@Override
    public void windowIconified(WindowEvent e) {}
});
...