该程序是实现 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);
}
});
}
}
不过,现在程序有点问题,点击开始就不动了?请在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);
}
});
}
}
在你的jb1的actionlistener中,加上:
if (list == null) {
list = new ArrayList<String>();
}
而且random产生的数是有可能为负数的,楼主这里还得再改改
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)); }
});而且你的程序完全没有用线程的必要啊。。太浪费了
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));
}}
兄弟,这样的习惯可一点儿不好
这样写出来的代码,让人家怎么看啊???
一边看还要一边儿猜这个变量干嘛的
下一个变量又啥意思.......
岂不是很郁闷看到你为jb3注册监听器的时候,大概知道
为什么不动了:你在jb3的监听器里面初始化list(存放学生名字)怎么可以
岂不是点击一次添加,就从新初始化一个list然后添加上输入的名字
到最后list里面,肯定只有你最后一次添加的学生名字对不???
如果后面没写错,肯定会动起来的,可是一个名字动起来
能看出效果吗???等于不懂啦......
停止button也要设置是否可见,等等