반응형
Java SE 6 릴리스에서는 AWT(Abstract Window Toolkit)에 새로운 기능 몇 가지를 추가했다. 사용자는 GUI 구성 요소를 향상시킬 때 더 이상 Swing에만 의존하지 않아도 된다. Java SE 6 덕분에 이전 팁, JDIC를 사용하여 네이티브 애플리케이션과 통신하기에서 JDIC(JDesktop Integration Components)라고 불렀던 것을 통해 데스크탑 애플리케이션 등에 새로운 방식으로 액세스할 수 있다. 그 패키지가 java.awt로 바뀌었지만 API의 상당 부분은 그 팁에서 설명한 그대로이다. 또한 Microsoft Windows 작업 표시줄, Gnome 알림 영역 또는 KDE 시스템 트레이에 애플리케이션을 추가할 수도 있다. 이 팁에서도 바로 그 내용에 대해 알아보기로 한다.

시스템 트레이 액세스에는 단지 두 개의 새 클래스만 있으면 된다. 데스크탑의 시스템 트레이를 나타내는 SystemTray와 그 아이콘을 나타내는 TrayIcon이다. ImageIcon을 쓰지 않는 이유는? TrayIconPopupMenu와 툴 팁 텍스트가 연결되어 있기 때문이다. 자, 모든 조각이 어떻게 들어맞는지 살펴보자.

SystemTray 클래스는 플랫폼이 하나의 트레이 인스턴스를 갖는다는 개념에서 출발한다. SystemTraygetSystemTray() 메소드를 호출하면 그 인스턴스가 반환된다. 그러나 일부 플랫폼에서는 시스템 트레이를 지원하지 않을 수도 있으므로, 먼저 isSupported() 메소드를 통해 확인하는 것이 가장 좋다. 그렇지 않으면 플랫폼에서 시스템 트레이를 지원하지 않을 경우 UnsupportedOperationException이 발생한다. 시스템 트레이 인스턴스를 얻는 데 필요한 일반적인 패턴은 다음과 같다.

  if (SystemTray.isSupported()) {
    SystemTray tray = SystemTray.getSystemTray();
  }

Microsoft Windows, Solaris Operating System, Linux 등 일반적인 플랫폼 대부분은 시스템 트레이를 지원하지만, 그렇지 않은 플랫폼도 있을 것이다.

SystemTray를 얻었다면 TrayIcon이 제 역할을 하기 시작한다. 추가할 메뉴와 툴팁별로 하나씩, 물론 Image와 함께 트레이에 추가한다.

SystemTray를 사용하는 기본적인 프레임워크로 시작하면 다음 프로그램을 얻게 된다. 이 프로그램은 단일 TrayIconSystemTray에 두는데, 그 PopupMenu에는 하나의 MenuItem이 있다. 설치된 JDK 디렉토리에 데모 하위 디렉토리 하나가 있다. 그 하위 디렉토리의 아이콘을 얻을 수 있다. 지원되는 형식이면 뭐든지 가능하다.

import javax.swing.*;
import java.awt.*;

public class BasicTray {
  public static void main(String args[]) {
    Runnable runner = new Runnable() {
      public void run() {
        if (SystemTray.isSupported()) {
          SystemTray tray = SystemTray.getSystemTray();
          Image image = Toolkit.getDefaultToolkit().getImage("gifIcon.gif");
          PopupMenu popup = new PopupMenu();
          MenuItem item = new MenuItem("A MenuItem");
          popup.add(item);
          TrayIcon trayIcon = new TrayIcon(image, "The Tip Text", popup);
          try {
 tray.add(trayIcon);
          } catch (AWTException e) {
            System.err.println("Can't add to tray");
          }
        } else {
          System.err.println("Tray unavailable");
        }
      }
    };
    EventQueue.invokeLater(runner);
  }
}

마우스를 아이콘 위에 두면 툴팁 텍스트가 표시된다. 아이콘을 클릭하면 팝업 메뉴가 나타나 메뉴 항목을 표시한다. Action/ActionListenerMenuItem에 추가되었기 때문에 선택 시 활성화되었을 것이다.

메뉴 항목 선택 시 애플리케이션의 큰 프레임을 작성하는 기능 외에도 TrayIcon의 또 다른 중요한 메소드에 대해 알아볼 필요가 있다. 바로 displayMessage()이다. 이 메소드를 호출하면 시스템 트레이에서 그 아이콘 근처에 팝업 메시지가 나타난다. 이 메소드는 3개의 인수, 즉 팝업 창 제목(null이 될 수 있음), 메시지 자체 그리고 메시지 형식을 나타내는 MessageType이 필요하다. ERROR, WARNING, INFO 또는 NONE 형식을 사용할 수 있다. NONE을 제외한 모든 형식은 팝업 창에 자체 아이콘을 추가한다. 이 아이콘은 JOptionPane에 나타나는 것보다 더 작은 버전이다.

다음 프로그램에서는 앞의 예에 메뉴 항목을 몇 개 더 추가하여 displayMessage() 메소드와 그 모든 메시지 형식을 보여 준다. 최종 메뉴 항목 Close에서는 SystemTrayremove() 메소드를 사용하여 TrayIconSystemTray에서 제거하고 종료한다.

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class FullTray {
  static class ShowMessageListener implements ActionListener {
    TrayIcon trayIcon;
    String title;
    String message;
    TrayIcon.MessageType messageType;
    ShowMessageListener(
        TrayIcon trayIcon,
        String title,
        String message,
        TrayIcon.MessageType messageType) {
      this.trayIcon = trayIcon;
      this.title = title;
      this.message = message;
      this.messageType = messageType;
    }
    public void actionPerformed(ActionEvent e) {
      trayIcon.displayMessage(title, message, messageType);
    }
  }


public static void main(String args[]) {
    Runnable runner = new Runnable() {
      public void run() {
        if (SystemTray.isSupported()) {
          final SystemTray tray = SystemTray.getSystemTray();
          Image image = Toolkit.getDefaultToolkit().getImage("gifIcon.gif");
          PopupMenu popup = new PopupMenu();
          final TrayIcon trayIcon = new TrayIcon(image, "The Tip Text", popup);

          MenuItem item = new MenuItem("Error");
  item.addActionListener(new ShowMessageListener(trayIcon,
            "Error Title", "Error", TrayIcon.MessageType.ERROR));
          popup.add(item);
          item = new MenuItem("Warning");
  item.addActionListener(new ShowMessageListener(trayIcon,
            "Warning Title", "Warning", TrayIcon.MessageType.WARNING));
          popup.add(item);
          item = new MenuItem("Info");
  item.addActionListener(new ShowMessageListener(trayIcon,
            "Info Title", "Info", TrayIcon.MessageType.INFO));
          popup.add(item);
          item = new MenuItem("None");
  item.addActionListener(new ShowMessageListener(trayIcon,
            "None Title", "None", TrayIcon.MessageType.NONE));
          popup.add(item);
          item = new MenuItem("Close");
  item.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
     tray.remove(trayIcon);
            }
  });
          popup.add(item);
          try {
            tray.add(trayIcon);
          } catch (AWTException e) {
            System.err.println("Can't add to tray");
          }
        } else {
          System.err.println("Tray unavailable");
        }
      }
    };
    EventQueue.invokeLater(runner);
  }
}


프로그램을 컴파일하고 실행하여 트레이 아이콘이 시스템 트레이에 추가되게 한다. Microsoft Windows 시스템에서는 아이콘에서 마우스 오른쪽 버튼을 클릭해야 팝업 메뉴가 나타난다. 각 아이콘을 선택하면 각 메시지가 표시되며, 마칠 때에는 Close를 선택하면 된다. 트레이 아이콘을 제거하면 실제로 이벤트 디스패치 스레드가 종료하므로 프로그램이 종료된다.

*******

jMaki는 Ajax 기반 웹 애플리케이션을 손쉽게 빌드할 수 있는 경량급 프레임워크이다. Deep Dive에서 jMaki 프로젝트 리더인 Greg Murray와 함께 더 자세히 알아볼 수 있다.

*******

이 아티클의 영문 원본은
http://blogs.sun.com/CoreJavaTechTips/entry/getting_to_know_system_tray
에서 볼 수 있습니다

+ Recent posts