该程序是实现 GUI 学生摇奖名单,运行起来后,首先在 姓名文本框里输入若干名字,然后点击开始,名字快速闪动,点停止,在结果的文本框里显示某个名字,可用线程实现,最好加注释:
不过,现在程序有点问题,点击开始就不动了?请在eclipse 上运行:请教高手:  
package studentselect;import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.*;import javax.swing.*;public class StudentSelect1 {


public static void main(String[] args) {
MyTherad1 mytherad1 = new MyTherad1();
Thread t1 = new Thread(mytherad1);
// Thread t2 = new Thread(mytherad1);
t1.start();
// t1.setPriority(8);
// t2.start();
}}
 class MyTherad1 extends JFrame implements Runnable {
private int flag = 1;
 public List<String> list = null;
public void run() {

JFrame jf = new JFrame("学生抽奖系统");
JPanel jp1 = new JPanel();
JPanel jp2 = new JPanel();
JPanel jp3 = new JPanel();

JButton jb1 = new JButton("开始");
JButton jb2 = new JButton("停止");
JButton jb3 = new JButton("添加");
jp1.add(jb1);
jp1.add(jb2);
jp1.add(jb3);
jf.add(jp1,BorderLayout.NORTH);

JLabel jl2 = new JLabel("请输入名单:");
JLabel jl1 = new JLabel("姓名");

final JTextField jt = new JTextField(8);
jp2.add(jl2,BorderLayout.NORTH);
jp2.add(jl1,BorderLayout.SOUTH);
jp2.add(jt,BorderLayout.SOUTH);

jf.add(jp2,BorderLayout.CENTER);

JLabel jl3 = new JLabel("结果");
final JTextField jt1 = new JTextField(8);
jp3.add(jl3);
jp3.add(jt1);
jf.add(jp3,BorderLayout.SOUTH);

jp1.setBackground(Color.white);
jp2.setBackground(Color.white);
jp3.setBackground(Color.white);
jf.setSize(240,200);
jf.setBounds(300, 300, 240, 240);
jf.setVisible(true);
jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

jb3.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
list = new ArrayList<String>();
String s = jt.getText();
list.add(s);
jt.setText("");
}

});

jb1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
flag = 1;
Random rd = new Random();
while(flag==1){
int i = rd.nextInt(list.size());
jt.setText((String)list.get(i));
} }

});

jb2.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
flag = 0;
String str = jt.getText();
int it = list.indexOf(str);
list.remove(it);

}

});


}

}
 

解决方案 »

  1.   

    你的list的为空。。
    在你的jb1的actionlistener中,加上:
    if (list == null)  {
        list = new ArrayList<String>();
    }
    而且random产生的数是有可能为负数的,楼主这里还得再改改
      

  2.   

    你修改下jb1,jb3的button事件吧:
    jb3.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent e) {
                    String s = jt.getText();
                    list.add(s);
                    jt1.setText("");    
                }
                
            });
            
            jb1.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent e) {
                    flag = 1;
                    Random rd = new Random();
                    if (list == null || list.size() == 0)  {
                     // 提示输入数据。。好久没写SWING,忘了怎么ALERT了
                     list = new ArrayList<String>();
                    }
                    int i = rd.nextInt(list.size());
                    jt.setText(list.get(i));            }
                
            });而且你的程序完全没有用线程的必要啊。。太浪费了
      

  3.   

    漏洞太多,方法不对,习惯太差(看看那些变量称谓,jp1,jp2,jp3,jb1,jb2,jb3......)!我就不一一指正了,参考一下下面修改的代码(我只改我关心的)。
    package studentselect;import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.*;import javax.swing.*;
    import javax.swing.Timer;public class StudentSelect1 implements ActionListener{

    public List<String> list =  new ArrayList<String>();
    private Timer timer = new Timer(50, this);

    private JTextField jt = new JTextField(8);

    private JButton startBtn = new JButton("开始");
    private JButton stopBtn = new JButton("停止");
    private JButton addBtn = new JButton("添加");


    public void show(){
    JFrame jf = new JFrame("学生抽奖系统");
    jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JPanel jp1 = new JPanel();
    JPanel jp2 = new JPanel();
    JPanel jp3 = new JPanel();

    jp1.add(startBtn);
    jp1.add(stopBtn);
    jp1.add(addBtn);
    jf.add(jp1, BorderLayout.NORTH); JLabel jl2 = new JLabel("请输入名单:");
    JLabel jl1 = new JLabel("姓名");
    jp2.add(jl2, BorderLayout.NORTH);
    jp2.add(jl1, BorderLayout.SOUTH);
    jp2.add(jt, BorderLayout.SOUTH); jf.add(jp2, BorderLayout.CENTER); JLabel jl3 = new JLabel("结果");
    final JTextField resultField = new JTextField(8);
    jp3.add(jl3);
    jp3.add(resultField);
    jf.add(jp3, BorderLayout.SOUTH); jp1.setBackground(Color.white);
    jp2.setBackground(Color.white);
    jp3.setBackground(Color.white);
    jf.setSize(240, 200);
    jf.setBounds(300, 300, 240, 240);
    jf.setVisible(true);

    jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); addBtn.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {

    String s = jt.getText();
    list.add(s);
    jt.setText("");
    checkList();
    } });
    startBtn.setEnabled(false);
    startBtn.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
    timer.start();
    startBtn.setEnabled(false);
    addBtn.setEnabled(false);
    }
    }); stopBtn.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {

    timer.stop();
    String str = jt.getText();
    int it = list.indexOf(str);
    list.remove(it);
    resultField.setText(str);
    jt.setText("");
    addBtn.setEnabled(true);
    checkList();
    } });
    } public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable(){
    public void run(){
    new StudentSelect1().show();
    }
    });

    }

    private void checkList(){
    if(list.size()>0)
    startBtn.setEnabled(true);
    else
    startBtn.setEnabled(false);
    } public void actionPerformed(ActionEvent e) {
    Random rd = new Random();
    int i = rd.nextInt(list.size());
    jt.setText((String) list.get(i));
    }}
      

  4.   

    别的都不重要了,7楼说得很到位啊
    兄弟,这样的习惯可一点儿不好
    这样写出来的代码,让人家怎么看啊???
    一边看还要一边儿猜这个变量干嘛的
    下一个变量又啥意思.......
    岂不是很郁闷看到你为jb3注册监听器的时候,大概知道
    为什么不动了:你在jb3的监听器里面初始化list(存放学生名字)怎么可以
    岂不是点击一次添加,就从新初始化一个list然后添加上输入的名字
    到最后list里面,肯定只有你最后一次添加的学生名字对不???
    如果后面没写错,肯定会动起来的,可是一个名字动起来
    能看出效果吗???等于不懂啦......
      

  5.   

    顶7楼 跑了下代码,如果楼主要做的完善些还有很多地方需要处理比如停止后再添加要清text框,
    停止button也要设置是否可见,等等