当触发按钮操作时,如何在循环中逐个显示java JTextarea中的控制台输出

我遇到了如何在Jtextarea中显示控制台输出的问题。 我已成功将系统控制台输出重定向到JTextarea。 但问题是在实际系统控制台中,输出逐个显示(我设置了一个Thread.sleep()函数,因此结果会显示,例如,每半秒)。 但是在JTextarea中,输出只会在循环结束时显示一次,它不会像真正的系统控制台一样逐个显示。

循环由GUI按钮触发。 请参阅下面的示例代码。 这只是代码的一部分。

// Create a button. but.setVerticalTextPosition(AbstractButton.CENTER); but.setHorizontalTextPosition(AbstractButton.LEADING); but.setActionCommand("publish"); but.addActionListener(this); // Button action public void actionPerformed(ActionEvent e) { final JButton source = (JButton)e.getSource(); if(source.equals(but)){ for( int i = 0 ; i < 5 ; i++ ) { System.out.println( i ); // regular textarea output //JTextarea.append(Integer.toString(i)); try { Thread.sleep( 500 ); } catch (InterruptedException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } } } 

如你所见,我在循环中使用System.out.println(i),因为我已将系统控制台输出重定向到JTextarea,因此输出在JTextarea中。

问题是,就像我上面提到的,在真正的控制台中,输出每500毫秒一个接一个地显示。 但在重定向的Jtextarea中,结果显示所有循环完成时。 我不知道为什么会这样。 我希望输出在重定向的JTextarea中逐个显示。

谁能帮帮我吗。 非常感谢!

要使Swing GUI在某些事件或某些连续的后台更改时动态更新,您可以使用Swing提供的SwingWorker API。 试试这个代码:

 import javax.swing.*; import java.awt.*; import java.awt.event.*; public class DynamicWrite implements ActionListener { JFrame frame = new JFrame("TextArea"); JTextArea tArea = new JTextArea(10,20); JButton button = new JButton("Click"); JScrollPane pane = new JScrollPane(tArea); SwingWorker worker; String s= "Java is an Object Oriented Programming langauge...Java is static typed language...asbfldfjsdj";//some random String public void prepareAndShowGUI() { Container container = frame.getContentPane(); container.add(pane);container.add(button,BorderLayout.NORTH); tArea.setLineWrap(true); tArea.setWrapStyleWord(true) ; button.addActionListener(this); frame.pack(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } public void actionPerformed(ActionEvent evt) { if(evt.getSource()==button) { tArea.setText(""); if (worker!=null) { worker.cancel(true); } worker = new SwingWorker() { @Override protected Integer doInBackground()//Perform the required GUI update here. { try { for(int i = 0;i 

我希望这能解决你的问题。
要了解有关SwingWorker API的更多信息,请访问此处

不要在EDT调用Thread.sleep 。 这会导致UI“冻结”并延迟预期的视觉更新。 Swing具有SwingWorker等并发机制 ,允许与Swing应用程序并行完成非可视化处理。