2011-11-30 203 views
1

我看到很多关于这个问题的问题,但都没有解决方案。 我的问题是: 我写了一个具有系统托盘图标的小型java应用程序。 当Windows资源管理器崩溃时(可以用停止explorer.exe进程来模拟),恢复后,我的系统托盘图标消失,但我的应用程序进程继续运行。资源管理器崩溃后恢复Java系统托盘图标

当explorer.exe重新加载时,有没有办法恢复我的图标?

我的问题是,我没有一个窗口,我去。我的系统托盘本身就是一些命令的启动器。我需要听听Windows任务栏的娱乐,然后我可以重新添加它。

+0

参见http://stackoverflow.com/questions/7923645/how-to-re-add-icon-to-system-tray-after-explorer-exe-crash/7923753 – 9000

+0

我之前看过这个帖子。你知道该怎么做吗? – SharonBL

+0

唉,我没有Windows机器来试试它。我在评论中链接了一篇文章,展示了如何使用[JNA](https://github.com/twall/jna)进行操作。也许它有效。另外,我不能说这个图书馆是否对你的程序过度。作为一个快速解决方案,您可以每隔一分钟左右重新注册一次图标 - 最终它会再次显示。 – 9000

回答

0

我建议在窗口激活事件中重新注册托盘图标。这样,只要您切换回您的应用程序,托盘图标就会更新。例如:

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class MyApp extends JFrame 
{ 
    private static TrayIcon trayIcon = null; 

    public static void main(String[] args) { 
     JFrame app = new MyApp(); 
     app.setSize(400,400); 
     app.setVisible(true); 

     final Image image = Toolkit.getDefaultToolkit().getImage("MyImage.gif"); 

     app.addWindowListener(new WindowAdapter() { 
     public void windowActivated(WindowEvent ev) { 
      registerTrayIcon(image); 
     } 
     }); 
    } 

    private static void registerTrayIcon(Image image) { 
     SystemTray tray = SystemTray.getSystemTray(); 

     if(trayIcon != null) { 
      tray.remove(trayIcon); 
     } 

     trayIcon = new TrayIcon(image, "Tray Demo", null); 

     try { 
      tray.add(trayIcon); 
     } 
     catch(Exception ex) { 
      throw new RuntimeException(ex); 
     } 
    } 
} 
+0

我的问题是,我没有一个窗口,我去。我的系统托盘本身就是一些命令的启动器。我需要听听Windows任务栏的娱乐,然后我可以重新添加它。 – SharonBL

+0

请更新您的原始问题 –

+0

做到了。 10x :-) – SharonBL