2011-03-26 108 views
1

我使用这个代码实现多线程:如何实现多线程的JFrame的

class Progress extends JFrame implements Runnable { 
    Thread t; 
JProgressBar current; 
JTextArea out; 
JButton find; 
Thread runner; 
JFrame tframe; 
int num = 0; 

public Progress() { 
    t=new Thread(this,"Thread1"); 
    t.start(); 


} 
public void run() 
{ 
     tframe=new JFrame("Please wait"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JPanel pane = new JPanel(); 

    pane.setLayout(new FlowLayout()); 
    current = new JProgressBar(); 
    //current.setValue(0); 
    current.setStringPainted(true); 
    current.setIndeterminate(true); 

    pane.add(current); 
    setContentPane(pane); 
    tframe.add(pane); 
    tframe.pack(); 
    tframe.setSize(300,100); 

    tframe.setResizable(false); 
    tframe.setAlwaysOnTop(true); 
    tframe.setLocation(300,300); 
    tframe.setVisible(true); 

} 
public void stop() 
{ 
    tframe.dispose(); 
} 

,当我需要启动线程,我使用

 Progress t=new Progress(); . 

这显示帧,并停止我使用t.stop();但是,我没有得到所需的多线程效果。只显示框架,而不是无生命的进度条。请注意,当用作单个线程时会显示进度条;

这里必须做些什么?请帮忙,提前致谢

+0

为了更快得到更好的帮助,请发布[SSCCE](http://pscode.org/sscce.html)。我猜测所有源代码都需要成为SSCCE,是一个'main(String [])'方法和一些导入。 – 2011-03-26 07:13:27

回答

2

这是完全错误的。 Swing是单线程的。每个与swing组件的交互都必须在单个事件派发线程中完成。仔细阅读this tutorial。它解释了在使用多线程时必须完成的事情。另请阅读this tutorial on progress bars and progress monitors

+0

-1:我是一个非常稀疏的downvoter(超过1100票中只有27票),但你的回答是严重误导。 “这是完全错误的”这并非完全错误。可能存在缺陷,但并不完全错误。 “Swing是单线程的”我不知道从哪里开始。这只是...错了! Swing本质上是多线程的,支持许多类型的其他非必需线程。 – corsiKa 2011-03-26 07:32:06

+1

从http://download.oracle.com/javase/6/docs/api/javax/swing/package-summary.html#threading:“除非另有说明,否则必须在事件中访问所有Swing组件和相关类调度线程“。我没有说别的,我将OP指向官方的swing教程,讲解如何使用多线程。关于这个问题所涉及的多线程方面,OP的代码确实是完全错误的。这可能听起来很刺耳,但这是事实。我的回答完全没有误导,因为它将OP引向适当的文档。 – 2011-03-26 07:46:07