Как добавить иконки пунктам меню в SystemTray?

136
26 апреля 2019, 05:10

Подскажите пожалуйста, как добавить иконки к пунктам меню, которые расположены в системном трее (в данном случае к пункту "Профиль"). В официальном туториале не нашёл, setImage есть у JMenuItem, у MenuItem его нет. Если же PopupMenu поменять на JPopupMenu то он не принимается trayIcon.setPopupMenu.

    //Проверяем есть ли поддержка трея
    if (!SystemTray.isSupported()) {
        System.out.println("SystemTray is not supported");
        return;
    }
    final PopupMenu popup = new PopupMenu();
    final TrayIcon trayIcon = new TrayIcon(createImage("/images/application_icon.png", "tray icon"));
    final SystemTray tray = SystemTray.getSystemTray();
    //Разрешаем автоподгонку иконки
    trayIcon.setImageAutoSize(true);
    // Создаём пункты меню
    MenuItem profileMenuItem = new MenuItem("Профиль");
    profileMenuItem.addActionListener((java.awt.event.ActionEvent e)
            -> {
    });
    popup.add(profileMenuItem);//Добавляем пункты меню
    popup.addSeparator();//Разделитель
    trayIcon.setPopupMenu(popup);
Answer 1

Меню, на основе этого проекта: tray-icon-skeleton

Добавление иконки с автоподгонкой на основе ответов в этом посте: Force JMenuItem size

    //Проверяем есть ли поддержка трея
    if (!SystemTray.isSupported()) {
        System.out.println("Системный трей не поддерживается, пожалуйста используйте другую операционную систему");
        return;
    }
    final SystemTray tray = SystemTray.getSystemTray();
    final TrayIcon trayIcon = new TrayIcon(createImage("/images/application_icon.png", ""), "tray icon");
    trayIcon.setImageAutoSize(true);//Разрешаем автоподгонку иконки
    JPopupMenu.setDefaultLightWeightPopupEnabled(true);
    final JPopupMenu popupMenu = new JPopupMenu();
    Icon icon = UIManager.getIcon("RadioButtonMenuItem.checkIcon");
    Image originalImage = createImage("/images/application_icon.png", "");
    originalImage=originalImage.getScaledInstance(icon.getIconWidth(), icon.getIconWidth(), 0);
    ImageIcon image = new ImageIcon(originalImage);
    JMenuItem jMenuItem = new JMenuItem("Профиль", image);
    popupMenu.add(jMenuItem);
    jMenuItem.addActionListener((e) -> {
    });
    //Hidden dialog displayed behing the system tray to auto hide the popup menu when clicking somewhere else on the screen
    final JDialog hiddenDialog = new JDialog();
    hiddenDialog.setSize(10, 10);
    //Listener based on the focus to auto hide the hidden dialog and the popup menu when the hidden dialog box lost focus
    hiddenDialog.addWindowFocusListener(new WindowFocusListener() {
        public void windowLostFocus(final WindowEvent e) {
            hiddenDialog.setVisible(false);
        }
        public void windowGainedFocus(final WindowEvent e) {
            //Nothing to do
        }
    });
    trayIcon.addMouseListener(new MouseAdapter() {
        public void mouseReleased(final MouseEvent e) {
            if (e.isPopupTrigger()) {
                //Display the menu at the position of the mouse
                //The dialog is also displayed at this position but it is behind the system tray
                popupMenu.setLocation(e.getX(), e.getY());
                hiddenDialog.setLocation(e.getX(), e.getY());
                //Important: set the hidden dialog as the invoker to hide the menu with this dialog lost focus
                popupMenu.setInvoker(hiddenDialog);
                hiddenDialog.setVisible(true);
                popupMenu.setVisible(true);
            }
        }
    });
    try {
        tray.add(trayIcon);
    } catch (AWTException e) {
        System.out.println("TrayIcon could not be added.");
        return;
    }
READ ALSO
Вложенный тернарный оператор

Вложенный тернарный оператор

Прохожу тест-задачу:

403
Scala vs Java, какой язык быстрее [закрыт]

Scala vs Java, какой язык быстрее [закрыт]

Какой язык быстрее java или scala, допустим есть две программы написанные по тому же алгоритму только одна написана на Java а другая на scala, какая...

147
Cannot resolve symbol in package

Cannot resolve symbol in package

При запуске программы открывается следующее окно

111
Как реализовать на Java операцию & из C++?

Как реализовать на Java операцию & из C++?

Пытаюсь реализовать шифр "Кузнечика" на JavaНо встала проблема

144