8 августа 2011 г.

Swing. Работа с системным треем.

Рассмотрим простой пример работы с системным треем средствами Swing.
Приведу простой пример программы, цель которой запустить оконное приложение, свернутое в трей (не показывается на панели задач). По правому щелчку мыши на иконке, выводится меню.


  1. import java.awt.AWTException;  
  2. import java.awt.BorderLayout;  
  3. import java.awt.EventQueue;  
  4. import java.awt.MenuItem;  
  5. import java.awt.PopupMenu;  
  6. import java.awt.SystemTray;  
  7. import java.awt.TrayIcon;  
  8. import java.awt.event.ActionEvent;  
  9. import java.awt.event.ActionListener;  
  10. import java.awt.event.MouseAdapter;  
  11. import java.awt.event.MouseEvent;  
  12. import java.awt.event.WindowEvent;  
  13. import java.awt.event.WindowListener;  
  14. import java.awt.image.BufferedImage;  
  15. import java.io.File;  
  16. import java.io.IOException;  
  17.   
  18. import javax.imageio.ImageIO;  
  19. import javax.swing.JFrame;  
  20. import javax.swing.JOptionPane;  
  21. import javax.swing.JPanel;  
  22. import javax.swing.SwingUtilities;  
  23. import javax.swing.border.EmptyBorder;  
  24.   
  25.   
  26. public class start extends JFrame {  
  27.   
  28.  private JPanel contentPane;  
  29.  private static JFrame frame;  
  30.   
  31.   
  32.  public static void main(String[] args) {  
  33.   EventQueue.invokeLater(new Runnable() {  
  34.    public void run() {  
  35.     try {  
  36.      frame = new start();  
  37.      frame.setVisible(false);  
  38.       frame.addWindowListener( new WindowListener(){  
  39.   
  40.         @Override  
  41.         public void windowActivated(WindowEvent arg0) {  
  42.          // TODO Auto-generated method stub  
  43.            
  44.         }  
  45.   
  46.         @Override  
  47.         public void windowClosed(WindowEvent arg0) {  
  48.          // TODO Auto-generated method stub  
  49.            
  50.         }  
  51.   
  52.         @Override  
  53.         public void windowClosing(WindowEvent arg0) {  
  54.          // TODO Auto-generated method stub  
  55.            
  56.         }  
  57.   
  58.         @Override  
  59.         public void windowDeactivated(WindowEvent arg0) {  
  60.          // TODO Auto-generated method stub  
  61.            
  62.         }  
  63.   
  64.         @Override  
  65.         public void windowDeiconified(WindowEvent arg0) {  
  66.          // TODO Auto-generated method stub  
  67.            
  68.         }  
  69.   
  70.         @Override  
  71.         public void windowIconified(WindowEvent arg0) {  
  72.          frame.setVisible(false);  
  73.            
  74.         }  
  75.   
  76.         @Override  
  77.         public void windowOpened(WindowEvent arg0) {  
  78.          // TODO Auto-generated method stub  
  79.            
  80.         }  
  81.          
  82.       });  
  83.     } catch (Exception e) {  
  84.      e.printStackTrace();  
  85.     }  
  86.    }  
  87.   });  
  88.  }  
  89.   
  90.   
  91.  public start() throws IOException, AWTException {  
  92.   setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
  93.   setBounds(100100450300);  
  94.   contentPane = new JPanel();  
  95.   contentPane.setBorder(new EmptyBorder(5555));  
  96.   contentPane.setLayout(new BorderLayout(00));  
  97.   setContentPane(contentPane);  
  98. //***************************************************  
  99.   BufferedImage Icon= null;  
  100.   Icon = ImageIO.read(new File("1.gif"));  
  101.   final  TrayIcon trayIcon =  new TrayIcon(Icon, "Приложение в трее");  
  102.     
  103.   SystemTray systemTray = SystemTray.getSystemTray();  
  104.   systemTray.add(trayIcon);  
  105.     
  106.     
  107.   
  108. //*****************************************************  
  109.     
  110.   final PopupMenu popupMenu = new PopupMenu();  
  111.   MenuItem item = new MenuItem("Развернуть");  
  112.   item.addActionListener(new ActionListener(){  
  113.    @Override  
  114.    public void actionPerformed(ActionEvent e) {  
  115.     frame.setVisible(true);  
  116.     frame.setExtendedState(JFrame.NORMAL);  
  117.    }  
  118.   });  
  119.   popupMenu.add(item);  
  120.     
  121.   trayIcon.addMouseListener(new MouseAdapter(){  
  122.    @Override  
  123.    public void mouseClicked (MouseEvent e){  
  124.     if ( SwingUtilities.isRightMouseButton( e )){  
  125.      trayIcon.setPopupMenu(popupMenu);  
  126.     }  
  127.     else if(SwingUtilities.isLeftMouseButton( e )){  
  128.      JOptionPane.showMessageDialog(null"Нажата левая кнопка мыши""Сообщение", JOptionPane.NO_OPTION);  
  129.     }  
  130.    }  
  131.   });  
  132.        
  133.  }  
  134.   
  135. }  

    Со строки 38 по 82 строку мы переопределяем поведение нашего окна, нужно нам это для того чтобы при сворачивании сделать его невидимым, т.е. скрыть с панели задач.
    В строках с 99 по 104 мы инициализируем системный трей и добавляем туда нашу иконку.
    Со 110 строки мы создаем PopupMenu,  который появляется при нажатии правой кнопки мыши, при нажатии левой кнопки появляется MessageDialog. И добавляем единственный пункт - "Развернуть", при нажатии на который у нас и появится наше окно, в стоке 116 мы программно устанавливаем положение окна как "NORMAL", если этого не сделать то окно появится свернутым на панели задач.