我在JavaFX中相当新。我有一个包含多列的表格,每行都有一个编辑button
。每当我点击Edit
时,第一个单元格被选中以编辑该行。一切都很顺利,但问题是每当我选择一行并单击它的单元格时,它也会进入编辑模式,尽管我没有点击Edit
。我认为这是因为我已经制作了tableView.setEditable(true)
,但我想只在我点击“编辑”按钮时才启用编辑,只有当我点击/单击时才会启用该行。我见过this,但是他们通过弹出窗口解决了它。我不想要那个。
在initialize()
方法中,我尝试过这种方式,但它并没有完全正常工作。有人能告诉我这样做的正确方法吗?
tableBuilding.setRowFactory(tv -> {
TableRow<ModelBrBuilding> row = new TableRow<>();
row.addEventFilter(MouseEvent.MOUSE_PRESSED, e -> {
if (e.getButton() == MouseButton.SECONDARY) {
e.consume();
}
});
row.addEventFilter(MouseEvent.MOUSE_PRESSED,event -> {
if ( event.getButton() == MouseButton.PRIMARY && event.getClickCount() == 2 ) {
event.consume();
}
});
return row ;
});
我的按钮操作看起来像
EditButton.setOnAction((ActionEvent event)->{
TableRow row = cell.getTableRow();
tableBuilding.requestFocus();
tableBuilding.getSelectionModel().select(row.getIndex());
int i=tableBuilding.getSelectionModel().getSelectedIndex();
tableBuilding.edit(i,colName);
});
答案 0 :(得分:1)
可能有一个更优雅的解决方案,但您可以在调用TableView
之前设置tableView.edit(int, TableColumn)
可编辑权限,然后在提交编辑时将其设置为不可编辑或取消。或者你可以在每个特定的TableColumn
上设置\ unset editable thing。
例如,在Button
的动作处理程序中:
button.setOnAction(evt -> {
evt.consume();
tableView.requestFocus();
tableView.edit(-1, null); // cancel any current edit if there is one
tableView.getSelectionModel().select(tableCell.getIndex());
tableView.setEditable(true);
tableView.edit(tableCell.getIndex(), tableColumn);
});
然后是TableColumn
:
EventHandler<TableColumn.CellEditEvent<S, T>> handler = evt -> tableView.setEditable(false);
tableColumn.setOnEditCancel(handler);
tableColumn.setOnEditCommit(handler);
// or you can use the addEventHandler(EventType, EventHandler) method