![](/img/trans.png)
[英]How to add MenuItem to Menu of a TrayIcon ,dynamically in java?
[英]Changing the enabled state of a TrayIcon menu item dynamically
我有成功使用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);
代替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.