用户界面-当按钮动作被触发时,如何在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<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();
    }
}
我希望这能解决你的问题。
要了解更多关于SwingWorker API的信息,请查看此处

不要在EDT中调用Thread.sleep。这会导致UI"冻结"并延迟预期的视觉更新。Swing有并发机制,比如SwingWorker,它允许非可视化处理与Swing应用程序并行进行。

请这样写。

String s = ("Your String...");
textArea.append(s);

相关内容

  • 没有找到相关文章

最新更新