首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态更改TrayIcon菜单项的启用状态

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

Stack Overflow用户
提问于 2018-11-26 20:03:23
回答 2查看 181关注 0票数 0

我有成功使用SystemTrayTrayIconPopupMenuMenuItem的代码。我试图根据其他几个线程中正在发生的事情的状态,使MenuItem的启用状态变得准确。我有能力运行一个进程(我称之为getUnknownConditionFromTheThreads()),它可以告诉我是否需要在特定时间启用或禁用菜单项。

问题是,当用户右击托盘图标时,菜单项在运行之前显示为setEnabled()

换句话说,用户右击托盘图标,菜单以启用/禁用状态显示,然后mouseClicked()方法运行,setEnabled()运行,但为时已晚!

因此,我可以尝试将状态注入托盘图标,以便预先准备就绪,但这将意味着很大的复杂性,因为有许多独立的线程,而且没有人“知道”菜单项的启用/禁用状态应该是什么。

我的问题是:根据托盘图标中的用户生成的事件,是否有“技巧”使弹出菜单项启用/禁用?

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

下面是代码的工作方式:假设菜单项的默认设置已启用,下一次调用getUnknownConditionFromTheThreads()将返回false。用户将在第一次右键单击时看到已启用的项。下一次右击,它将被禁用.

代码语言:javascript
复制
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);
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-26 20:15:45

不要使用mouseClicked,而是使用mousePressed

代码语言:javascript
复制
trayIcon.addMouseListener(new MouseAdapter() {
    @Override
    public void mousePressed(MouseEvent e) {
        boolean someCondition = getUnknownConditionFromTheThreads();
        itemToDisable.setEnabled(someCondition);  // Reflected first time
    }
});
票数 0
EN

Stack Overflow用户

发布于 2018-11-27 00:14:56

你也可以尝试:

代码语言:javascript
复制
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);
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53488197

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档