java.awt
로 바뀌었지만 API의 상당 부분은 그 팁에서 설명한 그대로이다. 또한 Microsoft Windows 작업 표시줄, Gnome 알림 영역 또는 KDE 시스템 트레이에 애플리케이션을 추가할 수도 있다. 이 팁에서도 바로 그 내용에 대해 알아보기로 한다. 시스템 트레이 액세스에는 단지 두 개의 새 클래스만 있으면 된다. 데스크탑의 시스템 트레이를 나타내는 SystemTray
와 그 아이콘을 나타내는 TrayIcon
이다. Image
나 Icon
을 쓰지 않는 이유는? TrayIcon
에 PopupMenu
와 툴 팁 텍스트가 연결되어 있기 때문이다. 자, 모든 조각이 어떻게 들어맞는지 살펴보자.
SystemTray
클래스는 플랫폼이 하나의 트레이 인스턴스를 갖는다는 개념에서 출발한다. SystemTray
의 getSystemTray()
메소드를 호출하면 그 인스턴스가 반환된다. 그러나 일부 플랫폼에서는 시스템 트레이를 지원하지 않을 수도 있으므로, 먼저 isSupported()
메소드를 통해 확인하는 것이 가장 좋다. 그렇지 않으면 플랫폼에서 시스템 트레이를 지원하지 않을 경우 UnsupportedOperationException
이 발생한다. 시스템 트레이 인스턴스를 얻는 데 필요한 일반적인 패턴은 다음과 같다.
if (SystemTray.isSupported()) { SystemTray tray = SystemTray.getSystemTray(); }
Microsoft Windows, Solaris Operating System, Linux 등 일반적인 플랫폼 대부분은 시스템 트레이를 지원하지만, 그렇지 않은 플랫폼도 있을 것이다.
SystemTray
를 얻었다면 TrayIcon
이 제 역할을 하기 시작한다. 추가할 메뉴와 툴팁별로 하나씩, 물론 Image
와 함께 트레이에 추가한다.
SystemTray
를 사용하는 기본적인 프레임워크로 시작하면 다음 프로그램을 얻게 된다. 이 프로그램은 단일 TrayIcon
을 SystemTray
에 두는데, 그 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/ActionListener
가 MenuItem
에 추가되었기 때문에 선택 시 활성화되었을 것이다.
메뉴 항목 선택 시 애플리케이션의 큰 프레임을 작성하는 기능 외에도 TrayIcon
의 또 다른 중요한 메소드에 대해 알아볼 필요가 있다. 바로 displayMessage()
이다. 이 메소드를 호출하면 시스템 트레이에서 그 아이콘 근처에 팝업 메시지가 나타난다. 이 메소드는 3개의 인수, 즉 팝업 창 제목(null이 될 수 있음), 메시지 자체 그리고 메시지 형식을 나타내는 MessageType
이 필요하다. ERROR
, WARNING
, INFO
또는 NONE
형식을 사용할 수 있다. NONE
을 제외한 모든 형식은 팝업 창에 자체 아이콘을 추가한다. 이 아이콘은 JOptionPane
에 나타나는 것보다 더 작은 버전이다.
다음 프로그램에서는 앞의 예에 메뉴 항목을 몇 개 더 추가하여 displayMessage()
메소드와 그 모든 메시지 형식을 보여 준다. 최종 메뉴 항목 Close에서는 SystemTray
의 remove()
메소드를 사용하여 TrayIcon
을 SystemTray
에서 제거하고 종료한다.
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/CoreJavaTe
에서 볼 수 있습니다