Подсказка инструмента Java Swing с различными сообщениями

Есть ли способ в java swing показать всплывающую подсказку с различными сообщениями, на самом деле я работаю над приложением, в котором мне нужно обновить текущий статус приложения в подсказке на панели задач. Заранее спасибо.


person NoNaMe    schedule 04.10.2012    source источник
comment
используйте встроенный метод для отображения сообщения (содержится в моем последнем коде), и это значение вы также можете синхронизировать с ToolTip   -  person mKorbel    schedule 04.10.2012


Ответы (3)


+1 Дэну и Гийому Полету. Просто используйте setToolTipText() для компонента trayIcon.

Я сделал для вас небольшой пример.

Он создаст TrayIcon и добавит его к SystemTray. Там после ToolTip из TrayIcon будут обновляться каждые 5 секунд:

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.MalformedURLException;
import java.net.URL;
import javax.swing.SwingUtilities;
import javax.swing.Timer;

public class SystemTrayExample {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new SystemTrayExample().createAndAddTrayIcon();
            }
        });
    }

    private void createAndAddTrayIcon() {
        try {
            initComponents();
        } catch (MalformedURLException ex) {
            ex.printStackTrace();
        }
    }

    private void initComponents() throws MalformedURLException {

        //Check the SystemTray is supported
        if (!SystemTray.isSupported()) {
            System.out.println("SystemTray is not supported");
            return;
        }
        final PopupMenu popup = new PopupMenu();
        final TrayIcon trayIcon = new TrayIcon(Toolkit.getDefaultToolkit().createImage(new URL("http://docs.oracle.com/javase/tutorial/uiswing/examples/misc/TrayIconDemoProject/src/misc/images/bulb.gif")));
        trayIcon.setToolTip("I am the initial message");

        final SystemTray tray = SystemTray.getSystemTray();

        // Create a pop-up menu components
        MenuItem exitItem = new MenuItem("Exit");
        exitItem.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        });

        //Add components to pop-up menu
        popup.add(exitItem);

        //set popmenu
        trayIcon.setPopupMenu(popup);

        try {
            tray.add(trayIcon);
        } catch (AWTException e) {
            System.out.println("TrayIcon could not be added.");
        }

        int delay = 5000; //milliseconds
        final Timer timer = new Timer(delay, new ActionListener() {

            int count = 1;

            @Override
            public void actionPerformed(ActionEvent evt) {

                System.out.println("Updating on EDT " + (SwingUtilities.isEventDispatchThread() ? "Yes" : "No"));

                if (count == 3) {
                    trayIcon.setToolTip("I am the last message");
                    ((Timer) evt.getSource()).stop();//stop timer
                }
                if (count == 2) {//check if we should change tooltip
                    trayIcon.setToolTip("I am the second message");
                }
                if (count == 1) {
                    trayIcon.setToolTip("I am the  first message");
                }

                count++;

            }
        });

        timer.start();//start timer to change tooltip
    }
}
person David Kroukamp    schedule 04.10.2012
comment
@GuillaumePolet спасибо, и это было просто дополнением к вашему совету и совету Дэна: P - person David Kroukamp; 04.10.2012

Вы можете изменить всплывающую подсказку любого JComponent во время выполнения, вызвав метод setToolTipText().

person Dan D.    schedule 04.10.2012

Для TrayIcon у вас есть метод trayIcon.setToolTip. Вы можете вызвать его в любое время, и он сразу же обновится, даже после добавления значка в системный трей.

person Guillaume Polet    schedule 04.10.2012
comment
@sfshah Вызов этого метода из другого класса ничего не меняет. Вы имеете в виду, что звоните из другого потока, отличного от EDT? Если это так, вы всегда можете обернуть свой вызов в SwingUtilities.invokeLater(). - person Guillaume Polet; 04.10.2012