摘要:
运用Java Swing中的JTable、JFileChooser和Java中的FileReader、FileWriter实现了操作文本文件的图形化界面,目前做的功能有:增、删、读、存,比较基础。
基本思路:
- 用java的可视化工具WindowBuilder画好界面;
- 分别写好各功能对应的方法;
- 通过鼠标事件调用对应的方法以实现功能。
下面直接贴出小编所操作的文本文件和源码:
文本文件测试内容:
编号 姓名 性别
1 张三 男
2 李四 女
3 小明 男
4 小红 女
5 马云 男
对应源码(做了比较详细的注释):
// FileName: MenuAndData.java
package dataTest;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JTable;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.LineNumberReader;
import java.awt.event.ActionEvent;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
public class MenuAndData {
private JFrame frmJtablefiletest;
private JTextField textField;
private JTextField textField_1;
private JTextField textField_2;
private final JScrollPane scrollPane = new JScrollPane();
private JTable table;
private BufferedReader bufferedReader;
private LineNumberReader lineNum;
private String[] head;
private DefaultTableModel tableModel;
private int row;
private String fName;
private String fPath;
private BufferedWriter bw;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
MenuAndData window = new MenuAndData();
window.frmJtablefiletest.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the application.
*/
public MenuAndData() {
initialize();
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
frmJtablefiletest = new JFrame();
frmJtablefiletest.setTitle("JTableFileTest");
frmJtablefiletest.setBounds(500, 250, 544, 539);
frmJtablefiletest.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frmJtablefiletest.getContentPane().setLayout(null);
JPanel panel = new JPanel();
panel.setBounds(0, 0, 526, 26);
frmJtablefiletest.getContentPane().add(panel);
panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
JMenuBar menuBar = new JMenuBar();
menuBar.setToolTipText("");
panel.add(menuBar);
JMenu mnNewMenu = new JMenu("\u6587\u4EF6");
menuBar.add(mnNewMenu);
JMenuItem mntmNewMenuItem = new JMenuItem("\u6253\u5F00");
mntmNewMenuItem.addMouseListener(new MouseAdapter() {
@Override
public void mouseReleased(MouseEvent e) {
try {
openFile();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});
mnNewMenu.add(mntmNewMenuItem);
String[] head = {"属性1", "属性2", "属性3"};
String[][] data = {
{"11", "12", "13"},
{"21", "22", "23"},
};
JPanel panel_1 = new JPanel();
panel_1.setBounds(0, 25, 526, 469);
frmJtablefiletest.getContentPane().add(panel_1);
panel_1.setLayout(null);
JPanel panel_2 = new JPanel();
panel_2.setBounds(0, 0, 526, 345);
panel_1.add(panel_2);
panel_2.setLayout(null);
scrollPane.setBounds(0, 0, 526, 345);
panel_2.add(scrollPane);
tableModel = new DefaultTableModel(data,head);
table = new JTable(tableModel);
scrollPane.setViewportView(table);
JButton btnNewButton = new JButton("\u589E\u52A0");
btnNewButton.addMouseListener(new MouseAdapter() {
@Override
public void mouseReleased(MouseEvent arg0) {
addData();
}
});
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
}
});
btnNewButton.setBounds(14, 382, 113, 27);
panel_1.add(btnNewButton);
JLabel label = new JLabel("\u7F16\u53F7");
label.setBounds(147, 386, 39, 18);
panel_1.add(label);
textField = new JTextField();
textField.setBounds(180, 383, 72, 24);
panel_1.add(textField);
textField.setColumns(10);
JLabel label_1 = new JLabel("\u59D3\u540D");
label_1.setBounds(266, 386, 39, 18);
panel_1.add(label_1);
textField_1 = new JTextField();
textField_1.setBounds(299, 383, 72, 24);
panel_1.add(textField_1);
textField_1.setColumns(10);
JLabel label_2 = new JLabel("\u6027\u522B");
label_2.setBounds(390, 386, 39, 18);
panel_1.add(label_2);
textField_2 = new JTextField();
textField_2.setBounds(426, 383, 72, 24);
panel_1.add(textField_2);
textField_2.setColumns(10);
JButton button = new JButton("\u5220\u9664");
button.addMouseListener(new MouseAdapter() {
@Override
public void mouseReleased(MouseEvent e) {
deleteData();
}
});
button.setBounds(14, 429, 113, 27);
panel_1.add(button);
JButton button_1 = new JButton("\u4FDD\u5B58\u5230\u6587\u4EF6");
button_1.addMouseListener(new MouseAdapter() {
@Override
public void mouseReleased(MouseEvent e) {
saveFile();
}
});
button_1.setBounds(147, 429, 143, 27);
panel_1.add(button_1);
}
// 打开文件并显示
public void openFile() throws IOException {
JFileChooser fc = new JFileChooser();
int sd = fc.showOpenDialog(frmJtablefiletest);
if (sd == JFileChooser.APPROVE_OPTION) {
fName = fc.getSelectedFile().getName();
fPath = fc.getCurrentDirectory().toString();
try {
FileReader fileReader = new FileReader(fPath + "/" + fName);
// 获取行数
lineNum = new LineNumberReader(fileReader);
lineNum.skip(Long.MAX_VALUE);
int lines = lineNum.getLineNumber();
fileReader.close();
fileReader = new FileReader(fPath + "/" + fName);
bufferedReader = new BufferedReader(fileReader);
String line = bufferedReader.readLine();
String[][] data = new String[lines-1][3];
int flag = 1;
int j = 0;
while(line!=null) {
if (flag==1) {
head = line.split("\\\t");
flag = 0;
} else {
String[] text = line.split("\\\t");
for (int i=0;i<text.length;i++) {
data[j][i] = text[i];
}
j = j + 1;
}
line = bufferedReader.readLine();
}
tableModel = new DefaultTableModel(data,head);
table = new JTable(tableModel);
scrollPane.setViewportView(table);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
// 增加一行
public void addData() {
String[] rowValues = {textField.getText(), textField_1.getText(), textField_2.getText()};
tableModel.addRow(rowValues);
textField.setText("");
textField_1.setText("");
textField_2.setText("");
}
// 删除指定行
public void deleteData() {
row = table.getSelectedRow();
tableModel.removeRow(row);
}
// 保存到文件
public void saveFile() {
try {
FileWriter fw = new FileWriter(fPath + "/" + fName);
bw = new BufferedWriter(fw);
bw.write(head[0] + "\t" + head[1] + "\t" + head[2] + "\r\n");
int rowNumber = tableModel.getRowCount();
for (int i=0;i<rowNumber;i++) {
for (int j=0;j<3;j++) {
bw.write(tableModel.getValueAt(i, j) + "\t");
}
bw.write("\r\n");
}
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
小结:
初接触Java Swing,做的比较基础,一些基本的功能还是有的,比如文件对话框、读取文件、存储文件、增删表格数据等。谨以此作个笔记。