我有成功使用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);
答案 0 :(得分:0)
使用mouseClicked
代替mousePressed
:
trayIcon.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
boolean someCondition = getUnknownConditionFromTheThreads();
itemToDisable.setEnabled(someCondition); // Reflected first time
}
});
答案 1 :(得分:0)
您也可以尝试:
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);
}
}