gpt4 book ai didi

java - 程序运行时使用 System.out 更新 jTextArea

转载 作者:太空宇宙 更新时间:2023-11-04 07:36:21 26 4
gpt4 key购买 nike

所以我一直在尝试使用这篇文章 for making a console window in a JTextArea 中的代码。该代码似乎可以与我的代码一起使用,但我遇到了一个奇怪的问题。

我的程序:我基本上正在为我最近制作的命令行工具构建一个快速而肮脏的 GUI。 gui 包含的唯一内容是一个显示“启动自动化引擎”的按钮,然后它有一个 JTextArea,应该显示我的程序发送到 System.out.println() 的任何文本。

目前它什么也没有显示,尽管程序本身正在运行和工作(并且应该显示输出结果。)我注意到,当我单击 gui 上的按钮时,该按钮在程序运行时保持按下状态。这使我相信在程序运行时 JFrame 不会更新,因此 JTextArea 作为它的子项,不会更新。这不太好...

有没有办法让 JTextArea 在程序在后台运行时更新?

这是我的 JFrame 代码,顺便说一句,如果您想查看它以更好地了解我在说什么。它主要是在 Eclipse 中的 WindowBuilder 中构建的。我所做的唯一一件事就是向 startAutmoatorEngineButton 添加一个按钮监听器,然后添加 initalize() 方法的最后几行,以将 JTextArea (engineOutput) 设置为 System.out

public class EngineGUI {

private JFrame frmAutomatorEngine;
private File logPath = new File("<redacted>", "<redacted>");
private File masterFile = new File("<redacted>", "<redacted>");

/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
EngineGUI window = new EngineGUI();
window.frmAutomatorEngine.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

/**
* Create the application.
*/
public EngineGUI() {
initialize();
}

/**
* Initialize the contents of the frame.
*/
private void initialize() {
frmAutomatorEngine = new JFrame();
frmAutomatorEngine.setType(Type.UTILITY);
frmAutomatorEngine.setResizable(false);
frmAutomatorEngine.setTitle("Automator Engine");
frmAutomatorEngine.setBounds(100, 100, 636, 335);
frmAutomatorEngine.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JMenuBar menuBar = new JMenuBar();
frmAutomatorEngine.setJMenuBar(menuBar);

JMenu mnEngine = new JMenu("Engine");
menuBar.add(mnEngine);

JMenuItem mntmLoadMasterFile = new JMenuItem("Load Master File...");
mnEngine.add(mntmLoadMasterFile);

JMenuItem mntmExit = new JMenuItem("Exit");
mnEngine.add(mntmExit);
frmAutomatorEngine.getContentPane().setLayout(null);

JTextArea engineOutput = new JTextArea();
engineOutput.setBounds(10, 48, 600, 217);
frmAutomatorEngine.getContentPane().add(engineOutput);

JButton startAutomatorEngineButton = new JButton("Start Automator Engine");
startAutomatorEngineButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {

MasterFile master = null;
try {
master = new MasterFile(masterFile, logPath);
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}

AutomationLoop theLoop = new AutomationLoop(master);
theLoop.startLoop();

}
});
startAutomatorEngineButton.setBounds(441, 11, 169, 23);
frmAutomatorEngine.getContentPane().add(startAutomatorEngineButton);

//Set up textArea to be used as output stream for program
TextAreaOutputStream outputStream = new TextAreaOutputStream(engineOutput);
PrintStream printStream = new PrintStream(outputStream);
System.setOut(printStream);
//System.setErr(printStream);

}

}

最佳答案

很难确定,因为我不知道您的 AutomationLoop 和 TextAreaOutputStream 类是做什么的,但这听起来像是一个线程问题。

所有 Swing 代码都需要在事件调度线程中执行。如果您有一个长时间运行的代码不更新 GUI,那么您可能希望它运行另一个线程,否则 GUI 没有机会更新。从你的行为来看,听起来 theLoop.startLoop() 正在事件调度线程中运行,因此 GUI 永远没有机会更新自身。

Loop.startLoop() 是否启动一个新线程?如果不是,也许应该;否则,在该代码执行完毕之前,您的 GUI 将不会更新。

关于java - 程序运行时使用 System.out 更新 jTextArea,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16822974/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com