參考文檔:
效果如下:
代碼如下:
/**
* 功能:
* 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
}
}
}
}