当前位置: 首页 > 面试题库 >

当触发按钮动作时,如何循环显示Java JTextarea中的控制台输出

戚建白
2023-03-14
问题内容

我在如何在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中也一一显示。

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


问题答案:

要使SwingGUI在某些事件发生时或在某些连续的后台变化下动态更新,您可以使用SwingWorker由提供的API Swing。试试这个代码:

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的更多信息,请点击此处



 类似资料:
  • 概览 触发器配置卡片 此面板配置一些触发器的基本信息,或者进行查阅触发器触发日志等操作。 触发类型目前有两种: 数据表 微信支付回调 条件卡片 对应上面的触发类型,设置不同触发类型的参数。 动作卡片 当触发器的条件被满足,将会执行触发器中的动作。 目前有四种动作类型可选,分别如下: 邮件 微信模板消息 webhook 数据表操作 不同的触发类型对应可选的动作类型不同,每个动作类型又有可选模板变量的

  • 我在一个页面上有几个html控件和一个搜索按钮。当用户在输入控件之外时(即焦点不在输入控件内),如果用户按enter键,我想触发搜索按钮的单击事件。搜索按钮不是按钮,也不在内 目前我正在做这个

  • 我在一个页面上有两个GridView,每个GridView都在代码隐藏中被修改为使用RowDataBound进行分组,在RowDataBound中,我为每个分组添加了一个文本框和按钮。该按钮将添加一个单击事件。此外,每个GridView都位于UpdatePanel中。 为了解决RowDataBound项和动态控件的回发问题,我添加了一个简单的响应。重定向到同一页。这段代码可以工作,但按钮会在Gri

  • 我似乎无法让图标出现在我的项目活动顶部的操作栏上,我使用了正确的名称空间和正确的扩展,一切都应该顺利运行,这是菜单项的xml,我添加了一行“xmlns:app=”http://schemas.android.com/apk/res-auto“它还是不起作用。” 这是菜单充气器的java代码

  • 问题内容: 我正在使用詹金斯。 詹金斯(Jenkins)有上游工作:A 詹金斯(Jenkins)有下游工作:B A的控制台日志输出为: B的控制台日志输出为: 我想要得到的是: 有什么办法,我可以在作业A的控制台日志中获取作业B的控制台输出,然后确定作业“ A”是否成功(使用日志解析/ grep表示故障/错误等关键字)。 问题答案: 不确定您要达到的目标,但是看起来有些人为。查看以下方法是否满足您

  • 使用Windows下的Eclipse Juno,我配置了一个外部工具,该工具调用程序,并将Python脚本文件作为参数运行(后者位于双引号之间,如)。 我还再次检查了外部工具配置窗口中的“Common”选项卡中是否设置了“Allocate Console”选项。