오늘의 이야기는 바로 시스템 트레이에 아이콘을 등록하고, 메뉴 작동에 대한 부분입니다. JFrame 에 JTextArea 와 JButton 을 설치하고 오른쪽 위의 "X" 버튼을 누르면 창이 사라지면서 시스템 트레이에 트레이 아이콘을 등록합니다. 트레이 아이콘은 "restore" 와 "exit" 라는 메뉴를 가지며 각각 창을 다시 보여주는 기능과 종료하는 기능을 수행합니다. 먼저 오늘 만들게 될 프로그램의 모습입니다.
보시는 바와 같이 매우 간단합니다. Layout 은 BorderLayout 을 썼고, JTextArea 를 BorderLayout.CENTER 로 JButton 을 BorderLayout.SOUTH 로 설정하였습니다. Exit 버튼을 누르면 프로그램이 종료하며, 우측 상단의 'X' 를 누르면 창이 닫히면서 트레이 아이콘이 등록됩니다.
시스템 트레이에 등록된 모습입니다. 녹색 바탕에 흰색으로 1이라는 숫자가 있는 아이콘이 트레이 아이콘이며, 풍선도움말에 "System Tray Test"라는 문구가 나옵니다.
아이콘을 오른쪽 클릭하였을 때 나오는 팝업 메뉴입니다. Restore 와 Exit 가 보입니다.
시스템 트레이에 아이콘을 등록하기 위해서는 TrayIcon 과 여기서 작동될 팝업메뉴가 필요하고 이를 SystemTray 를 이용해서 등록해주면 됩니다.
먼저 팝업 메뉴를 만드는 코드입니다. 팝업 메뉴를 만들고 여기에 ActionListener 를 만들수 있는 방법은 매우 다양하지만 저는 간단히 아래와 같이 했습니다.
// 메뉴 만들기
PopupMenu popup = new PopupMenu();
MenuItem mi1 = new MenuItem("Restore");
mi1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e)
{
restore();
}
});
popup.add(mi1);
MenuItem mi2 = new MenuItem("Exit");
mi2.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e)
{
exit();
}
});
popup.add(mi2);
PopupMenu popup = new PopupMenu();
MenuItem mi1 = new MenuItem("Restore");
mi1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e)
{
restore();
}
});
popup.add(mi1);
MenuItem mi2 = new MenuItem("Exit");
mi2.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e)
{
exit();
}
});
popup.add(mi2);
다음은 TrayIcon 을 만드는 과정입니다.
시스템 트레이에 등록될 아이콘입니다.
// TrayIcon 만들기
BufferedImage bi = null;
try{
bi = ImageIO.read(new File("res/o1.gif"));
}catch(Exception e)
{
e.printStackTrace();
}
if( bi != null) trayIcon = new TrayIcon(bi,"System Tray Test", popup);
BufferedImage bi = null;
try{
bi = ImageIO.read(new File("res/o1.gif"));
}catch(Exception e)
{
e.printStackTrace();
}
if( bi != null) trayIcon = new TrayIcon(bi,"System Tray Test", popup);
이미지를 얻기 위해 ImageIO를 사용했습니다. 다른 예외 처리가 필요할 수도 있지만 여기서는 단순하게 ^^
그리고 마지막으로 시스템 트레이에 TrayIcon을 등록하는 과정입니다.
if( SystemTray.isSupported() && trayIcon != null){
SystemTray tray = SystemTray.getSystemTray();
try{
tray.add(trayIcon);
}catch(Exception e){
e.printStackTrace();
}
}
SystemTray tray = SystemTray.getSystemTray();
try{
tray.add(trayIcon);
}catch(Exception e){
e.printStackTrace();
}
}
시스템 트레이에서 아이콘을 제거하기 위해서는 remove 메소드를 사용하면 됩니다.
전체 소스 파일의 내용을 보시려면 아래 버튼을 눌러주세요
전체 소스
SystemTray 는 1.6 이상에서만 동작하니, 최신 J2SE SDK 를 받아서 사용하시기 바랍니다.
이올린에 북마크하기
이올린에 추천하기
댓글을 달아 주세요