Восстановление значка Java в системном трее после сбоя проводника

Я видел много вопросов по этой проблеме, но ни один из них не имел решения. Моя проблема: я написал небольшое java-приложение со значком на панели задач. Когда происходит сбой проводника Windows (можно смоделировать с остановкой процесса explorer.exe), после его восстановления мой значок на панели задач исчезает, но процесс моего приложения продолжает работать.

Есть ли способ восстановить мою иконку при перезагрузке explorer.exe?

Моя проблема в том, что у меня нет окна, в которое я захожу. Сам мой системный трей является средством запуска некоторых команд. Мне нужно что-то, что прослушивает воссоздание панели задач Windows, а затем я могу снова добавить это.


person SharonBL    schedule 30.11.2011    source источник
comment
См. также stackoverflow.com/questions/7923645/   -  person 9000    schedule 01.12.2011
comment
Я видел эту ветку раньше. Вы знаете, как это сделать?   -  person SharonBL    schedule 02.12.2011
comment
Увы, у меня нет машины с Windows, чтобы попробовать. Я связал сообщение в комментариях, показывающее, как это сделать с помощью JNA. Может быть, это работает. Кроме того, я не могу сказать, является ли эта библиотека излишним для вашей программы. В качестве быстрого решения вы можете просто перерегистрировать свой значок каждую минуту или около того — в конце концов он снова появится.   -  person 9000    schedule 02.12.2011


Ответы (1)


Я бы рекомендовал перерегистрировать значок в трее в событии активации окна. Таким образом, значок в трее будет обновляться всякий раз, когда вы возвращаетесь к своему приложению. Например:

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);
        }
   }
}
person Dmitry B.    schedule 30.11.2011
comment
Моя проблема в том, что у меня нет окна, в которое я захожу. Сам мой системный трей является средством запуска некоторых команд. Мне нужно что-то, что прослушивает воссоздание панели задач Windows, а затем я могу снова добавить это. - person SharonBL; 01.12.2011