繁体   English   中英

动态更改TrayIcon菜单项的启用状态

[英]Changing the enabled state of a TrayIcon menu item dynamically

我有成功使用SystemTrayTrayIconPopupMenuMenuItem 我试图根据其他几个线程中发生的事情的状态来获取MenuItem的启用状态。 我有能力运行一个进程(我叫getUnknownConditionFromTheThreads() ),该进程可以告诉我是否需要在特定的特定时间启用或禁用菜单项。

问题是,当用户右键单击任务栏图标时,将运行setEnabled() 之前显示菜单项。

换句话说,用户右键单击任务栏图标,菜单显示当时的启用/禁用状态,然后运行mouseClicked()方法和setEnabled()但是为时已晚!

因此,我可以尝试将状态泵入任务栏图标,以便提前准备好状态,但这将意味着很多复杂性,因为有许多独立线程,并且其中没有一个“知道”该线程的启用/禁用状态。菜单项应该是。

我的问题:是否有一个“技巧”可以根据用户在任务栏图标中生成的事件来启用/禁用弹出菜单项?

下面的代码通常是我在做什么。 这里没有“花哨”的地方,只是表明当用户右键单击时,启用/禁用菜单项不会反映出来。

现在,代码的工作方式如下:说说菜单项的默认值已启用,下一次调用getUnknownConditionFromTheThreads()将返回false。 用户将在第一次单击时看到启用的项目。 下次右键单击,它将被禁用。

PopupMenu popup = new PopupMenu();
final MenuItem itemToDisable = new MenuItem("Testing");
ActionListener listener = new ActionListener(){
    public void actionPerformed(ActionEvent arg0) {
    .....
    }
};
itemToDisable.addActionListener(listener);
popup.add(itemToDisable);
trayIcon = new TrayIcon(xImg, xMsg, popup);
trayIcon.addActionListener(listener);
trayIcon.addMouseListener(new MouseAdapter() {
    @Override
    public void mouseClicked(MouseEvent e) {
        boolean someCondition = getUnknownConditionFromTheThreads();
        itemToDisable.setEnabled(someCondition);  // Not reflected first time
    }
});
SystemTray.getSystemTray().add(trayIcon);

代替mouseClicked ,使用mousePressed

trayIcon.addMouseListener(new MouseAdapter() {
    @Override
    public void mousePressed(MouseEvent e) {
        boolean someCondition = getUnknownConditionFromTheThreads();
        itemToDisable.setEnabled(someCondition);  // Reflected first time
    }
});

您也可以尝试:

PopupMenu popup = new PopupMenu() {
    @Override
    public void show(Component origin, int x, int y) {
        boolean someCondition = getUnknownConditionFromTheThreads();
        itemToDisable.setEnabled(someCondition);  // Reflected first time
        super(origin, x, y);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM