英文:
Swing JDialog is showing fine when I run it from eclipse but not working from windows service(services.msc)
问题
I have translated the Java code portion of your request. Here it is:
我有一个Java应用程序,它在特定的时间间隔内运行并显示一个弹出窗口(使用Java Swing制作)。当我从Eclipse运行应用程序时,它运行正常。但是,当我创建一个JAR文件并使用"java -jar"命令运行它时,它也正常工作。但是,当我从Windows服务(services.msc)运行JAR文件时,弹出窗口不会出现,除了弹出窗口外,所有其他功能都正常工作,如日志记录和数据获取等。
我没有找到任何解决方案,我已经尝试了Stack Overflow上的所有解决方案,但问题仍然存在。
我已经粘贴了所有信息。
提前感谢您。
Java代码(此方法将在间隔内调用):
(以下是您提供的Java代码的翻译)
请注意,这只是Java代码的翻译。如果您需要有关其他部分的帮助,请提出具体的问题。
英文:
I have a java application which runs in a certain interval of time and show a popup(made with java swing). When I run the application from eclipse it works fine. After I created a jar and run it using java -jar command, It is also working fine. But when I run the jar file from windows service(services.msc) Popup window is not appeared, except popup all are working properly such as logging data fetching etc.
I did not find any solution for that I have applied all the solution in stack overflow but the problem persist.
I have pasted all the information.
Thanks In advance
Java code (this method will be called in interval)
public static void showUserMsg(final int MsgId, String msgText) {
logger.info("Entry in showUserMsg to show notification");
logger.info("Message: " + msgText);
Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
final int screenWidth = (int) dim.getWidth();
final int screenHeight = (int) dim.getHeight();
try {
// JDialog.setDefaultLookAndFeelDecorated(true);
final JDialog dialog = new JDialog(new JFrame());
dialog.setTitle("You have message");
dialog.setAutoRequestFocus(false);
// dialog.getLayeredPane().getComponent(1).setFont(new Font("Lucida",Font.PLAIN,18));
dialog.setAlwaysOnTop(true);
dialog.setVisible(true);
dialog.setSize(600, 450);
dialog.setLocation(screenWidth / 2 - 250 + 171, screenHeight / 2 - 250);
dialog.setResizable(true);
dialog.setModal(false);
dialog.setModalityType(Dialog.ModalityType.MODELESS);
dialog.requestFocus();
final Image img = ImageIO.read(EcsApplication.class.getResource("icons/notify.png"));
dialog.setIconImage(img);
logger.info("Dialog location: " + dialog.getLocation());
Container pane = dialog.getContentPane();
JTextPane contentLabel = new JTextPane();
contentLabel.setText("\n\n\n\n\n" + msgText);
contentLabel.setEditable(false);
contentLabel.setVisible(true);
contentLabel.setFont(new Font("Verdana", Font.ROMAN_BASELINE, 18));
contentLabel.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
contentLabel.setBounds(100, 100, 300, 200);
JButton okButton = new JButton("Yes, I have read the message");
okButton.setBounds(120, 330, 400, 50);
okButton.setFont(new Font("Verdana", Font.ROMAN_BASELINE, 18));
okButton.setBorder(BorderFactory.createLineBorder(new Color(68, 155, 221), 1));
okButton.setBackground(new Color(144, 186, 227));
okButton.setFocusable(true);
okButton.setVisible(true);
StyledDocument doc = contentLabel.getStyledDocument();
SimpleAttributeSet center = new SimpleAttributeSet();
StyleConstants.setAlignment(center, StyleConstants.ALIGN_CENTER);
doc.setParagraphAttributes(0, doc.getLength(), center, false);
pane.add(okButton);
pane.add(contentLabel);
dialog.addWindowListener(new WindowListener() {
@Override
public void windowOpened(WindowEvent e) {
}
@Override
public void windowClosing(WindowEvent e) {
logger.info("windowClosing event");
try {
statusByMsgId(MsgId);
JDialog warning = new JDialog();
warning.setTitle("Information");
warning.setAlwaysOnTop(true);
warning.setVisible(true);
warning.setSize(300, 150);
warning.setLocation(screenWidth / 2 - 150, screenHeight / 2 - 150);
warning.setResizable(false);
warning.setModal(true);
warning.requestFocus();
warning.setIconImage(img);
Container pane = warning.getContentPane();
pane.setBounds(100, 100, 100, 100);
JTextPane warningMsg = new JTextPane();
warningMsg.setText("You have read the message");
warningMsg.setEditable(false);
warningMsg.setVisible(true);
warningMsg.setBounds(100, 100, 300, 200);
warningMsg.setFont(new Font("Verdana", Font.ROMAN_BASELINE, 14));
StyledDocument doc1 = warningMsg.getStyledDocument();
SimpleAttributeSet center1 = new SimpleAttributeSet();
StyleConstants.setAlignment(center1, StyleConstants.ALIGN_CENTER);
doc1.setParagraphAttributes(0, doc1.getLength(), center1, false);
pane.add(warningMsg);
} catch (Exception ex) {
ex.printStackTrace();
logger.error(ex.getMessage(), ex);
}
}
@Override
public void windowClosed(WindowEvent e) {
}
@Override
public void windowIconified(WindowEvent e) {
}
@Override
public void windowDeiconified(WindowEvent e) {
}
@Override
public void windowActivated(WindowEvent e) {
}
@Override
public void windowDeactivated(WindowEvent e) {
}
});
okButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
logger.info("OK button clicked.");
try {
statusByMsgId(MsgId);
} catch (Exception ex) {
ex.printStackTrace();
// InfoLogger.printInfo(EcsService.class, "showUserMsg", "Dialog box not loaded.");
// InfoLogger.printExceptionLog("EcsService", "showUserMsg", ex);
logger.error(ex.getMessage(), ex);
}
dialog.setVisible(false);
}
});
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
logger.info("Exit in showUserMsg");
}
Folder structure to create service:
Inside the classes folder java class file is present :
public class EcsClientService
{
Process proc;
private static EcsClientService serviceInstance;
private boolean stopped;
public EcsClientService() {
this.stopped = false;
}
public static void windowsService(final String[] array) {
String anObject = "start";
if (array.length > 0) {
anObject = array[0];
}
if ("start".equals(anObject)) {
EcsClientService.serviceInstance.start();
}
else {
EcsClientService.serviceInstance.stop();
}
}
public void start() {
this.stopped = false;
try {
System.out.println("currentDirectory>>> " + new File(EcsClientService.class.getProtectionDomain().getCodeSource().getLocation().getPath()).getParentFile().getAbsolutePath().replace("%20", " "));
this.proc = Runtime.getRuntime().exec("cmd.exe /c start ECSClientService.bat");
}
catch (Exception ex) {
ex.printStackTrace();
}
while (!this.stopped) {
synchronized (this) {
try {
this.wait(60000L);
}
catch (InterruptedException ex2) {}
}
}
}
public void stop() {
this.stopped = true;
synchronized (this) {
this.notify();
}
try {
Runtime.getRuntime().exec("wmic Path win32_process Where \"CommandLine Like '%ECSClientService.bat%' OR CommandLine Like '%-jar ECSClientService.jar%'\" Call Terminate");
}
catch (Exception ex) {}
}
static {
EcsClientService.serviceInstance = new EcsClientService();
}
}
InstallService.bat
for /f %%i in ("%20") do set curpath=%%~dpi
common\ecsClient.exe //DS//ECSClientService
common\ecsClient.exe //IS//ECSClientService --Install=%curpath%\common\ecsClient.exe --Description="Employee Communication Service" --Jvm=auto --Classpath=%curpath%\common\classes --StartMode=jvm --StartClass=EcsClientService --StartMethod=windowsService --StartParams=start --StopMode=jvm --StopClass=EcsClientService --StopMethod=windowsService --StopParams=stop --StopMode=jvm --Startup=auto --LogPath=common\logs --StdOutput=auto --StdError=auto
pause
StartService.bat
common\ecsClient.exe //ES//ECSClientService
StopService.bat
common\ecsClient.exe //SS//ECSClientService
UninstallService.bat
common\ecsClient.exe //DS//ECSClientService
ECSClientService.bat
@ECHO OFF
SET CampaignArg=%1
for /f %%i in ("%0") do set curpath=%%~dpi
cd /d %curpath%
java -jar ECSClientService.jar %CampaignArg%
pause
答案1
得分: 1
我认为您的问题与Java无关。据我所知,服务在后台运行,无论用户是否登录,因此它们通常无法访问GUI。
如果您的应用程序应该在后台运行但在用户上下文中,也许您想将您的应用程序移动到自动启动程序文件夹,这样Windows会在用户登录时启动它。
英文:
I believe your problem is not in Java. AFAIK services run in the background - regardless whether a user is logged on or not. Thus they usually have no access to the GUI.
If your application shall run in the background but in user context, maybe you want to move your application to the autostart program folder so Windows will start it when a user logs on.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论