Сервис на окнах не является графическим. Потому что он работает без регистрации пользователя.
Если вы хотите иметь иконку в трее и графическое окно для управления вашим сервисом, вам нужно написать другую программу, которая будет взаимодействовать с вашим сервисом (локальная сеть, dcom, ...) и добавить эту программу в запуск сеанса.
(Именно так я и сделал свой собственный java сервис на своих компьютерах).
Хорошо, я работал под Windows Server 2003. Может быть, служба не может иметь графический интерфейс с Windows 2003?
Код, который вы должны разработать, зависит от того, что вы хотите? Просто есть трейник, чтобы следить за тем, что сервисный процесс все еще работает? Отображение параметров окна при нажатии на системный блок? ...
Я поместил вам простой код (без исключений для уточнения кода), чтобы следить за тем, что служба по-прежнему работает и отвечает (это стандартный код Java, никакой особой необходимости в lib):
Программа systray:
//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 в вашей программе systray, записать результат в файл параметров и отправить специальное ключевое слово в службу для перезагрузки файлов параметров ... или либо написать GUI непосредственно в ваш сервис, отправить специальное ключевое слово, а затем выполнить jframe.setVisible (true) и надеяться, что он будет отображаться в текущем сеансе ...:)