从控制台/命令窗口断开java应用程序[重复]

Posted

技术标签:

【中文标题】从控制台/命令窗口断开java应用程序[重复]【英文标题】:Disconnect java application from console/command window [duplicate] 【发布时间】:2010-12-02 20:22:19 【问题描述】:

可能重复:Is there a way to the hide win32 launch console from a Java program (if possible without 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();
    

【问题讨论】:

我们可以看看你的代码的sn-p吗?最好是main方法。 另外,看看这个:***.com/questions/649634/… 这是这个问题的重复:***.com/questions/264687/… 【参考方案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();
        
    

【讨论】:

虽然这是初始化 Swing UI 的正确方法,但当主线程退出时,控制台不会消失。它将一直保持到 java.exe 退出,也就是进程中最后一个非守护线程退出时。 可以在主线程退出后关闭一个控制台窗口。我猜这是解决不同窗口问题的不同方法。【参考方案2】:

使用 javaw.exe 而不是 java 运行您的应用程序。如果您从 bat 文件运行,请将其与 start 命令结合使用:

> start javaw.exe -jar myapp.jar

在此模式下运行时,如果您依赖控制台进行任何调试,最好设置适当的日志记录或至少重定向输出流。例如,如果没有控制台,您将永远不会看到为未处理的异常打印的友好堆栈跟踪。

注意:java.exe 是一个 Windows 控制台 应用程序。因此,无论它是如何启动的,或者其中运行了哪些线程,都会为其分配一个控制台。这就是javaw.exe 存在的原因。

【讨论】:

GUI 一开始就不应该与主线程耦合。 我完全同意,但是UI是在主线程中初始化还是在UI线程中初始化与是否为Java进程构建和维护控制台无关。

以上是关于从控制台/命令窗口断开java应用程序[重复]的主要内容,如果未能解决你的问题,请参考以下文章

通过 devtools 控制台为 Angular 应用程序断开特定选项卡的热重载

C#新进程窗口不隐藏[重复]

奇怪的控制台消息 - 应用程序窗口应该在应用程序启动结束时有一个根视图控制器 [重复]

如何在 ASP 经典中捕获窗口断开连接的时间戳[重复]

[转帖]linux screen 命令详解,xshell关掉窗口或者断开连接,查看断开前执行的命令

从Windows控制台应用程序启动Xamarin应用程序