运行线程以响应JButton单击时出现问题

时间:2010-12-22 17:31:20

标签: java swing

我制作了一个表格,其中包括显示图表(使用jfreechart)。该图绘制了动态生成的数据。为了生成数据,我使用了一个线程,如下所示:

class Grapher extends JFrame implements Runnable{
       ....
     public void run(){
           Thread thisT = Thread.currentThread();
     while(true){
        try{    
            double a = getRand();
            System.out.println(a);
            Millisecond millisecond = new Millisecond();
            if(a == 100){thisThread.stop();}
            timeseries.add(millisecond, a);
            Thread.sleep(100);
        }catch(InterruptedException e){}
    }

如果我像这样设置我的程序,图表在我的GUI中显示正常,但立即开始。

     Grapher graph = new Grapher();
    MyForm testForm = new MyForm();

    testForm.addGraph(graph);      
    testForm.pack();
    testForm.setVisible(true);
    graph.run();

如果我错过了最后一行graph.run()并将其添加到Jbutton事件监听器,当我单击该按钮时,我可以看到该线程在我在控制台上显示数字时运行。但是,图表不会更新,整个表单会冻结。

我不确定为什么会这样,但我想它与线程有关?

3 个答案:

答案 0 :(得分:1)

您正在UI线程上运行该线程。

在runnable上调用.run()不会创建新线程

查看SwingWorker是否存在问题。 http://download.oracle.com/javase/tutorial/uiswing/concurrency/worker.html 并阅读这篇文章http://java.sun.com/products/jfc/tsc/articles/threads/threads1.html

答案 1 :(得分:1)

new Thread(new Grapher()).start();

答案 2 :(得分:1)

您的代码中不应该有“while true”循环。如果你想要某种动画,那么使用Swing Timer来安排动画。另一个答案之一的Swing教程链接还有一个关于如何使用计时器的部分。