Русский English Тэги View Sergey Zolotaryov's profile on LinkedIn Вход
Сворачивание в трей в Java 6
Постоянная ссылка 15-03-2008 anydoby java

В Java 6 появились некоторые возможности интеграции с нативным десктопом. Например, появился класс SystemTray и TrayIcon. При помощи этих классов можно эмулировать сворачивание приложения в системный трей?

Идея проста - когда окошко минимизируется, мы перехватываем событие и вместо минимизации делаем окно невидимым, при этом добявляя иконку в трей. Прикрепляем ActionListener к иконке и когда по ней два раза щелкают мышкой, мы восстанавливаем состояние окна. Довольно просто. А теперь посмотрим на код, который это делает:


package com.anydoby.minimize;

import static java.awt.SystemTray.getSystemTray;

import java.awt.AWTException;
import java.awt.Image;
import java.awt.SystemTray;
import java.awt.Toolkit;
import java.awt.TrayIcon;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.net.URL;

import javax.swing.JFrame;

/**
 * 
 * @author SergeyZ
 * 
 */
public class MainWindow extends JFrame {

    private static final long serialVersionUID = 4570679418654300776L;

    public MainWindow() {
        super("Minimizer");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        URL resource = getClass().getResource("/icon.gif");
        Image image = Toolkit.getDefaultToolkit().getImage(resource);
        setIconImage(image);
        if (SystemTray.isSupported()) {
            final TrayIcon icon = new TrayIcon(image);
            icon.setToolTip("Task Logger");
            icon.addActionListener(new ActionListener() {

                public void actionPerformed(ActionEvent e) {
                    MainWindow.this.setVisible(true);
                    MainWindow.this.setExtendedState(MainWindow.NORMAL);
                    getSystemTray().remove(icon);
                }

            });
            addWindowListener(new WindowAdapter() {

                @Override
                public void windowIconified(WindowEvent e) {
                    MainWindow.this.setVisible(false);
                    try {
                        getSystemTray().add(icon);
                    } catch (AWTException e1) {
                        e1.printStackTrace();
                    }
                }

            });
        }
        setSize(100, 100);
    }

    public static void main(String[] args) {
        MainWindow window = new MainWindow();
        window.setVisible(true);
    }

}

Можно загрузить пример проекта для Eclipse вот отсюда.

PS: протестировал я свой пример дома на Zenwalk и увидел, что не работает - оказывается это очередной баг JDK. В XFCE не работает. Как рецепт можно предложить использовать jdesktop, в нем, говорят, все работает хорошо.

Добавить комментарий

Предыдущая статья Как я получал свои Java сертификаты Следующая статья Интеграция Spring MVC + Tiles2 + Velocity