上一篇

在Java中为表格添加监听,通常使用
ListSelectionListener监听行选择事件,通过
getSelectionModel().addListSelectionListener()实现,在事件处理方法中编写响应逻辑,如获取选中行数据并执行操作。
Swing JTable 监听器
行选择监听(ListSelectionListener)
JTable table = new JTable(data, columnNames);
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); // 设置单选模式
// 添加行选择监听器
table.getSelectionModel().addListSelectionListener(e -> {
if (!e.getValueIsAdjusting()) { // 确保事件只触发一次
int selectedRow = table.getSelectedRow();
if (selectedRow != -1) {
Object value = table.getValueAt(selectedRow, 0); // 获取第一列数据
System.out.println("选中行: " + selectedRow + ", 值: " + value);
}
}
});
表格数据修改监听(TableModelListener)
table.getModel().addTableModelListener(e -> {
int row = e.getFirstRow();
int column = e.getColumn();
if (row >= 0 && column >= 0) {
String newValue = (String) table.getValueAt(row, column);
System.out.println("修改位置: [" + row + "," + column + "], 新值: " + newValue);
}
});
鼠标事件监听(MouseListener)
table.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2) { // 双击事件
int row = table.rowAtPoint(e.getPoint());
int col = table.columnAtPoint(e.getPoint());
System.out.println("双击位置: [" + row + "," + col + "]");
}
}
});
JavaFX TableView 监听器
选中项变化监听(ChangeListener)
TableView<Person> tableView = new TableView<>();
ObservableList<Person> data = FXCollections.observableArrayList();
tableView.setItems(data);
// 监听选中项变化
tableView.getSelectionModel().selectedItemProperty().addListener(
(obs, oldValue, newValue) -> {
if (newValue != null) {
System.out.println("选中: " + newValue.getName());
}
}
);
多选模式监听
tableView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE); // 允许多选
// 监听所有选中项
tableView.getSelectionModel().getSelectedItems().addListener(
(ListChangeListener<Person>) change -> {
while (change.next()) {
if (change.wasAdded()) {
for (Person p : change.getAddedSubList()) {
System.out.println("新增选中: " + p.getName());
}
}
}
}
);
单元格编辑监听(onEditCommit)
TableColumn<Person, String> nameCol = new TableColumn<>("姓名");
nameCol.setCellValueFactory(cellData -> cellData.getValue().nameProperty());
// 监听单元格提交编辑
nameCol.setOnEditCommit(e -> {
Person person = e.getRowValue();
person.setName(e.getNewValue()); // 更新数据
System.out.println("修改后的值: " + e.getNewValue());
});
关键注意事项
- 事件去重
Swing的ListSelectionEvent可能多次触发,使用!e.getValueIsAdjusting()确保逻辑只执行一次。 - 线程安全
JavaFX监听器操作必须在JavaFX应用线程执行,使用Platform.runLater()更新UI。 - 空值检查
监听器回调时需验证选中行/项是否为null(如table.getSelectedRow() == -1)。 - 性能优化
频繁触发的监听器(如表格滚动)避免复杂计算,必要时添加防抖逻辑。
应用场景建议
- Swing:适合传统桌面应用,监听器需手动管理事件线程。
- JavaFX:响应式开发更简洁,直接绑定数据模型(
ObservableList)。
引用说明:
本文代码示例基于Oracle官方文档《Swing Tutorial》和JavaFX TableView文档,实践时请根据JDK版本调整API调用(如JavaFX需模块化配置)。


