[java.awt.Trayicon在将Java应用程序安装为Windows 7服务时未显示

问题描述 投票:2回答:2

我已经在Windows 7(32位)操作系统上将Java应用程序安装为Windows服务。服务启动时,我的应用程序应在通知区域显示java.awt.TrayIcon。但是它没有显示图标。相同的应用程序在Windows XP上运行正常。有人对此有任何想法吗?

java windows-7 windows-services trayicon
2个回答
1
投票

Windows上的服务不是图形服务。因为它运行时没有任何用户登录。如果要使用任务栏图标和图形窗口来管理服务,则必须编写另一个与服务进行通信的程序(局域网,dcom等),并将此程序添加到会话启动中。(通过这种方式,我在计算机上完成了自己的java服务)。


好吧,我在Windows Server 2003下工作。也许服务从Windows 2003开始就没有GUI?

您必须开发的代码取决于您想要什么?只是有一个trayicon监视服务进程是否仍在运行?单击系统托盘时显示参数窗口吗?...

我为您提供了一个简单的代码(没有异常管理来澄清代码),以监视服务仍在运行并正在响应(这是标准的Java代码,不需要特殊的lib):

系统托盘程序:

//if any Exception --> ERROR CODE
Socket socket = new Socket("localhost", 25146);
DataOutputStream outToServer = new DataOutputStream(socket.getOutputStream());
BufferedReader inFromUser = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while (true) {
    outToServer.writeBytes("ping\n");
    //Wait maximum 5s to have an answer from the service
    for (int i = 0; inFromUser.ready() == false && i < 5; ++i) {
        Thread.sleep(1000);
    }
    if (inFromUser.ready() == false) {
        //ERROR CODE (change systrat icon, display balloon tooltip,...)
    } else {
        pong = inFromUser.readLine();
        //Check the answer
    }   

    //Check only every second (don't flood yout computer ;))
    Thread.sleep(1000);
}
inFromUser.close();
outToServer.close();
socket.close();

服务程序代码:

ServerSocket socket = new ServerSocket(this._port);
while (true) {
    Socket connection = socket.accept();
    Thread thread = new Thread(new Runnable {
        BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connection.getInputStream()));
        DataOutputStream outToClient = new DataOutputStream(connection.getOutputStream());
        Scanner scanner = new Scanner(inFromClient);
        while (scanner.hasNextLine()) {
            outToClient.writeBytes(scanner.nextLine());     
        }
        inFromClient.close();
        outToClient.close();
        connection.close();     
    });
    thread.start();
}

如果要弹出参数窗口,您可以尝试在系统托盘程序中编写GUI,将结果写入参数文件,然后向服务发送特殊关键字以重新加载参数文件...或将GUI直接写到您的服务中,发送一个特殊的关键字,然后执行jframe.setVisible(true)并希望它将在当前会话中显示...:)


0
投票

Microsoft在2006年更改了交互式服务的工作方式。由于“会话0隔离”,Windows NT,XP和Server 2003的工作方式不再在Vista,7或Server 2008中工作。

在这里阅读更多:


0
投票

我有一个问题。我正在使用Java swing创建桌面应用程序,并且想在应用程序未运行时在桌面中显示通知。那是设置特定时间,并且该时间显示通知。但是那时候我的应用程序可能没有运行统计信息。使用taryIcon可以吗?

© www.soinside.com 2019 - 2024. All rights reserved.