【问题标题】:Dynamicaly update tooltip to show timer动态更新工具提示以显示计时器
【发布时间】:2013-12-05 13:22:48
【问题描述】:

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

更新:

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

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

这个正在更新工具提示

MyClass.trayIcon.setToolTip();

【问题讨论】:

  • 我认为对于基于 ToolTip 的容器来说不是更简单的方法,作为替代可以是布局 JLabel,那么一切皆有可能(如果没有被 Thread.sleep 阻止)
  • JComponent 有createToolTip() 方法。它只是创建了新的 JToolkit(请参阅此处 kickjava.com/src/javax/swing/JComponent.java.htm)也许您可以对其进行子类化并在其或其父组件上调用重绘?
  • @Piro 但它在显示时不会更新工具提示
  • 您是否需要它的行为与工具提示完全相同(仅在鼠标悬停时显示)?
  • @Piro 当应用程序在托盘中时,它应该时间到某个事件。还有其他想法如何制作吗?

标签: java swing icons tooltip tray


【解决方案1】:

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

这是可运行的示例(您需要 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();
    }
}

【讨论】:

    猜你喜欢
    • 2012-10-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-07
    • 1970-01-01
    相关资源
    最近更新 更多