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呢。
哪位大师指点下有没有其它的方法或思路,或者说大家都用什么方式做的,还或是根本就不是这么做的。
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呢。
哪位大师指点下有没有其它的方法或思路,或者说大家都用什么方式做的,还或是根本就不是这么做的。
解决方案 »
- SCJP 题目求助
- 新手求解 关于数组问题
- java HashSet 用法
- 经常运行自己编写的程序对电脑有害
- 怎样触发choice的事件
- 如何实现通过一个TextField输入多个数据
- 掌握了java的基本语法之后,怎样继续学下去?
- 请问各位,这个关于图形的问题很有趣哎!大家来看看我这段代码!
- 能不能教我如何使用jcreator啊???
- Java设置的初级问题,请大虾指点!
- socket.getInputStream返回一个InputStream,但InputStream是一个抽象类,那么socket.getInputStream返回的到底是哪个子类?
- 求 thinkiing in java 第四版的答案飞!!
public class ThreadTest extends JFrame implement Runnable //这个位置实现Runnable接口
public void run()//重写run方法然后创建Thread线程对象,
Thread.start();开始线程执行里面的方法
使用Thread.sleep()让线程睡眠
run()方法里面可以1秒钟让你的文本框显示的值变化N次,
点停止就停止线程
while(true){
lable.setText(percentage+ "% complete ");
try{
Thread.sleep(100);
}catch(Exception e){
System.out.print(e);
}
}
}
里面要写个死循环 不短调用
Thread.sleep(100);
这个是0.1秒后调用 让循环速度变慢