Java에서작업 트레이(시스템 트레이) 아이콘표시・점멸
Java에서작업 트레이(시스템 트레이)의 아이콘을 표시・점멸시키는 유틸리티 클래스를 소개합니다.
유틸리티 클래스는 Java SE 6 Mustang에서 새로운 기능으로 추가되었습니다. java.awt.SystemTray ,,,java.awt.TrayIcon 클래스를 사용합니다. 사용법을 알 수 있도록 샘플 애플리케이션도 함께 소개합니다.
시스템 트레이(작업 트레이) 기능
시스템 트레이(작업 트레이)는 컴퓨터 화면의 오른쪽 하단에 있는 작은 아이콘입니다. Java SE 6에서는 시스템 트레이 기능을 이용하기 위해서 다음의 클래스가 추가되었습니다.
- java.awt.SystemTray
 SystemTray 클래스는 데스크톱의 시스템 트레이를 나타냅니다.
- java.awt.TrayIcon
 TrayIcon 객체는 시스템 트레이에 추가할 수 있는 트레이 아이콘을 나타냅니다.
깜박임 아이콘을 만드는 방법
깜박임 아이콘을 만들려면 다음 사이트를 사용하는 것이 좋습니다.
로컬에 있는 아이콘을 업로드하여 깜박임 아이콘을 만듭니다.
https://www.bannerkoubou.com/anime/
샘플 애플리케이션

샘플 어플리케이션에서는 시스템 트레이 유틸리티 클래스 TaskTrayUtil 를 사용해 이하의 기능을 구현합니다.
- 시작하면작업 트레이에아이콘표시.
- 【점멸 버튼】을 클릭하면,작업 트레이아이콘을 깜박입니다.
 또한 풍선에서 "여기에서 내 줘!"메시지를 표시.
- 【해제 버튼】을 클릭하면 아이콘 점멸을 해제한다.
- 작업 트레이의 아이콘을 왼쪽 싱글 클릭으로 메인 윈도우를 바탕 화면에 꺼냅니다.
- 작업 트레이아이콘을 마우스 오른쪽 버튼으로 클릭하면 기본 PopupMenu 메뉴가 표시됩니다.
- 메인 윈도우가 최소화되면작업 트레이에 저장.
소스 코드 취득
소스 코드는 다음에서 얻을 수 있습니다. 또한 컴파일하는 경우 소스 코토드와 같은 위치에 다음 아이콘을 저장하십시오.
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
/**
 * Java로 작업 트레이 (시스템 트레이) 아이콘을 표시 · 점멸.
 *
 * ◆ 이 클래스의 개요
 * TaskTray 클래스는 태스크 트레이를 취급하는 유틸리티로서,
 * 다음 기능을 제공합니다.
 * · 작업 트레이에 아이콘을 표시합니다.
 * · 작업 트레이에 팝업 메시지를 표시합니다.
 * · 작업 트레이를 깜박입니다.
 *
 * ◆ 사용법
 * 이하의 메소드 인수에 대상의 JFrame 클래스를 건네줍니다.
 * · createTray (JFrame targetFrame)
 * · createTray (final JFrame targetFrame, Image image, PopupMenu menu)
 *
 */
public class TaskTrayUtil {
    private static JFrame frame;
    private static PopupMenu defaultMenu;
    private static TrayIcon trayIcon;
    private static SystemTray tray = SystemTray.getSystemTray();
    private static Object INSTANCE_LOCK = new Object();
    /**
     * 실행 샘플
     * @param args
     */
    public static void main(String[] args) {
      try {
          // LookAndFeel을 Windows로 설정
          UIManager.setLookAndFeel (
                  UIManager.getSystemLookAndFeelClassName());
          // 일반 아이콘
          final Image img = new ImageIcon (
                  TaskTrayUtil.class.getResource (
                          "tray_icon.gif")).getImage();
          final JFrame frame =
              new JFrame ( "작업 트레이에 아이콘 표시 / 깜박임");
          frame.setSize(300, 100);
          frame.setIconImage(img);
          // 창이 최소화 될 때 작업 트레이에 저장
          // 와 같이 WindowListener 클래스를 추가.
          frame.addWindowListener(new WindowAdapter() {
              public void windowIconified (WindowEvent e) {
                  frame.setVisible(false);
              }
          });
          JPanel jPanel = new JPanel();
          jPanel.setLayout(new FlowLayout());
          jPanel.setSize (new Dimension (219, 70));
          // 깜박임 아이콘
          final Image imgLight =
              new ImageIcon (TaskTrayUtil.class.getResource (
                      “tray_icon_light.gif”)).getImage();
          JButton lightButton = new JButton("깜박임");
          lightButton.addActionListener(new ActionListener(){
              public void actionPerformed (ActionEvent e) {
                  onAndOffLight(imgLight, null);
                  displayMessage(“메시지”, “여기에서 내줘!”);
              }
          });
          JButton cancelButton = new JButton("해제");
          cancelButton.addActionListener(new ActionListener(){
              public void actionPerformed (ActionEvent e) {
                  replaceImageWithDelete(img);
              }
          });
          jPanel.add(lightButton, null);
          jPanel.add(cancelButton, null);
          frame.add(jPanel);
          // 종료시 처리.
          frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
          // 프레임을 화면 중앙에 표시.
          frame.setLocationRelativeTo (null);
          // 작업 트레이를 만듭니다.
          TaskTrayUtil.createTray(frame);
          frame.setVisible (true);
      } catch (Exception e) {
          e.printStackTrace();
      }
    }
    /**
     *
     */
    static {
        createPopupMenu();
    }
    /**
     * 작업 트레이에 표시할 기본 PopupMenu 메뉴를 생성합니다.
     * 다음 메뉴가 있습니다.
     * · "작업 트레이에서 꺼내기"
     * 작업 트레이에서 대상 응용 프로그램을 바탕 화면에
     * 꺼냅니다.
     * (창을 활성화하고 앞에 표시합니다.)
     * ・종료 대상의 어플리케이션을 종료시킵니다.
     */
    private static void createPopupMenu() {
        MenuItem getTrayItem = new MenuItem(“태스크 트레이로부터 꺼낸다”);
        getTrayItem.addActionListener(new ActionListener() {
            public void actionPerformed (ActionEvent e) {
                active();
            }
        });
        MenuItem exitItem = new MenuItem(“종료”);
        exitItem.addActionListener(new ActionListener() {
            public void actionPerformed (ActionEvent e) {
                removeTrayIcon();
                TaskTrayUtil.frame.setVisible(false);
                TaskTrayUtil.frame.dispose();
                System.exit(0);
            }
        });
        defaultMenu = new PopupMenu();
        defaultMenu.add(getTrayItem);
        defaultMenu.add(exitItem);
    }
    /**
     * 트레이 아이콘을 만들고 시스템 트레이에 추가합니다.
     * 아이콘상에서 발생한 이벤트에 대한 리스너를 targetFrame
     * 로 설정합니다.
     * 여기서 이벤트는 트레이 아이콘을 더블 클릭했을 때
     * 대상 응용 프로그램을 검색합니다.
     * @param targetFrame 대상 응용 프로그램
     */
    public static void createTray (JFrame targetFrame) {
        createTray(targetFrame, null, null);
    }
    /**
     * 트레이 아이콘을 만들고 시스템 트레이에 추가합니다.
     *
     * @param targetFrame 대상 응용 프로그램
     * @param image 트레이 아이콘에 표시되는 이미지 이미지.
     * null의 경우, targetFrame 로부터 getIconImage()로 취득할 수 있다
     * 이미지 이미지를 사용합니다.
     * @param menu 태스크 트레이에 표시하는 PopupMenu.
     * null의 경우, 디폴트의 PopupMenu를 표시합니다.
     */
    public static void createTray (final JFrame targetFrame, Image image,
            PopupMenu menu) {
        // 시스템 트레이가 지원되지 않으면 종료.
        if (!SystemTray.isSupported()) {
            return;
        }
        TaskTrayUtil.frame=targetFrame;
        if (image == null) {
            image = targetFrame.getIconImage();
        }
        if (menu == null) {
            menu = defaultMenu;
        }
        trayIcon = new TrayIcon(image, targetFrame.getTitle(), menu);
        trayIcon.setImageAutoSize(true);
        trayIcon.addMouseListener(new MouseAdapter(){
            public void mouseClicked (MouseEvent e) {
                if (SwingUtilities.isLeftMouseButton(e)) {
                    active();
                }
            }
        });
        try {
            tray.add(trayIcon);
        } catch (AWTException e1) {
            e1.printStackTrace();
        }
    }
    /**
     * 작업 트레이에서 아이콘을 삭제합니다.
     * 어플리케이션 종료시에 호출할 필요가 있다.
     */
    public static void removeTrayIcon() {
        tray.remove(trayIcon);
    }
    /**
     * 작업 트레이 아이콘을 깜박입니다.
     * @param msg 필요한 경우 깜박이는 아이콘을 클릭했을 때
     * 표시할 메시지를 설정합니다.
     */
    public static void onAndOffLight(Image lightImg, String msg) {
        replaceImage(lightImg);
        ChangeLightImgAdapter adap=
            new TaskTrayUtil (). new ChangeLightImgAdapter (msg);
        trayIcon.addMouseListener(adap);
        frame.addWindowListener(adap);
    }
    /**
     * 작업 트레이 아이콘을 변경합니다.
     * @param image 현재 아이콘과 다른 경우에만 변경합니다.
     */
    public static void replaceImage(Image image) {
        synchronized (INSTANCE_LOCK) {
            if (!image.equals(trayIcon.getImage())) {
                trayIcon.setImage(image);
            }
        }
    }
    /**
     * 작업 트레이 아이콘을 변경합니다.
     * ※왠지 점멸하고 있는 아이콘을 되돌리는 경우는,
     * {@link SystemTray#remove(TrayIcon)})에서 삭제하지 않으면 안되는 것 같다.
     * @param image 현재 아이콘과 다른 경우에만 변경합니다.
     */
    public static void replaceImageWithDelete (Image image) {
        synchronized (INSTANCE_LOCK) {
            if (!image.equals(trayIcon.getImage())) {
                tray.remove(trayIcon);
                trayIcon.setImage(image);
                try {
                    tray.add(trayIcon);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
    /**
     * 작업 트레이에 팝업 메시지를 표시합니다.
     * @param caption
     * @param text
     */
    public static void displayMessage (String caption, String text) {
        if (caption != null || text != null) {
            trayIcon.displayMessage(caption, text,
                    TrayIcon.MessageType.INFO);
        }
    }
    /**
     * 작업 트레이에서 대상 응용 프로그램을 바탕 화면에
     * 꺼냅니다.
     */
    private static void active() {
        // 프레임 상태를 정상으로 되돌립니다.
        TaskTrayUtil.frame.setExtendedState(JFrame.NORMAL);
        TaskTrayUtil.frame.setAlwaysOnTop(true);
        TaskTrayUtil.frame.setVisible(true);
        TaskTrayUtil.frame.setAlwaysOnTop(false);
    }
    /**
     * 깜박이는 아이콘이 클릭되었을 때 발생하는 이벤트
     * Listener 클래스.
     */
    class ChangeLightImgAdapter implements WindowListener, MouseListener {
        String lightImageText;
        public ChangeLightImgAdapter (String lightImageText) {
            this.lightImageText = lightImageText;
        }
        /**
         * 작업 트레이 아이콘이 클릭되었을 때
         * 팝업 메시지를 표시합니다.
         */
        public void mousePressed (MouseEvent e) {
            TaskTrayUtil.displayMessage(null, lightImageText);
        }
        /**
         * 대상 애플리케이션이 활성화될 때 깜박임
         * 아이콘을 반환합니다.
         */
        public void windowActivated (WindowEvent e) {
            TaskTrayUtil.replaceImageWithDelete (TaskTrayUtil.frame
                    .getIconImage());
            TaskTrayUtil.frame.removeWindowListener(this);
            TaskTrayUtil.trayIcon.removeMouseListener(this);
        }
public void windowClosed (WindowEvent e) {}
public void windowClosing (WindowEvent e) {}
public void windowDeactivated(WindowEvent e) {}
public void windowDeiconified(WindowEvent e) {}
public void windowIconified (WindowEvent e) {}
public void windowOpened (WindowEvent e) {}
public void mouseClicked (MouseEvent e) {}
public void mouseEntered (MouseEvent e) {}
public void mouseExited (MouseEvent e) {}
        public void mouseReleased (MouseEvent e) {}
    }
}











