动态更新工具提示以显示计时器

时间:2013-12-05 13:22:48

标签: java swing icons tooltip tray

我有一个应用程序,当它被最小化时会进入系统托盘。我需要在其上显示带有计时器的工具提示。一切都很好,但是当工具提示显示时,我无法刷新工具提示。我可以以其他方式刷新它,除了制作假鼠标事件并处理它以欺骗工具提示,如here,或者这是唯一的方法吗?

UPD:

代码我用来设置工具提示。

TrayIcon trayIcon;
SystemTray tray;
tray=SystemTray.getSystemTray();
trayIcon=new TrayIcon(image, "tooltipText");
tray.add(trayIcon);

并且这个正在更新工具提示

MyClass.trayIcon.setToolTip();

1 个答案:

答案 0 :(得分:2)

TrayIcon有点问题,因为它与Java AWT / Swing组件的其余部分不是Component。我找到了解决方法,但它与工具提示不完全相同。 TrayIcon具有displayMessage方法,可用于代替工具提示。我试图让它表现得像工具提示(在悬停时显示)但不支持所有鼠标事件,因此必须始终显示消息,或者单击图标。此外,我对其他操作系统上显示的消息的实现有一些担忧。我只在MS Windows XP SP3上测试过,这是结果(它每1秒更新一次): screenshot of TrayIcon message

这是runnable示例(您需要运行image.jpeg):

import java.awt.AWTException;
import java.awt.Image;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.SystemTray;
import java.awt.TrayIcon;
import java.awt.TrayIcon.MessageType;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.imageio.ImageIO;
import javax.swing.Timer;


public class TestTray {
    final ActionListener menuItemCloseAction = new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            System.exit(0);
        }
    };
    final MenuItem menuItemClose = new MenuItem("Close");
    final PopupMenu menu = new PopupMenu();
    final Image image;
    {
        Image tmp = null; 
        try {
            tmp = ImageIO.read(TestTray.class.getResourceAsStream("image.jpeg"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        image = tmp;
    }
    final TrayIcon trayIcon = new TrayIcon(image,null,menu);
    final SystemTray tray = SystemTray.getSystemTray();
    final DateFormat dateFormat = new SimpleDateFormat("HH:MM:ss");
    final ActionListener timerAction = new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            String msg = "Time is: "+ dateFormat.format(new Date());
            //trayIcon.setToolTip(msg);
            trayIcon.displayMessage("", msg, MessageType.NONE);
        }
    };

    final Timer timer = new Timer(100, timerAction);
    {
        menu.add(menuItemClose);
        menuItemClose.addActionListener(menuItemCloseAction);
        try {
            tray.add(trayIcon);
        } catch (AWTException e) {
            e.printStackTrace();
        }
        timer.start();
    }

    public static void main(String[] args) {
        new TestTray();
    }
}