Системный трей может содержать некоторое количество иконок. Добавление иконок в системый трей производится с использованием команды 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 не пропадает
ОтветитьУдалитьможно пример полноценной программы
ОтветитьУдалитьЯ тоже всё изучаю сам, с нуля. Всё пока работает, спасибо. Включу такие фишки в мою след игру.. Если никто не возражает?
ОтветитьУдалить