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

时间:2018-11-26 20:03:23

标签: java windows awt system-tray trayicon

我有成功使用SystemTrayTrayIconPopupMenuMenuItem的代码。我试图根据其他几个线程中发生的事件的状态来使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);

2 个答案:

答案 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);
    }
}