簡體   English   中英

如何在觸發按鈕動作時循環顯示Java JTextarea中的控制台輸出

[英]how to display console output in java JTextarea one by one in a loop when button action is triggered

我在如何在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在發生某些事件時或SwingWorker某些連續的后台更改時能夠動態更新,可以使用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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM