作者:Waylon
实现思路
1.创建窗体:用来显示在屏幕上和存放各种组件
2.创建一个文本框:用来实现用户的输入
3.创建两个多行文本域:用来显示观众信息和抽奖结果信息
4.创建两个按钮:用来开始抽奖和退出程序
所需技术
本实例中的重点,是把字符串中的人员名单分割为数组,以及随机生成数组下标索引,这分别需要用到String类的spilt()方法和Math类的random()方法。
实现过程
1.创建窗体
关键代码如下:
public class Demo extends JFrame {
/**
* 创建窗体
*/
public Demo() {
setTitle("随机抽取幸运观众");
setDefaultCloseOperation(EXIT_ON_CLOSE);//点击关闭程序
setBounds(200, 200, 520, 300);//设置窗体的位置及大小
}
2.创建画板
关键代码如下:
private JPanel contentPane;
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));//创建空边框
setContentPane(contentPane);
setLayout(null);//不设置布局
JPanel panel = new JPanel();
//创建具有指定内容的边框
panel.setBorder(new TitledBorder(null, "输入观众姓名并按回车", TitledBorder.LEADING, TitledBorder.TOP, null, new Color(59, 59, 59)));
panel.setBounds(10, 10, 175, 242);//设置panel的位置及大小
contentPane.add(panel);
panel.setLayout(new BorderLayout(0, 5));
JPanel panel_1 = new JPanel();
panel_1.setBorder(new TitledBorder(null, "抽奖结果:", TitledBorder.LEADING, TitledBorder.TOP, null, new Color(59, 59, 59)));
panel_1.setBounds(183, 10, 219, 242);
panel_1.setLayout(new BorderLayout(0, 0));
contentPane.add(panel_1);
JScrollPane jscrollPane_1 = new JScrollPane();
panel_1.add(jscrollPane_1);
3.创建多行文本域
关键代码如下:
personnelArea = new JTextArea();
personnelArea.setEditable(false);
jscrollPane.setViewportView(personnelArea);
resultArea = new JTextArea();
resultArea.setEditable(false);
resultArea.setLineWrap(true);
jscrollPane_1.setViewportView(resultArea);
4.创建文本框
关键代码如下:
nameField = new JTextField();
nameField.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
nameField_keyPressed(e);
}
});
panel.add(nameField, BorderLayout.NORTH);
nameField.setColumns(8);
5.创建按钮
关键代码如下:
ImageIcon icon1 = new ImageIcon("src/img_1.png");
ImageIcon icon2 = new ImageIcon("src/img_2.png");
JButton button_1 = new JButton();
button_1.setIcon(icon1);//设置显示的图片
JButton button_2 = new JButton();
button_2.setIcon(icon2);//设置显示的图片
button_1.setBounds(407, 20, 82, 32);
button_2.setBounds(407, 65, 82, 32);
contentPane.add(button_1);
contentPane.add(button_2);
6.添加按钮动作事件
//添加按钮动作事件
button_1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
button_1_actionPerformed(e);
}
});
button_2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
dispose();
}
});
7.核心代码
为文本框添加按键事件监听器,并编写事件处理方法,当用户在文本框中输入观众姓名并按下enter键时,如果文本内容为空,事件处理方法将发出提示信息,否则将观众姓名添加到文本域中,并以回车换行作为分隔符,然后选择文本框中所有的文本,准备接收用户的下一次输入。如果用户输入的观众姓名已经存在,则提示该观众已存在。具体代码如下:
private void nameField_keyPressed(KeyEvent e) {
text = personnelArea.getText();// 获取人员列表文本
split = text.split("\n{1,}");//创建人员数组
if (e.getKeyChar() != '\n') {
return;// 不是回车字符不做处理
}
String name = nameField.getText();
if (name.isEmpty()) {
// 如果内容为空,发出提示信息
JOptionPane.showMessageDialog(null, "内容不能为空!");
}
//检查name是否已存在split数组当中
for (int i = 0; i < split.length; i++) {
if (name.equals(split[i])) {
JOptionPane.showMessageDialog(null, "该观众已存在!");
return;
}
}
personnelArea.append(name + "\n");//将用户输入的文本添加到人员列表中
nameField.selectAll();// 选择文本框所有字符
}
编写“立即抽奖”按钮的事件处理方法,通过随机数生成数组下标,当然这个下标是固定不变的,在在另一个文本域控件中输出抽取幸运观众的获奖信息,具体代码如下:
private void button_1_actionPerformed(ActionEvent e) {
int a = (int) (Math.random() * split.length);//生成随机索引
//格式化中奖信息
String formatArg = "幸运观众:\n\t%1$s\n恭喜%1$s成为本次的大奖得主。" + "\n\n我们将为Ta颁发:\n\t过期的酸奶二十箱。\n让我们把掌声送给%1$s!";
String format = String.format(formatArg, split[a]);
resultArea.setText(format);
}