Системный трей может содержать некоторое количество иконок. Добавление иконок в системый трей производится с использованием команды add(java.awt.TrayIcon), а удаление командой remove(java.awt.TrayIcon).
Ниже привожу пример с официального сайта Oracle, в котором демонстрируется использование системного трея
final TrayIcon trayIcon; if (SystemTray.isSupported()) { SystemTray tray = SystemTray.getSystemTray(); Image image = Toolkit.getDefaultToolkit().getImage("tray.gif"); MouseListener mouseListener = new MouseListener() { public void mouseClicked(MouseEvent e) { System.out.println("Tray Icon - Mouse clicked!"); } public void mouseEntered(MouseEvent e) { System.out.println("Tray Icon - Mouse entered!"); } public void mouseExited(MouseEvent e) { System.out.println("Tray Icon - Mouse exited!"); } public void mousePressed(MouseEvent e) { System.out.println("Tray Icon - Mouse pressed!"); } public void mouseReleased(MouseEvent e) { System.out.println("Tray Icon - Mouse released!"); } }; ActionListener exitListener = new ActionListener() { public void actionPerformed(ActionEvent e) { System.out.println("Exiting..."); System.exit(0); } }; PopupMenu popup = new PopupMenu(); MenuItem defaultItem = new MenuItem("Exit"); defaultItem.addActionListener(exitListener); popup.add(defaultItem); trayIcon = new TrayIcon(image, "Tray Demo", popup); ActionListener actionListener = new ActionListener() { public void actionPerformed(ActionEvent e) { trayIcon.displayMessage("Action Event", "An Action Event Has Been Performed!", TrayIcon.MessageType.INFO); } }; trayIcon.setImageAutoSize(true); trayIcon.addActionListener(actionListener); trayIcon.addMouseListener(mouseListener); try { tray.add(trayIcon); } catch (AWTException e) { System.err.println("TrayIcon could not be added."); } } else { // System Tray is not supported }
В вышеприведенном примере есть один существенный недочет - для всплывающего меню там используется тяжеловесный устарелый компонент java.awt.PopupMenu, одним из недостатков которого является невозможность установки иконок для его MenuItem'ов. Несмотря на то, что TrayIcon по умолчанию принимает в своем конструкторе только java.awt.PopupMenu, возможность использовать более продвинутый javax.swing.JPopupMenu все же существует. Необходимо добавить к TrayIcon MouseListener, который будет создавать JPopupMenu при своем срабатывании. Ниже приведен пример такой реализации.
final TrayIcon trayIcon; if (SystemTray.isSupported()) { SystemTray tray = SystemTray.getSystemTray(); Image image = Toolkit.getDefaultToolkit().getImage("tray.gif"); ActionListener exitListener = new ActionListener() { public void actionPerformed(ActionEvent e) { System.out.println("Exiting..."); System.exit(0); } }; final JPopupMenu popup = new JPopupMenu(); JMenuItem defaultItem = new JMenuItem("Exit"); defaultItem.addActionListener(exitListener); popup.add(defaultItem); trayIcon = new TrayIcon(image, "Tray Demo"); ActionListener actionListener = new ActionListener() { public void actionPerformed(ActionEvent e) { trayIcon.displayMessage("Action Event", "An Action Event Has Been Performed!", TrayIcon.MessageType.INFO); } }; trayIcon.setImageAutoSize(true); trayIcon.addActionListener(actionListener); trayIcon.addMouseListener(new MouseAdapter() { @Override public void mouseReleased(MouseEvent e) { if (e.isPopupTrigger()) { popup.setLocation(e.getX(), e.getY()); popup.setInvoker(popup); popup.setVisible(true); } } }); try { tray.add(trayIcon); } catch (AWTException e) { System.err.println("TrayIcon could not be added."); } } else { // System Tray is not supported }
Спасибо, уже год читаю твой блог, каждый раз нахожу что-то новое и интересное. Где изучал язык?
ОтветитьУдалитьСпасибо за хорошие слова о блоге, основы языка начинал изучать в БГУИР (Белорусском Государственном Университете информатики и радиоэлектроники), затем по большей части самостоятельно, уже непосредственно в процессе написания программ и при решении возникающих задач.
УдалитьПри каких-то загадочных условиях иконка из трея исчезает, может знаете как ей апдейт сделать?
ОтветитьУдалитьСложно сказать в чем проблема, вполне может быть что она связана с операционной системой (есть такой "известный" глюк в Windows Xp), с проблемами подобного рода связанными с программной реализацией иконки в системном трее на java я ни разу не сталкивался.
УдалитьПроверьте установлена ли на компьютере последняя версия java, если нет - обновите её.
Если же эта проблема связана с виндовс - при пропадании иконки, перезапустите процесс explorer.exe, иконка должна появиться.
при потере фокуса меню JPopupMenu не пропадает
ОтветитьУдалитьможно пример полноценной программы
ОтветитьУдалитьЯ тоже всё изучаю сам, с нуля. Всё пока работает, спасибо. Включу такие фишки в мою след игру.. Если никто не возражает?
ОтветитьУдалить