日期:2014-05-20  浏览次数:20711 次

按钮事件中引入线程的问题——大家测试一下这个程序出错在哪里?
import java.awt.*;
import java.awt.event.*;
public class Draw1
{
public static void main(String[] args)
{
DrawMachine dm=new DrawMachine();
}
}
class DrawMachine extends Frame implements Runnable,ActionListener
{
Button btn1,btn2;
TextField tf;
Thread trd1;
boolean Flag;
public DrawMachine()
{
super("抽奖机");
setVisible(true);
setSize(300,200);
setBackground(Color.cyan);
setLayout(null);
btn1=new Button("开始");
btn2=new Button("停止");
tf=new TextField(100);
add(btn1);
add(btn2);
add(tf);
btn1.setBounds(90,130,50,30);
btn2.setBounds(150,130,50,30);
tf.setBounds(60,80,170,30);
trd1=new Thread(this);
btn1.addActionListener(this);
btn2.addActionListener(this);
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource()==btn1)
{
Flag=true;
trd1.start();
btn1.setEnabled(false);
}
if(e.getSource()==btn2)
{
setFlag();
btn1.setEnabled(true);
}
}
public void run()
{
while(Flag)
{
for(int i=1;i<11;i++)
{
tf.setText(""+i);
if(Flag==false)
{
break;
}
}
}
}
public void setFlag()
{
Flag=false;
}
}
//第一次两个按钮都可以使用,第二次点击开始按钮就出错什么原因?谢谢


------解决方案--------------------
线程停止后自动消亡.这就是为什么要在线程加上一个死循环,否则他一执出去,线程就没了。

所以每次点“开始”按扭时,再建一个新的线程就可以了。
Java code

import java.awt.*;
import java.awt.event.*;

public class Draw1 {
    public static void main(String[] args) {
        DrawMachine dm = new DrawMachine();
    }
}

class DrawMachine extends Frame implements Runnable, ActionListener {
    Button btn1, btn2;
    TextField tf;
    Thread trd1;
    boolean Flag;

    public DrawMachine() {
        super("抽奖机");
        setVisible(true);
        setSize(300, 200);
        setBackground(Color.cyan);
        setLayout(null);
        btn1 = new Button("开始");
        btn2 = new Button("停止");
        tf = new TextField(100);
        add(btn1);
        add(btn2);
        add(tf);
        btn1.setBounds(90, 130, 50, 30);
        btn2.setBounds(150, 130, 50, 30);
        tf.setBounds(60, 80, 170, 30);
        
        btn1.addActionListener(this);
        btn2.addActionListener(this);
        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }

    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == btn1) {
            trd1 = new Thread(this);
            Flag = true;
            trd1.start();
            btn1.setEnabled(false);
        }
        if (e.getSource() == btn2) {
            setFlag();
            btn1.setEnabled(true);
        }
    }

    public void run() {
        while (Flag) {
            for (int i = 1; i < 11; i++) {
                tf.setText("" + i);
                if (Flag == false) {
                    break;
                }
            }
        }
    }

    public void setFlag() {
        Flag = false;
    }    
}