实例7利用数组随机抽取幸运观众

/ java精彩编程200例 / 没有评论 / 157浏览
实例007利用数组随机抽取幸运观众

还是看的别人的代码,看书不会.......
编写程序,事先将一些观众姓名输入数组,然后获得数组元素的总数量,最后在数组元素中随机抽取元素的下标,根据抽取的下标获得幸运观众的姓名。

思路如下:
1、定义输入框的按键事件,使用KeyEvent类的getKeyChar()函数判断其是否是回车字符,若不是则不作处理;
2、使用isEmpty()函数判断文本框中是否有字符串,如果没有字符串则不做处理;
3、若为合法输入则通过JTextArea类的append()方法把输入人名与回车符添加到人员列表;
4、使用selectAll()方法选择文本框所有字符;
5、定义点击“抽取”按钮时执行的函数,通过JTextArea类的getText()方法获取人员列表文本,存入字符串;
6、创建一个字符串型一维数组,将之前的字符串按回车符分割后存入该数组;
7、通过Math.random()生成随机数组索引,作为中奖者的数组下标;
8、定义包含格式参数的中奖信息;
9、通过String类的format()方法为中奖信息添加人员参数;
10、使用JTextArea类的setText()方法在文本域显示中奖信息;
11、定义点击“退出”按钮时执行的函数,使用System.exit(0)方法退出程序

代码如下:

package java07;

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.RenderingHints.Key;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.border.EmptyBorder;
import javax.swing.JTextPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.JEditorPane;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Vector;
import java.awt.event.ActionEvent;
import javax.swing.JLabel;
import java.awt.Font;

public class luck extends JFrame {

    private JPanel contentPane;
    private JTextField textField;
    private JTextArea textArea;
    private JTextArea textArea_1;
    private JScrollPane scrollPane;
    String name_list[] = {"小张","小王","小郭","小许","小李"};
    Vector list = new Vector();//使用的时候无须声明上限,随着元素的增加,Vector的长度会自动增加;Vector类提供额外的方法来增加、删除元素,比数组操作高效。

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    luck frame = new luck();
                    frame.setVisible(true);
                    frame.setTitle("利用数组随机抽取幸运观众");
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public luck() {

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 524, 342);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(null);

        setContentPane(contentPane);

        textArea_1 = new JTextArea();
        textArea_1.setFont(new Font("楷体", Font.PLAIN, 16));
        textArea_1.setBounds(216, 45, 196, 228);
        textArea_1.setLineWrap(true);//可以自动换行 
        contentPane.add(textArea_1);

        textField = new JTextField();
        textField.setBounds(26, 45, 145, 26);
        textField.addKeyListener(new KeyAdapter() {//文本框的监听事件

            @Override
            public void keyPressed(KeyEvent e) {//重写按键方法
                // TODO Auto-generated method stub
                do_textField_keyPressed(e);
            }

        });
        contentPane.add(textField);
        textField.setColumns(10);//设宽度,每个单位宽度等于当前字体下 'm' 字符的宽度    10 就是:10 * 这个单位宽度

        scrollPane = new JScrollPane();
        scrollPane.setBounds(26, 81, 145, 192);
        getContentPane().add(scrollPane); 

        textArea = new JTextArea();
        textArea.setFont(new Font("楷体", Font.PLAIN, 17));
        textArea.setBounds(26, 81, 145, 192);
        for (int i = 0; i < name_list.length; i++) {
            textArea.append(name_list[i]+"\n");

        }
        scrollPane.setViewportView(textArea);//很关键,把文本域加入滚动,即可让文本域产生滚动条

        JButton btnNewButton = new JButton("\u62BD\u53D6");
        btnNewButton.addActionListener(new ActionListener() {//点击抽取按钮发生啥
            public void actionPerformed(ActionEvent e) {//重写方法
                do_button_actionPerformed(e);
            }
        });
        btnNewButton.setBounds(422, 217, 78, 23);
        contentPane.add(btnNewButton);

        JButton btnNewButton_1 = new JButton("\u9000\u51FA");
        btnNewButton_1.addActionListener(new ActionListener() {//点击退出按钮发生啥
            public void actionPerformed(ActionEvent e) {//重写方法
                do_button_1_actionPerformed(e);
            }

        });
        btnNewButton_1.setBounds(422, 250, 78, 23);
        contentPane.add(btnNewButton_1);

        JLabel label = new JLabel("\u8F93\u5165\u5728\u573A\u89C2\u4F17\u59D3\u540D\u6309\u56DE\u8F66\u6DFB\u52A0\uFF1A");
        label.setFont(new Font("楷体", Font.BOLD, 15));
        label.setBounds(0, 10, 257, 25);
        contentPane.add(label);

        JLabel label_1 = new JLabel("\u606D\u559C\u4E2D\u5956\u89C2\u4F17\uFF1A");
        label_1.setFont(new Font("楷体", Font.BOLD, 15));
        label_1.setBounds(267, 15, 145, 15);
        contentPane.add(label_1);
    }

    protected void do_textField_keyPressed(KeyEvent e) {
        if (e.getKeyChar() != '\n') {//如果在文本框中不按回车   则直接由返回值退出本方法    故没什么效果
            return;
        }
        String name = textField.getText();//如果是回车,则将文本框主内容,以字符串储存起来
        if (name.isEmpty()) {//文本框中若无输入直接按回车    也直接退出本方法
            return;
        }
        textArea.append(name+"\n");//将文本框中的内容 连同换行    一同添加到文本域中
        textField.selectAll();//选中文本框中所有内容,方便删除或者添加别的元素
    }

    protected void do_button_actionPerformed(ActionEvent e) {
        String perstring = textArea.getText();
        String[] personnelArray = perstring.split("\n{1,}");// "\n{1,}"的意思就是按照 至少1个“\n”来分割
        int index = (int)(Math.random() * personnelArray.length);//(Math.random() * personnelArray.length)的取值范围是 [0,1) * length=[0,length) 数值多了而且有小数  
        //强制转型(int)很关键,让取值  只有 0,1,2,3....,length-1   完美
        String formatArg = "本次获奖观众人员:\n\t%1$s\n\n   恭喜%1$3s成为本次观众抽奖的大奖得主。"//被格式化的参数索引%1$3s表示第一位占位符,$s表示是字符串,3是字符串长度?(直觉) 
                + "\n\n我们将为%1$3s颁发:\n\t过期的酸奶二十箱";
        String info = String.format(formatArg, personnelArray[index]);//把随机选中的personnelArray数组中的index索引处的数据取出来,以formatArg格式放到新字符串info中
        textArea_1.setText(info);//加入文本到文本域
    }

    protected void do_button_1_actionPerformed(ActionEvent e) {
        System.exit(0);//结束程序
    }
}

实现情况:

继续加油吧!