参考文档:
效果如下:
代码如下:
/**
* 功能:
* 1.可以从文件读取人员账号信息
* 2.新增人员可以追加到文件中
* 3.可以删除人员,并在文件中也删除
* 4.摇号,随机
*/
package com.test1;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.ArrayList;
import java.util.Random;
import javax.swing.BorderFactory;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
public class GridBagLayoutFrame extends JFrame {
private static final long serialVersionUID = 6819222900970457455L;
// 定义需要的组件
private JPanel mainPanel;
private JButton addButton;
private JButton leftButton;
private JButton rightButton;
private JLabel label;
private JTextField field;
private DefaultListModel leftModel;
private DefaultListModel rightModel;
private JList leftList;
private JList rightList;
BufferedReader br = null;
BufferedWriter bw = null;
FileReader fr = null;
FileWriter fw = null;
JScrollPane jsp ;
// 临时存放变量的数组列表
ArrayList dd;
public static void main(String[] args) {
// 为事件派发线程增加一个任务:
// 创建并显示这个应用程序的GUI(图像用户界面)
// 在事件派发线程中所有挂起的事件都被处理后才会调用如下方法,
// 常用于更新界面。
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
/**
* 创建GUI并显示。为了线程安全,这个方法应该
* 在事件派发线程中调用。
* */
private static void createAndShowGUI() {
new GridBagLayoutFrame("摇号by毛二");
}
//构造函数
public GridBagLayoutFrame(String title) {
// 创建组件
mainPanel = new JPanel();
addButton = new JButton();
leftButton = new JButton();
rightButton = new JButton();
label = new JLabel();
field = new JTextField();
leftModel = new DefaultListModel();
rightModel = new DefaultListModel();
leftList = new JList(leftModel);
rightList = new JList(rightModel);
dd = new ArrayList();
initComponent();
addData();
//设置窗体属性
setTitle(title);
setPreferredSize(new Dimension(600, 300));
setLocation(400,100);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 显示窗口
pack();
setVisible(true);
}
private void initComponent() {
readFile(new File("D:\\摇号.txt"));
label.setText("添加人员:");
addButton.setText("添加");
// leftList.setPreferredSize(new Dimension(150, 250));
// 从ArrayList中把数据显示到左边文本区
int i = 0;
while (i >= 0 && i < dd.size()) {
((DefaultListModel) leftList.getModel()).addElement(dd.get(i));
i++;
}
jsp = new JScrollPane(leftList);
// 设置你希望显示多少的选项
leftList.setVisibleRowCount(5);
rightList.setPreferredSize(leftList.getSize());
leftButton.setText("删除");
rightButton.setText("开始摇号啦");
mainPanel.setBorder(BorderFactory.createTitledBorder("摇号选择框"));
mainPanel.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.gridx = 0; // 0行0列
c.gridy = 0;
c.gridwidth = 1;
c.gridheight = 1;
c.fill = GridBagConstraints.HORIZONTAL;
c.weightx = 0;
c.weighty = 0;
mainPanel.add(label, c);
c.gridx++;
c.weightx = 1;
mainPanel.add(field, c);
c.gridx++;
c.weightx = 0;
c.gridwidth = 1;
c.gridheight = 1;
// c.fill = GridBagConstraints.HORIZONTAL;
mainPanel.add(addButton, c);
c.gridx = 0;
c.gridy = 1;
c.weightx = 1;
c.weighty = 1;
c.gridwidth = 2;
c.gridheight = 2;
c.fill = GridBagConstraints.BOTH;
mainPanel.add(jsp, c);
c.gridx = 2;
c.gridy = 1;
c.gridwidth = 1;
c.gridheight = 1;
c.weightx = 0;
c.weighty = 0.5;
c.anchor = GridBagConstraints.SOUTH;
c.fill = GridBagConstraints.HORIZONTAL;
mainPanel.add(leftButton, c);
c.gridx = 2;
c.gridy = 2;
c.anchor = GridBagConstraints.NORTH;
c.fill = GridBagConstraints.HORIZONTAL;
mainPanel.add(rightButton, c);
c.gridx = 3;
c.gridy = 1;
c.gridwidth = 1;
c.gridheight = 2;
c.weightx = 1;
c.weighty = 1;
c.fill = GridBagConstraints.BOTH;
mainPanel.add(rightList, c);
this.getContentPane().add(mainPanel);
}
private void addData() {
addButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
addItem();
}
});
leftButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
removeItem();
}
});
rightButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
rockItem();
}
});
}
private void addItem() {
if (field.getText() != null && !field.getText().equals("")) {
((DefaultListModel) leftList.getModel())
.addElement(field.getText());
dd.add(field.getText());
writeFile(dd);
field.setText("");
}
}
private void removeItem() {
int v = leftList.getSelectedIndex();
if (v != -1) {
// 从左边列表中删除选中的人员
Object o = leftList.getSelectedValue();
((DefaultListModel) leftList.getModel()).remove(leftList
.getSelectedIndex());
// 从ArrayList中删除选中的人员。从而修改文件
dd.remove(v);
writeFile(dd);
}
}
private void rockItem() {
// 先清空右边显示的上一次摇号的数据
for (int j = 0; j < ((DefaultListModel) rightList.getModel()).getSize(); j++) {
((DefaultListModel) rightList.getModel()).removeAllElements();
}
// 准备随机选择摇号
Random rand = new Random();
int i = rand.nextInt(dd.size());
leftList.setSelectedIndex(i);
if (leftList.getSelectedIndex() != -1) {
Object o = leftList.getSelectedValue();
((DefaultListModel) rightList.getModel()).addElement(o);
}
}
public void readFile(File f) {
// 初始化,从文档中把数据读出到ArrayList中
try {
// 先创建一个FileReader对象,然后升级成BufferedReader对象
fr = new FileReader(f);
br = new BufferedReader(fr);
/*
* Reader r = new InputStreamReader(new FileInputStream(f),"GBK");//防止乱码
* br = new BufferedReader(r);
*/
// 循环读取
String s = "";
while ((s = br.readLine()) != null && !"".equals(s)) {
dd.add(s);
}
} catch (Exception e) {
// TODO: handle exception
} finally {
try {
br.close();
fr.close();
} catch (Exception e2) {
// TODO: handle exception
}
}
}
public void writeFile(ArrayList a) {
try {
File f = new File("D:\\摇号.txt");
//如果文件不存在,先创建
if(!f.exists()){
f.createNewFile();
}
fw = new FileWriter(f);
bw = new BufferedWriter(fw);
int i = 0;
while (i >= 0 && i < a.size()) {
if (i < (a.size() - 1)) {
bw.write(dd.get(i).toString() + "\r\n");
} else {
bw.write(dd.get(i).toString());
}
i++;
}
} catch (Exception e) {
// TODO: handle exception
} finally {
try {
// 后开的先关闭流
bw.close();
fw.close();
} catch (Exception e) {
// TODO: handle exception
}
}
}
}