javafx tableview 每行加入按钮获取数据
时间: 2024-09-25 13:07:05 浏览: 46
在JavaFX中,Table View是一种用于显示表格数据的组件。如果你想在每行添加一个按钮,并通过点击这个按钮获取对应的数据,可以按照以下步骤操作:
1. **创建TableView**: 首先,你需要在Fxml文件或者代码中创建一个`TableView<MyData>`,其中`MyData`是你要展示的数据模型类。
```java
TableView<MyData> tableView = new TableView<>();
```
2. **数据绑定**: 将数据源绑定到TableView上,通常通过`ObservableList`来存储数据。
```java
ObservableList<MyData> dataItems = FXCollections.observableArrayList();
tableView.setItems(dataItems);
```
3. **创建TableCell**: 创建一个`TableCell`子类,并在其中添加按钮。当用户点击按钮时,你可以覆盖`onAction`方法来处理事件并获取数据。
```java
class DataCell extends TableCell<MyData, String> {
private Button button;
@Override
public void startEdit(String value) {
super.startEdit(value);
button.setDisable(true); // 点击时不响应默认编辑
}
@Override
protected void updateItem(MyData item, boolean empty) {
super.updateItem(item, empty);
if (item != null) {
button.setText("获取数据"); // 设置按钮文本
button.setOnAction(event -> {
// 在这里获取item的数据
String rowData = item.getRowData(); // 例如,rowData可能是item本身或其他属性值
System.out.println("点击了第" + getIndex() + "行的数据: " + rowData);
});
} else {
button = null; // 清空元素
}
}
}
```
4. **设置单元格样式**: 设置`TableView`的单元格样式,将`DataCell`应用给每一列。
```java
tableView.setRowFactory(tv -> {
return new Callback<TableView<MyData>, TableRow<MyData>>() {
@Override
public TableRow<MyData> call(TableView<MyData> tableView) {
return new TableRow<MyData>() {
@Override
protected ObservableValue<String> textProperty() {
return super.textProperty().addListener((obs, oldText, newText) -> {
DataCell cell = getStyleClass().contains("data-cell") ? (DataCell) obs : null;
if (cell != null) {
cell.button.setText(newText); // 更新按钮文字
}
});
}
};
}
}.call(tableView);
});
```
5. **为单元格添加样式**: 在`.fxml`文件中或CSS文件中,为`DataCell`添加所需的样式类,比如"table-cell"和"data-cell"。
```css
.data-cell .button {
/* 样式设置 */
}
```
现在,当你运行程序时,每个Table View的行都会有按钮,点击按钮会打印出对应的行数据。
阅读全文