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呢。
哪位大师指点下有没有其它的方法或思路,或者说大家都用什么方式做的,还或是根本就不是这么做的。

解决方案 »

  1.   


    public   class   ThreadTest   extends   JFrame implement Runnable //这个位置实现Runnable接口
     public void run()//重写run方法然后创建Thread线程对象,
    Thread.start();开始线程执行里面的方法
    使用Thread.sleep()让线程睡眠
    run()方法里面可以1秒钟让你的文本框显示的值变化N次,
    点停止就停止线程
      

  2.   

    pulbic void run(){
        while(true){
            lable.setText(percentage+ "%   complete ");
            try{
                Thread.sleep(100);
            }catch(Exception e){
                System.out.print(e);
            }
        }

    里面要写个死循环 不短调用
    Thread.sleep(100);
    这个是0.1秒后调用 让循环速度变慢
      

  3.   

    在swing中用多线程,就用SwingWorker,jdk1。5以后就有了。。