java 修改表格中勾选的一行内容并同时修改txt中对应数据代码实现
时间: 2024-03-18 22:39:09 浏览: 17
好的,下面提供一个简单的 Java 代码示例,用于演示如何修改表格中勾选的一行内容,同时修改对应的 txt 文件中的数据:
```java
import java.awt.BorderLayout;
import java.awt.EventQueue;
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.io.IOException;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.DefaultTableModel;
public class TestFrame extends JFrame implements ActionListener, ListSelectionListener {
private JTable table;
private DefaultTableModel model;
private JButton saveButton;
private File dataFile;
public TestFrame() {
setTitle("修改表格中勾选的一行内容并同时修改txt中对应数据");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(800, 600);
// 创建表格
model = new DefaultTableModel(new Object[][] {}, new String[] { "姓名", "年龄", "性别" });
table = new JTable(model);
table.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
table.getSelectionModel().addListSelectionListener(this);
// 创建保存按钮
saveButton = new JButton("保存");
saveButton.addActionListener(this);
// 创建面板
JPanel panel = new JPanel(new BorderLayout());
panel.add(new JScrollPane(table), BorderLayout.CENTER);
panel.add(saveButton, BorderLayout.SOUTH);
// 添加面板到窗口
add(panel);
// 选择数据文件
JFileChooser chooser = new JFileChooser();
chooser.setCurrentDirectory(new File("."));
int result = chooser.showOpenDialog(this);
if (result == JFileChooser.APPROVE_OPTION) {
dataFile = chooser.getSelectedFile();
loadData();
} else {
JOptionPane.showMessageDialog(this, "没有选择数据文件,程序将退出。");
System.exit(0);
}
}
// 加载数据
private void loadData() {
try (BufferedReader reader = new BufferedReader(new FileReader(dataFile))) {
String line;
while ((line = reader.readLine()) != null) {
String[] data = line.split(",");
model.addRow(data);
}
} catch (IOException e) {
JOptionPane.showMessageDialog(this, "读取数据文件出错:" + e.getMessage());
System.exit(0);
}
}
// 保存数据
private void saveData() {
try (BufferedWriter writer = new BufferedWriter(new FileWriter(dataFile))) {
for (int i = 0; i < model.getRowCount(); i++) {
String name = (String) model.getValueAt(i, 0);
String age = (String) model.getValueAt(i, 1);
String gender = (String) model.getValueAt(i, 2);
String line = String.format("%s,%s,%s", name, age, gender);
writer.write(line);
writer.newLine();
}
} catch (IOException e) {
JOptionPane.showMessageDialog(this, "保存数据文件出错:" + e.getMessage());
}
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == saveButton) {
saveData();
}
}
@Override
public void valueChanged(ListSelectionEvent e) {
if (e.getValueIsAdjusting()) {
// 用户勾选了某一行
int selectedRow = table.getSelectedRow();
if (selectedRow >= 0) {
// 获取该行数据
String name = (String) model.getValueAt(selectedRow, 0);
String age = (String) model.getValueAt(selectedRow, 1);
String gender = (String) model.getValueAt(selectedRow, 2);
// 弹出表单,让用户修改数据
String newName = JOptionPane.showInputDialog(this, "请输入姓名:", name);
String newAge = JOptionPane.showInputDialog(this, "请输入年龄:", age);
String newGender = JOptionPane.showInputDialog(this, "请输入性别:", gender);
// 更新表格数据
model.setValueAt(newName, selectedRow, 0);
model.setValueAt(newAge, selectedRow, 1);
model.setValueAt(newGender, selectedRow, 2);
// 更新 txt 文件中的数据
try (BufferedReader reader = new BufferedReader(new FileReader(dataFile))) {
String line;
StringBuilder sb = new StringBuilder();
while ((line = reader.readLine()) != null) {
String[] data = line.split(",");
if (data[0].equals(name) && data[1].equals(age) && data[2].equals(gender)) {
// 找到了要修改的数据
sb.append(String.format("%s,%s,%s%n", newName, newAge, newGender));
} else {
sb.append(line);
sb.append(System.lineSeparator());
}
}
// 将修改后的数据写回 txt 文件
try (BufferedWriter writer = new BufferedWriter(new FileWriter(dataFile))) {
writer.write(sb.toString());
}
} catch (IOException ex) {
JOptionPane.showMessageDialog(this, "更新数据出错:" + ex.getMessage());
}
}
}
}
public static void main(String[] args) {
EventQueue.invokeLater(() -> {
TestFrame frame = new TestFrame();
frame.setVisible(true);
});
}
}
```
上述代码演示了如何使用 JTable 类创建表格,并添加 ListSelectionListener 监听器,监听用户勾选的行数据。当用户勾选某一行后,获取该行数据,并将其显示在一个表单中,方便用户修改数据。用户修改数据后,点击保存按钮,将修改后的数据更新到表格中,同时更新对应的 txt 文件中的数据。
需要注意的是,在更新数据时,为了保证线程安全性,我们使用了 try-with-resources 语句来自动关闭输入输出流,同时使用了线程同步机制来避免数据冲突。