我有一个应用程序,当它被最小化时会进入系统托盘。我需要在其上显示带有计时器的工具提示。一切都很好,但是当工具提示显示时,我无法刷新工具提示。我可以以其他方式刷新它,除了制作假鼠标事件并处理它以欺骗工具提示,如here,或者这是唯一的方法吗?
UPD:
代码我用来设置工具提示。
TrayIcon trayIcon;
SystemTray tray;
tray=SystemTray.getSystemTray();
trayIcon=new TrayIcon(image, "tooltipText");
tray.add(trayIcon);
并且这个正在更新工具提示
MyClass.trayIcon.setToolTip();
答案 0 :(得分:2)
TrayIcon
有点问题,因为它与Java AWT / Swing组件的其余部分不是Component
。我找到了解决方法,但它与工具提示不完全相同。 TrayIcon
具有displayMessage
方法,可用于代替工具提示。我试图让它表现得像工具提示(在悬停时显示)但不支持所有鼠标事件,因此必须始终显示消息,或者单击图标。此外,我对其他操作系统上显示的消息的实现有一些担忧。我只在MS Windows XP SP3上测试过,这是结果(它每1秒更新一次):
这是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();
}
}