从控制台/命令窗口断开Java应用程序连接

5

可能是重复问题:
有没有办法在Java程序中隐藏Win32启动控制台(如果可能,不使用JNI)

在Windows上批处理文件中运行我的Java Swing应用程序时,当我的Java应用程序正在运行时,控制台/命令窗口仍然保持打开状态。这会在我的任务栏上创建一个额外的窗口,我希望不要有这个窗口。但是当我关闭命令窗口时,它会停止我的Java应用程序。是否有一种方法,可以通过批处理文件或命令行参数或对我的应用程序进行代码更改,在启动我的Swing应用程序并且控制台窗口关闭的同时使java.exe退出,而我的应用程序仍在运行?

主要方法如下:

public static void main(String args[]) {

    ApplContext applContext = new ApplContext();
    Throwable error = null;

    try {
        applContext.setUserConfigDir(args.length>0 ? args[0] : null);
        applContext.loadData();
        ApplTools.initLookAndFeel(Parameters.P_NIMBUS_LAF.of(applContext.getParameters()));
    } catch (Throwable e) {
        error = e;
    }

    // JWorkSheet is a JFrame.
    new JWorkSheet(applContext, error).setVisible();
}    

请问能否让我们看一下你的代码片段?最好是主方法。 - jjnguy
另外,看看这个:https://dev59.com/iHRB5IYBdhLWcg3wXWG2 - daveb
这是一个重复的问题:https://dev59.com/cnVC5IYBdhLWcg3wihmv - Dave Ray
2个回答

8

使用javaw.exe而不是java来运行您的应用程序。如果您正在从批处理文件中运行,请与start命令结合使用:

> start javaw.exe -jar myapp.jar

当以此模式运行时,如果您依赖控制台进行调试,建议设置适当的日志记录或至少重定向输出流。例如,没有控制台,您将永远看不到未处理异常打印的友好堆栈跟踪。
注意:java.exe是Windows控制台应用程序。因此,无论如何启动它或在其中运行哪些线程,都会为其分配控制台。这就是javaw.exe存在的原因。

GUI 应该从一开始就不应该与主线程耦合。 - jjnguy
我完全同意,但是UI是在主线程还是UI线程中初始化对于是否为Java进程构建和维护控制台没有影响。 - Dave Ray
你不需要使用 javaw。只需使用 start /b java MainClass - ceving

1
理想情况下,您最终在代码的某个地方将调用SwingUtilities.invokeLater(Runnable r)。这将把您的GUI代码放入正确的线程中,然后您应该能够在主线程退出后关闭命令行。
以下是我所说的基本示例:
public static void main(String[] args){
    SwingUtilities.invokeLater(new Runnable(){
        public void run(){
            JFrame yourWindow = new YourFrame();
            yourWindow.createAndShow();
        }
    }
}

1
尽管这是初始化Swing UI的正确方式,但当主线程退出时,控制台不会消失。它将一直保留,直到java.exe退出,也就是进程中的最后一个非守护线程退出时。 - Dave Ray
主线程退出后,可以关闭控制台窗口。这是解决具有不同窗口问题的另一种方式吧。 - jjnguy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接