1

所以我一直在尝试使用这篇文章中的代码在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);

}

}

4

1 回答 1

1

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

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

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

于 2013-05-29T20:42:14.487 回答