【问题标题】:Changing the enabled state of a TrayIcon menu item dynamically动态更改 TrayIcon 菜单项的启用状态
【发布时间】:2018-11-26 20:03:23
【问题描述】:

我有成功使用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);

【问题讨论】:

    标签: java windows awt system-tray trayicon


    【解决方案1】:

    mousePressed代替mouseClicked

    trayIcon.addMouseListener(new MouseAdapter() {
        @Override
        public void mousePressed(MouseEvent e) {
            boolean someCondition = getUnknownConditionFromTheThreads();
            itemToDisable.setEnabled(someCondition);  // Reflected first time
        }
    });
    

    【讨论】:

      【解决方案2】:

      你也可以试试:

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

      【讨论】:

      • 谢谢,但是当我右键单击 TrayIcon 时,此方法对我没有触发。另外,我想你的意思是super.show(origin, x, y);
      猜你喜欢
      • 1970-01-01
      • 2018-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-25
      • 1970-01-01
      相关资源
      最近更新 更多