当按钮动作被触发时,如何在一个循环中逐个显示java JTextarea中的控制台输出
我遇到了一个在Jtextarea one be one中如何显示控制台输出的问题。我已成功地将系统控制台输出重定向到JTextarea。但问题是,在真正的系统控制台中,输出会一个接一个地显示(我设置了一个Thread.sleep()函数,所以结果会显示,比如说,每半秒显示一次)。但是在JTextarea中,当循环完成时,输出只显示一次,它不像真正的系统控制台那样逐个显示 循环由GUI按钮触发。请参阅下面的示例代码。这只是代码的一部分当按钮动作被触发时,如何在一个循环中逐个显示java JTextarea中的控制台输出,java,user-interface,Java,User Interface,我遇到了一个在Jtextarea one be one中如何显示控制台输出的问题。我已成功地将系统控制台输出重定向到JTextarea。但问题是,在真正的系统控制台中,输出会一个接一个地显示(我设置了一个Thread.sleep()函数,所以结果会显示,比如说,每半秒显示一次)。但是在JTextarea中,当循环完成时,输出只显示一次,它不像真正的系统控制台那样逐个显示 循环由GUI按钮触发。请参阅下面的示例代码。这只是代码的一部分 // Create a button. but.setVert
// 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();
}
}
}
}
//创建一个按钮。
但是.setVerticalTextPosition(AbstractButton.CENTER);
但是.setHorizontalTextPosition(AbstractButton.LEADING);
但是.setActionCommand(“发布”);
但是.addActionListener(这个);
//按钮动作
已执行的公共无效操作(操作事件e){
最终JButton源=(JButton)e.getSource();
if(source.equals(but)){
对于(int i=0;i<5;i++){
系统输出打印LN(i);
//常规文本区域输出
//append(Integer.toString(i));
试一试{
睡眠(500);
}捕捉(中断异常e1){
//TODO自动生成的捕捉块
e1.printStackTrace();
}
}
}
}
如您所见,我在循环中使用System.out.println(i),因为我已将系统控制台输出重定向到JTextarea,所以输出在JTextarea中
问题是,正如我上面提到的,在真正的控制台中,输出每500毫秒一个接一个地显示。但在重定向的Jtextarea中,当所有循环完成时,结果显示一次。我不知道为什么会这样。我希望输出也在重定向的JTextarea中逐个显示
谁能帮帮我吗。非常感谢 不要在
EDT
中调用Thread.sleep
。这会导致UI“冻结”并延迟预期的视觉更新。Swing具有这样的功能,允许与Swing应用程序并行执行非可视化处理。要使Swing
GUI在某些事件发生时或在某些连续的背景更改时动态更新,您可以使用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<s.length();i++)
{
tArea.append(String.valueOf(s.charAt(i)));
Thread.sleep(5);
}
}catch(Exception ex){}
return 0;
}
};
worker.execute();//Schedules this SwingWorker for execution on a worker thread.
}
}
public static void main(String st[])
{
DynamicWrite dyna = new DynamicWrite();
dyna.prepareAndShowGUI();
}
}
import javax.swing.*;
导入java.awt.*;
导入java.awt.event.*;
公共类DynamicWrite实现ActionListener
{
JFrame frame=新JFrame(“文本区域”);
JTextArea=新JTextArea(10,20);
JButton按钮=新JButton(“单击”);
JScrollPane=新的JScrollPane(tArea);
摇摆工人;
String s=“Java是一种面向对象的编程语言……Java是静态类型语言……asbfldfjsdj”;//一些随机字符串
公共作废预处理显示GUI()
{
Container=frame.getContentPane();
container.add(窗格);container.add(按钮,BorderLayout.NORTH);
跗跖线包裹(真);
tArea.setWrapStyleWord(真);
addActionListener(这个);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
已执行的公共无效操作(操作事件evt)
{
if(evt.getSource()==按钮)
{
跗骨长宽(“”);
if(worker!=null)
{
worker.cancel(true);
}
工人=新的SwingWorker()
{
@凌驾
受保护整数doInBackground()//在此处执行所需的GUI更新。
{
尝试
{
对于(inti=0;i,请使用类似于此的内容
String s = ("Your String...");
textArea.append(s);
尝试System.out.flush(),尽管控制台应该在新品上自动刷新这是我想要的,非常感谢