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) {}
}
}