【发布时间】:2018-11-26 20:03:23
【问题描述】:
我有成功使用SystemTray、TrayIcon、PopupMenu、MenuItem 的代码。我试图让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);
【问题讨论】:
标签: java windows awt system-tray trayicon