从 Windows 中出现在文件资源管理器后面的 BAT 启动 javaw JFrame
Start javaw JFrame from BAT appearing behind File Explorer in Windows
我有一个长期以来没有问题的批处理文件,并在 Windows 中使用 javaw.exe 启动了一个 JAR,然后它出现在其他 运行 前面Windows 个应用程序。最近更改了批处理文件,我现在一直遇到 javaw.exe 打开的 JFrame 出现在用于打开 BAT 文件的文件资源管理器后面。
具体来说,它出现在任务栏上,闪烁,但在屏幕上不可见,因为它隐藏在生成它的文件资源管理器后面。它没有被最小化。
以前批次是(有点简化):
rem BOM safeguard
@echo off
set APPDIR=%~dp0
fc "%APPDIR%a.txt" "%APPDIR%b.txt" > fc1.txt
start "" "%APPDIR%..\jre\bin\javaw" -jar "%APPDIR%Testorama.jar"
现在是这样的:
rem BOM safeguard
@echo off
set APPDIR=%~dp0
fc "%APPDIR%a.txt" "%APPDIR%b.txt" > fc1.txt
fc "%APPDIR%a.txt" "%APPDIR%b.txt" > fc2.txt
xcopy /y "%APPDIR%Testorama.jar" "%APPDIR%Temp"
start "" "%APPDIR%..\jre\bin\javaw" -jar "%APPDIR%Testorama.jar"
为了排除 JAR 的问题,我已经替换了它,但它仍然存在。目前 JAR 是一个简单的 main:
package testorama;
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class TestFrame extends JFrame {
public static void main(String[] args) {
JFrame f = new TestFrame();
JPanel p = new JPanel();
p.setPreferredSize(new Dimension(600, 600));
f.add(p);
f.pack();
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
使用上面的新蝙蝠,我可以注释掉 fc
-s 或 xcopy
中的任何一个,它会开始在前面,但如果所有三个都在里面,就会出现问题.在这一点上,我不知道为什么会出现这种不一致。如果我在 start
之后添加一个 pause
它出现在前面,但我不希望提示保持打开状态。
为什么会这样?在维护所有命令(因为它们在 运行 我们的应用程序中有明确的任务)的同时,我能做些什么来缓解这个问题?
我的环境是最新的 Windows10,javaw 是 JRE8。问题发生在具有类似设置的其他机器上,而我还没有测试其他操作系统或 JRE。
根据@Mofi 的输入,我最终通过在 运行 javaw
.
之后执行一个最小的 timeout
命令“解决”了这个问题
我的BAT新造型现在是:
rem BOM safeguard
@echo off
set APPDIR=%~dp0
fc "%APPDIR%a.txt" "%APPDIR%b.txt" > fc1.txt
fc "%APPDIR%a.txt" "%APPDIR%b.txt" > fc2.txt
xcopy /y "%APPDIR%Testorama.jar" "%APPDIR%Temp"
start "" "%APPDIR%..\jre\bin\javaw" -jar "%APPDIR%Testorama.jar"
timeout /T 0
我只能猜测这与父提示的存在有关,在 javaw
想要显示 JFrame 时,或者其他一些模糊的计时问题。
我有一个长期以来没有问题的批处理文件,并在 Windows 中使用 javaw.exe 启动了一个 JAR,然后它出现在其他 运行 前面Windows 个应用程序。最近更改了批处理文件,我现在一直遇到 javaw.exe 打开的 JFrame 出现在用于打开 BAT 文件的文件资源管理器后面。
具体来说,它出现在任务栏上,闪烁,但在屏幕上不可见,因为它隐藏在生成它的文件资源管理器后面。它没有被最小化。
以前批次是(有点简化):
rem BOM safeguard
@echo off
set APPDIR=%~dp0
fc "%APPDIR%a.txt" "%APPDIR%b.txt" > fc1.txt
start "" "%APPDIR%..\jre\bin\javaw" -jar "%APPDIR%Testorama.jar"
现在是这样的:
rem BOM safeguard
@echo off
set APPDIR=%~dp0
fc "%APPDIR%a.txt" "%APPDIR%b.txt" > fc1.txt
fc "%APPDIR%a.txt" "%APPDIR%b.txt" > fc2.txt
xcopy /y "%APPDIR%Testorama.jar" "%APPDIR%Temp"
start "" "%APPDIR%..\jre\bin\javaw" -jar "%APPDIR%Testorama.jar"
为了排除 JAR 的问题,我已经替换了它,但它仍然存在。目前 JAR 是一个简单的 main:
package testorama;
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class TestFrame extends JFrame {
public static void main(String[] args) {
JFrame f = new TestFrame();
JPanel p = new JPanel();
p.setPreferredSize(new Dimension(600, 600));
f.add(p);
f.pack();
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
使用上面的新蝙蝠,我可以注释掉 fc
-s 或 xcopy
中的任何一个,它会开始在前面,但如果所有三个都在里面,就会出现问题.在这一点上,我不知道为什么会出现这种不一致。如果我在 start
之后添加一个 pause
它出现在前面,但我不希望提示保持打开状态。
为什么会这样?在维护所有命令(因为它们在 运行 我们的应用程序中有明确的任务)的同时,我能做些什么来缓解这个问题?
我的环境是最新的 Windows10,javaw 是 JRE8。问题发生在具有类似设置的其他机器上,而我还没有测试其他操作系统或 JRE。
根据@Mofi 的输入,我最终通过在 运行 javaw
.
timeout
命令“解决”了这个问题
我的BAT新造型现在是:
rem BOM safeguard
@echo off
set APPDIR=%~dp0
fc "%APPDIR%a.txt" "%APPDIR%b.txt" > fc1.txt
fc "%APPDIR%a.txt" "%APPDIR%b.txt" > fc2.txt
xcopy /y "%APPDIR%Testorama.jar" "%APPDIR%Temp"
start "" "%APPDIR%..\jre\bin\javaw" -jar "%APPDIR%Testorama.jar"
timeout /T 0
我只能猜测这与父提示的存在有关,在 javaw
想要显示 JFrame 时,或者其他一些模糊的计时问题。