我的java应用程序当前在系统托盘中有一个图标。然而,当系统托盘崩溃时(您可以通过杀死任务栏中的explorer.exe来模拟这种情况),系统托盘返回后图标就会消失。
当我检查 SystemTray.getSystemTray().getTrayIcons() 中系统托盘中的图标时,它总是显示我的 TrayIcon 仍在系统托盘中,即使在它崩溃并重新加载之后并且我的托盘图标更长了。
目前,我每 15 秒左右删除和添加一次图标,但是有没有其他方法可以实现此操作,以便它不会不断消失和出现并烦扰用户?
只是猜测。
每隔几秒检查一次explorer.exe的pid。如果已更改,请注销您的托盘图标并重新注册。
以防万一其他人偶然发现这个问题并想知道发生了什么,最后我不得不在几秒钟后坚持删除和添加图标,因为 Windows 不会更新托盘图标状态的 JVM...自然不是最好的解决办法,但似乎也没有更好的办法了。
这就是我修复它的方法。这是第一个答案的扩展。我会更详细地介绍一下。
我有一个正在运行的线程,它每 10 秒检查一次资源管理器的 pid(进程 ID)。如果进程 ID 发生变化,则会调用一个新方法来处理已消失的旧图标并添加一个新图标。
private volatile boolean isRunning = true;
public void startExplorerWatcherThread() {
checkTrayIconThread = new Thread(){
@Override
public void run() {
int prevProcessId = 0;
int currProcessId = 0;
while(isRunning) {
try {
//Get the current process id from another method
currProcessId = explorerPid();
// Set initial process ID
if ( prevProcessId == 0 ) {
prevProcessId = currProcessId;
}
//thread sleeps for 10 sec and then checks again
Thread.sleep( 10000 );
} catch ( InterruptedException e ) {
System.out.println(e.toString());
} catch ( IOException e ) {
System.out.println(e.toString());
}
//Check if the process id has changed or not
if ( prevProcessId != currProcessId ) {
prevProcessId = currProcessId;
// call to the method that disposes the old icon and creates a new one and registers it
createNewTrayIcon();
} else {
System.out.println("Windows Explorer stable.");
}
}
}
};
//Start the thread
checkTrayIconThread.start();
}