流程输出仅在流程完成后才可用

2023-12-07

我有一个 Runnable,它从外部调用的 exe(见下文)读取控制台输出并将其写入日志文件和 JTextArea。

但在 exe 完全完成之前,我的 Runnable 不会在 JTextArea 中显示控制台输出。如何让它在发生时打印控制台输出?

下面是简短的代码示例:

//Main

import java.awt.*;
import java.io.IOException;
import javax.swing.*;

public class Example extends JFrame {

    private static final long serialVersionUID = 1L; 

    public static int maxX, maxY;

    public static JTextArea ta = new JTextArea(20, 60);//For LOG display window

    public static void main(String args[] ) throws IOException
    {   
        new Example();
    }

    public Example() {

        this.setTitle("Example");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //MAIN Panel
        final JPanel main = new JPanel();

        JButton RunButton = button.run(main);
        main.add(RunButton);

        Container container = getContentPane();


        container.add(main);
        this.pack();
        this.setVisible(true);
    }


}

//按钮动作监听器

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.*;


public class button {

    public static JButton run( final JPanel parent ) {
        JButton RunButton = new JButton();      
        RunButton.setText("Start!");

        RunButton.addActionListener(
        new ActionListener()
        {
            public void actionPerformed( ActionEvent event)
            {
                try
                {

                    //Set up LOG Display    
                    JDialog dialog = new JDialog((JFrame)null, "Working...");
                    JPanel temp_panel = new JPanel();
                    temp_panel.add(new JScrollPane(Example.ta));
                    dialog.getContentPane().add(temp_panel);
                    dialog.pack();
                    dialog.setVisible(true);

                    //Build the Command
                    ArrayList<String> command = new ArrayList<String>();
                    command.add("ping");
                    command.add("127.0.0.1");

                    //Start the process
                    Process p = new ProcessBuilder(command).start();

                    //Starts LOG display capture in separate thread 
                    SwingUtilities.invokeLater(new execute(p));

                    //Wait for call to complete
                    p.waitFor();
                }
                catch(Exception err)
                {
                    JOptionPane.showMessageDialog( parent, "Error Executing Run!", "Warning", JOptionPane.ERROR_MESSAGE );  
                }

            }//end ActionPerformed
        });
        return RunButton;
    }
}

//可运行

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class execute implements Runnable {  
    String line;
    Process p; 

    public execute ( Process process ) {
        p = process;
    }

    public void run() {
        try {
            //Read Process Stream Output and write to LOG file
            BufferedReader is = new BufferedReader( new InputStreamReader(p.getInputStream()));

            while ( (line = is.readLine()) != null ) {
                Example.ta.append(line + "\n");
            }   
            System.out.flush();     
        } catch(Exception ex) { ex.printStackTrace(); }  

    }
}

也许是因为你不尊重Swing的线程策略。对 swing 组件的所有访问都必须在事件调度线程中完成。因此,您的可运行程序应该使用SwingUtilities.invokeLater更新 EDT 中的文本区域,而不是在单独的线程中。

编辑:正如阿尔夫在他的评论中提到的:JTextArea.append是线程安全的,所以这里不是绝对需要的。不过,我仍然会这样做,因为如果文本区域的追加被任何其他 Swing 交互替换或补充,它就不再是线程安全的了。

也可能是外部进程不发送任何换行符,这使得readLine阻塞直到找到一个或达到通信结束。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

流程输出仅在流程完成后才可用 的相关文章

随机推荐

  • 更新 imageView swift 4 的高度约束时无法同时满足约束

    我有一个stack view如下图所示 所以我改变了高度image以编程方式使其适合从我的服务器下载的图像 如果没有图像 则高度限制image将设置为零 这是我这样做的代码 let imageUrl URL string imageStri
  • 查找 CSV 文件/Pandas Dataframe 中标题行的行号

    我正在尝试获取 CSV 文件中包含标题的行的索引或行号 问题是 标题行可以根据我们系统的报告输出上下移动 我无法控制更改此设置 code ht pd read csv file csv test ht get loc Code Code b
  • 如何使用实体框架核心更新与普通 SQL 更新查询相同的多条记录列表?

    通常在 SQL 中我们可以写这样的查询UPDATE users SET isAdult 1 WHERE age gt 18 我想对实体框架核心中满足某些条件的所有行进行一些编辑 我写了这段代码 但出现错误 List
  • tomcat 中基于 JSP Web 应用程序表单的身份验证

    我已将我的应用程序配置为使用基于表单的身份验证 并在 server xml 中设置所需的设置 当我尝试访问受保护的页面时 我被正确重定向到登录页面 在登录页面上 我提供了正确的用户名和密码 但它没有让我登录 而是显示登录错误页面 我正在使用
  • password_hash 每次返回不同的值

    我正在制作一个登录系统 我想对密码进行哈希处理以使其更安全 但它每次都会返回不同的哈希值 甚至无法使用password verify 进行验证 这是我的代码 password password hash password4 PASSWORD
  • 让用户上传并运行Javascript有哪些风险

    如果您有一个 HTML5 游戏厅 允许用户上传一个使用 HTML5 和 Javascript 运行游戏的脚本 假设您的输入没有过滤器 除了只允许 JS 和 HTML 那么潜在的安全风险是什么 陷阱 一种不太可能的可能性是 如果游戏很受欢迎
  • 内部服务器错误

    我在远程服务器上的同一文件夹中有一个 HTML 文件和一个 PHP 文件 从 URL 中 我调用 HTML 文件 而 HTML 文件在提交表单时调用 PHP 文件 但进展并不顺利 当我提交表单时 它显示错误 500内部服务器错误 您要查找的
  • 如何使用 MapReduce API 在映射到云存储之前过滤数据存储数据?

    关于代码实验室here 我们如何在 MapReduce 作业中过滤数据存储数据 而不是获取特定实体类型的所有对象 在下面的映射器管道定义中 唯一的一个输入读取器参数是要处理的实体类型 我在 InputReader 类中看不到可以提供帮助的类
  • Selenium Python:如何网络抓取元素文本

    我正在尝试从轮盘赌游戏中抓取数据 在努力的同时 find element by class name roulette round result position text 我得到这个输出
  • 如何拆分 git repo 并应用 Maven 子模块和 Maven 父模块?

    我需要一些关于如何配置多个存储库的建议 以便它们共享 Maven 父级 并且还配置为 Maven 根项目中的子模块 我正在维护开源项目简单的Java邮件由于可选功能变得越来越大 我计划将项目分成子模块 每个子模块都有自己的 GIT 存储库
  • 如何在方面内使用 ajc 构建参数?

    我需要知道方面内 jar 的名称 以便我可以通过 DeclareParents 创建一个字符串字段 我知道我可以将内容传递给 ajc 编译器 但实际上是否可以使用方面传递的参数 最终结果应该是带有附加字段的类 其中包含我的 jar 的名称作
  • Android 2.2 中的 BackupManager 和 BackupAgent

    我已经查看了文档和示例 BackupRestore 应用程序 并编写了自己的测试应用程序来实现android backupAgent 我延长了BackupAgent类 因为我主要关心的是能够从数据库备份数据 我似乎甚至无法让一个简单的概念验
  • 为什么在非最终类中使用普通 val

    如果课程不是最后一堂课 可能会延长 值有两种可能性 它可能被覆盖并且应该是惰性的 它可能不会被覆盖并且应该是最终的 如果 val 是最终的 您可以假设对它的所有计算都将通过类层次结构进行 如果 val 可能被覆盖 你应该声明它是惰性的 以免
  • 像内置 WP7 一样的图像/照片库

    我正在寻找适用于 Windows Phone 7 的照片库 它的外观和工作方式与内置照片查看器相同 使用轻拂操作幻灯片照片 使用捏合 拖动调整大小 当您轻拂图像时 您可以看到它滑动到下一个图像 并将列表捕捉到该图像 我已经为图像构建了调整大
  • 正则表达式包括字母数字和 _

    我正在尝试创建一个正则表达式来匹配字母数字字符和下划线 这是我的正则表达式 w s 我的印象是这个正则表达式意味着任何字母数字字符 w 下划线 和不 或空格 它是否正确 正则表达式被读取为实际匹配字符串中字符的模式 从左到右 因此您的模式实
  • 最大化直方图下的矩形区域

    我有一个具有整数高度和恒定宽度 1 的直方图 我想最大化直方图下的矩形区域 例如 答案是 6 3 2 使用 col1 和 col2 O n 2 蛮力对我来说很清楚 我想要一个 O n log n 算法 我试图按照最大递增子序列 O n lo
  • Angular4:ng-template 内的组件引用

    我是角度 4 的新手 我想获取 ng template 内组件 验证警报 的句柄
  • 将本机指针转换为 C++\CLI 托管对象引用?

    我有一个通过委托调用的回调 在其中 我需要处理从记录过程到达的缓冲区数据 通常 在非托管上下文中 我可以对 dwParam1 执行reinterpret cast 来获取对象引用 但在托管上下文中 如何将 DWORD PTR 转换为托管对象
  • 多线程场景中的 Microsoft.ACE.OLEDB.12.0 错误

    我在 x64 应用程序中使用Microsoft Access 数据库引擎 2010 Microsoft Office 2016 的一部分 用于处理 mdb 文件 但是 当前版本的 Microsoft Access Database Engi
  • 流程输出仅在流程完成后才可用

    我有一个 Runnable 它从外部调用的 exe 见下文 读取控制台输出并将其写入日志文件和 JTextArea 但在 exe 完全完成之前 我的 Runnable 不会在 JTextArea 中显示控制台输出 如何让它在发生时打印控制台