Я создаю TreeView и устанавливаю элементы в ObservableList<ColumnLine>
.И я добавляю слушателя в EditingCell, когда я нажимаю TAB
, я могу редактировать следующий столбец или первый столбец следующей строки (и добавляю новый элемент в список элементов).
Я не знаю, почему это будетиногда возвращать индекс больше размера элементов.На самом деле есть значение ячейки столбца - кнопка, она будет отображаться в большей строке, когда я нажимаю TAB
(редактировать следующий столбец), а затем снова нажимаю TAB
, чтобы вернуться к правильной строке.
Ошибка:
Когда я нажимаю TAB
, он возвращает индекс строки, размер которой больше размера элементов.
Напечатайте что-нибудь, когда startEdit ()называется :
public void startEdit() {
super.startEdit();
if (textField == null) createTextField();
textField.setText(getString());
setGraphic(textField);
setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
Platform.runLater(
() -> {
textField.requestFocus();
textField.selectAll();
System.out.println(
"start: "
//+ getTableColumn().getText()
+ " row-"
+ getIndex()
+ " column-"
+ getTableView().getColumns().indexOf(getTableColumn())
+ " item count-"
+ getTableView().getItems().size());
System.out.println("item-size: " + getTableView().getItems().size());
});
}
Вывод:
-- First Line: normal
start: row-0 column-1 item count-1
item-size: 1
commit: row-0 column-1 item count-1
start: row-0 column-2 item count-1
item-size: 1
commit: row-0 column-2 item count-1
size: 2
-- Second Line: wrong
start: row-23 column-1 item count-2 <------ This
item-size: 2
start: row-1 column-1 item count-2
item-size: 2
commit: row-1 column-1 item count-2
start: row-1 column-2 item count-2
item-size: 2
commit: row-1 column-2 item count-2
database next: row-1 col-名
size: 3
-- Third Line: wrong
start: row-22 column-1 item count-3 <------ This
item-size: 3
start: row-2 column-1 item count-3
item-size: 3
commit: row-2 column-1 item count-3
start: row-2 column-2 item count-3
item-size: 3
commit: row-2 column-2 item count-3
database next: row-2 col-名
size: 4
-- Fourth Line: wrong
start: row-3 column-1 item count-4
item-size: 4
commit: row-21 column-1 item count-4 <------ This
start: row-3 column-1 item count-4
item-size: 4
commit: row-3 column-1 item count-4
start: row-3 column-2 item count-4
item-size: 4
commit: row-3 column-2 item count-4
И код:
создать TableView:
view.getColumns().add(new ColumnBuilder<ColumnLine>().createStringColumn("名", "name"));
view.getColumns().add(new ColumnBuilder<ColumnLine>().createStringColumn("类型", "type"));
view.getColumns().add(new ColumnBuilder<ColumnLine>().createStringColumn("长度", "length"));
view.getColumns().add(new ColumnBuilder<ColumnLine>().createStringColumn("小数点", "decimal"));
TableColumn<ColumnLine, Boolean> colNotNull = new TableColumn<>("不是 null");
colNotNull.setCellFactory(param -> new CheckBoxTableCell<>());
colNotNull.setCellValueFactory(
param -> {
ColumnLine value = param.getValue();
BooleanProperty property = new SimpleBooleanProperty(value.isNotNull());
property.addListener((observable, oldValue, newValue) -> value.setNotNull(newValue));
return property;
});
view.getColumns().add(colNotNull);
TableColumn<ColumnLine, Boolean> key = new TableColumn<>("键");
key.getStyleClass().add("imageValueColumn");
key.setCellFactory(
param ->
new TableCell<ColumnLine, Boolean>() {
private final Button btn = new Button();
{
btn.getStyleClass().add("imageButton");
btn.setOnAction(
event -> {
ColumnLine value = getTableView().getItems().get(getIndex());
value.setPK(!value.isPK());
if (value.isPK()) {
if (btn.getGraphic() == null) {
btn.setGraphic(new ImageView(new Image("/resource/key.png")));
}
} else btn.setGraphic(null);
});
}
@Override
protected void updateItem(Boolean value, boolean empty) {
super.updateItem(value, empty);
setGraphic(empty ? null : btn);
}
});
key.setCellValueFactory(
param -> {
ColumnLine value = param.getValue();
BooleanProperty property = new SimpleBooleanProperty(value.isPK());
property.addListener((observable, oldValue, newValue) -> value.setPK(newValue));
return property;
});
view.getColumns().add(key);
}
Редактирование ключевого слушателя ячейки (getNextColumn (boolean) вернет следующую ячейку):
if (event.getCode() == KeyCode.TAB) {
// Get next cell
TableColumn nextColumn = getNextColumn(true);
if (nextColumn != null) {
// Not the last column
if (nextColumn != getTableView().getColumns().get(1)) {
getTableView().edit(getTableRow().getIndex(), nextColumn);
} else { // the last column
// Not the last line
if (getTableRow().getIndex() < getTableView().getItems().size() - 1) {
// Edit next column
getTableView().edit(getTableRow().getIndex() + 1, nextColumn);
} else { // The last line
// Add a new item
((TableCreator) obj).getNewColumns().add(new ColumnLine());
// Edit
getTableView().edit(getTableRow().getIndex() + 1, nextColumn);
}
}
}
}
}
Я не говорящий по-английски ... Я извиняюсь перед вамиесли что-то не так в этом посте.