【问题标题】:java updating text areajava更新文本区域
【发布时间】:2010-03-28 04:01:40
【问题描述】:

对于我的应用程序,我必须构建一个小的自定义时间记录器,它会在我告诉它的任何延迟之后滴答作响,并将新值写入我的 textArea。问题是代码在终止时间之前完全运行,然后打印所有值。如何在代码运行时更改文本区域。

while(tick<terminationTime){
    if ((System.currentTimeMillis()) > (msNow + delay)){
        msNow = System.currentTimeMillis();
        tick = tick + 1;
        currentTime.setText(""+tick);
        sourceTextArea.append(""+tick+"  " +  System.currentTimeMillis() +" \n");
    }
}

currentTime 和 sourceTextArea 都是文本区域,在 while 循环结束后都会更新。

【问题讨论】:

  • 您是否在事件调度线程上运行此代码?如果是这样,那是你的问题。
  • 您是否尝试过在要更新的对象上调用 repaint()?
  • 这是在动作监听器中吗?
  • 这是在动作监听器中..这是问题吗?我如何解决它?我确实尝试调用重绘方法,它不起作用。我尝试在不同的线程中运行它,但这也不能解决它。
  • 看起来听众是问题所在。查看我在另一个线程中进行更新的示例,以便侦听器可以完成。

标签: java textarea


【解决方案1】:

也许可以尝试使用 SwingWorker 类(在 javadocs 中查看)和随附的 get() 方法。

【讨论】:

    【解决方案2】:

    这是一个使用 2 个线程的示例。

    这里是更新线程。

    public class updateThread extends Thread
    {
    textAreaTest aa;
    Integer i;
    public updateThread(textAreaTest abc)
       {
                aa = abc;
                i = 0;
       }
    
    @Override
       public void run()
       {
            while(true)
                {
                    try
                      {
                          sleep(1000);
                      }
                  catch (InterruptedException e)
                      {
                          //e.printStackTrace();
                      }
                  aa.setText(i.toString());
                  i++;
                }
       }
    
    }
    

    这里是 Jpanel

    import java.awt.Container;
    import javax.swing.JPanel;
    import javax.swing.JTextArea;
    
    public class textAreaTest extends javax.swing.JFrame
    {
    JTextArea area = new JTextArea();
    
    public static void main(String[] args)
        {
            new textAreaTest();
        }
    
    public textAreaTest()
        {
            updateThread thread = new updateThread(this);
            JPanel panel = new JPanel();
            panel.add(area);
            this.setSize(100, 100);
            Container c = this.getContentPane();
            c.add(area);
            this.pack();
            this.setVisible(true);
            thread.start();
        }
    
    public void setText(String text)
        {
            area.setText(text);
        }
    }
    

    【讨论】:

    • 这里有好主意,但不要在 InterruptedException 上使用 e.printStackTrace(),这可能在合理的情况下发生。
    猜你喜欢
    • 1970-01-01
    • 2012-10-28
    • 2011-03-10
    • 1970-01-01
    • 2021-12-22
    • 2011-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多