ActionListener& MouseListener冲突

时间:2014-07-04 17:59:59

标签: java nullpointerexception listener actionlistener mouselistener

我试图让我的应用程序在任务栏上最小化,并在双击trayIcon时恢复。我还有一个弹出菜单,其中有一个项目可以在单击时恢复窗口。

    trayIcon = new TrayIcon(image, "Anything", popup);
    trayIcon.addActionListener(actionListener);
    trayIcon.addMouseListener(mouseListener);
    sysTray.add(trayIcon);

以下是actionListenermouseListener的代码:

private ActionListener actionListener = new ActionListener()
{
   @Override
   public void actionPerformed(ActionEvent e) 
   {
      if (e.getActionCommand().equals("Restore"))
      { // RIGHT CLICK -> RESTORE
        // Do something
      }
   }
};

private MouseListener mouseListener = new MouseListener()
{
   @Override
   public void mouseClicked(MouseEvent e) 
   {
       if (javax.swing.SwingUtilities.isLeftMouseButton(e) && e.getClickCount()>1)                                                  
       {  // DOUBLE LEFT MOUSE CLICK
          // Do something
       }
    }
    // Rest of the code
 }

弹出式菜单的Restore选项工作正常,但是当我双击系统托盘上的trayIcon时,我会在第Null Pointer Exception行获得if(e.getActionCommand().equals("Restore"))

如何消除这种情况,如果可能的话,将两个听众合并为一个?

1 个答案:

答案 0 :(得分:1)

N.B。这个答案来自于评论中与OP的对话,而一些解决方案来自OP

在触发事件时,TrayIcon不会填充ActionCommand字段,因此代码会因NPE而死亡。

由于托盘图标仅在双击或在同步操作(通过键盘)时才调用其ActionListener,因此您可以创建一个RestoreListener,但不会检查该条件,并且仅与托盘图标和“恢复”菜单项一起使用。

private ActionListener restoreListener = new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        // Do the actual restoration
    }
};

实际上将它添加到项目中......

trayIcon = new TrayIcon(image, "Anything", popup);
trayIcon.addActionListener(restoreListener);

MenuItem restoreMenuItem = new MenuItem(...);
restoreMenuItem.addActionListener(restoreListener);

这似乎与MouseListener略有不同,因为它没有将窗口置于顶部,可以通过调用toTop()来解决此问题。