我试图让我的应用程序在任务栏上最小化,并在双击trayIcon
时恢复。我还有一个弹出菜单,其中有一个项目可以在单击时恢复窗口。
trayIcon = new TrayIcon(image, "Anything", popup);
trayIcon.addActionListener(actionListener);
trayIcon.addMouseListener(mouseListener);
sysTray.add(trayIcon);
以下是actionListener
和mouseListener
的代码:
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"))
如何消除这种情况,如果可能的话,将两个听众合并为一个?
答案 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()
来解决此问题。