请教JAVA线程与SWING的问题
JAVA是支持多线程的,可SWING大部分是单线程的。游戏是离不开多线程的,可游戏同样也需要可视化界面。当我们做一些小游戏时同时用动线程与SWING了就可能带来一些麻烦,最起码不能在线程中调用Label.setText()之类的语句。我现在用两种方式间接缓解了一部分问题,比如用TIMER。如下面的例子
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class ThreadTest extends JFrame
{
JPanel jpnz=new JPanel(new BorderLayout());
JPanel jpns=new JPanel(new FlowLayout());
JPanel jpnx=new JPanel(new FlowLayout());
JTextField jf=new JTextField(20);
JButton jbtn=new JButton( "start ");
ThreadTest()
{
try
{
jInit();
}
catch(Exception e)
{
e.getStackTrace();
}
}
public void jInit() throws Exception
{
getContentPane().add(jpnz);
jpnz.add(jpns,BorderLayout.NORTH);
jpnz.add(jpnx,BorderLayout.SOUTH);
jpns.add(jf);
jpnx.add(jbtn);
Jtp jtp=new Jtp();
jbtn.addActionListener(jtp);
}
ActionListener al;
public static void main(String[] args)
{
try
{
final ThreadTest tt=new ThreadTest();
tt.setSize(300,200);
tt.setVisible(true);
tt.setLocation(300,200);
tt.jf.setText( "hello ");
tt.al=new ActionListener()
{
Random rdm=new Random();
public void actionPerformed(ActionEvent ae)
{
tt.jf.setText(String.valueOf(rdm.nextInt(10)));
}
};
final javax.swing.Timer t=new javax.swing.Timer(100,tt.al);
t.start();
ActionListener al2=new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
if(tt.jbtn.getText().equals( "stop "))
{
t.stop();
}
else
{
t.start();
}
}
};
javax.swing.Timer t2=new javax.swing.Timer(100,al2);
t2.start();
}
catch(Exception e)
{
e.getStackTrace();
}
}
class Jtp implements ActionListener
{
public void actionPerformed(ActionEvent ae)
{
if(ae.getActionCommand().equals( "start "))
{
jbtn.setText( "stop ");
}
else
{
jbtn.setText( "start ");
}
}
}
}
这是我随便做了个测试例子,效果是启动停止后摇出个随机数来,我虽然可以对代码进行优化,但摆脱不了那个TIMER,有一些不效的感觉。还有一种方法是看JAVA2核心技术第七版上讲的:将SWING代码放到实现了Runnable接口的类的run方法中:
EventQueue.invokelATER
(
new Runnable()
{
pulbic void run()
{
lable.setText(percentage+ "% complete ");
}
}
);
可是我怎么感觉效果还不如用TIMER呢。
哪位大师指点下有没有其它的方法或思路,或者说大家都用什么方式做的,还或是根本就不是这么做的。
[解决办法]
public class ThreadTest extends JFrame implement Runnable //这个位置实现Runnable接口 public void run()//重写run方法
[解决办法]
pulbic void run(){ while(true){ lable.setText(percentage+ "% complete "); try{ Thread.sleep(100); }catch(Exception e){ System.out.print(e); } }}
[解决办法]
重写run()可以解决问题的。
[解决办法]
在swing中用多线程,就用SwingWorker,jdk1。5以后就有了。。
[解决办法]
用线程池吧,这也是官方推荐的写法。