我有成功使用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);发布于 2018-11-26 20:15:45
不要使用mouseClicked,而是使用mousePressed
trayIcon.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
boolean someCondition = getUnknownConditionFromTheThreads();
itemToDisable.setEnabled(someCondition); // Reflected first time
}
});发布于 2018-11-27 00:14:56
你也可以尝试:
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);
}
}https://stackoverflow.com/questions/53488197
复制相似问题