JavaFX8: Как создать прослушиватель для выбора строки в Tableview?
В настоящее время у меня есть два вида таблиц на одном экране, что приводит к тому, что оба TableViews имеют строки, которые пользователь может выбрать.
Теперь я хочу, чтобы одновременно выбиралась только одна строка (не имеет значения, какой из них выбран TableView). Я думал о каком-то слушателе, который отбирает другую строку при выборе строки. Это моя первоначальная настройка:
Шаг 1
Найдите способ привязки метода к выбору строки (нет ничего подобного tableview.setOnRowSelected(method)
)
Шаг 2
Создайте метод, который действует как своего рода слушатель: когда выбрана строка, снимите выделение с другой строки (я знаю, как сделать эту часть)
Class1 selectedObject1 = (Class1)tableview1.getSelectionModel().getSelectedItem();
Class2 selectedObject2 = (Class2)tableview2.getSelectionModel().getSelectedItem();
if(selectedObject1 != null && selectedObject2 != null) {
tableview1.getSelectionModel().clearSelection();
}
Итак, первый шаг - проблема. Я думал о наблюдаемом списке, на котором можно создать слушателя, а затем добавить выбранную строку в список. Когда это произойдет, слушатель может вызвать метод.
Кто-нибудь подскажет, как это сделать?
Любая помощь очень ценится.
Ответы
Ответ 1
selectedItem
в модели выбора является наблюдаемым свойством, поэтому вы можете достичь этого с помощью
tableview1.getSelectionModel().selectedItemProperty().addListener((obs, oldSelection, newSelection) -> {
if (newSelection != null) {
tableview2.getSelectionModel().clearSelection();
}
});
tableview2.getSelectionModel().selectedItemProperty().addListener((obs, oldSelection, newSelection) -> {
if (newSelection != null) {
tableview1.getSelectionModel().clearSelection();
}
});
Ответ 2
Мое решение будет создавать пользовательскую ячейку factory для таблицы и устанавливать ее для каждого столбца таблицы.
Callback<TableColumn<..., ...>, TableCell<..., ...>> value = param -> {
TextFieldTableCell cell = new TextFieldTableCell<>();
cell.addEventFilter(MouseEvent.MOUSE_CLICKED, event -> {
//your code
}
);
return cell;
};
packageName.setCellFactory(value);
table1.column1.setCellFactory();
table2.column1.setCellFactory();
...
Ответ 3
Я использую его для удаления выбранной строки.
public void ButtonClicked()
{
ObservableList<Names> row , allRows;
allRows = table.getItems();
row = table.getSelectionModel().getSelectedItems();
row.forEach(allRows::remove);
}
Ответ 4
Этот вопрос помог мне, но во время эксперимента в javafx и jfoenix это также работает для меня.
deleteSingle.addEventHandler(MouseEvent.MOUSE_CLICKED, (e) -> {
StringProperty selectedItem = table.getSelectionModel().getSelectedItem().getValue().link1;
System.out.println("That is selected item : "+selectedItem);
if (selectedItem.equals(null)) {
System.out.println(" No item selected");
} else {
System.out.println("Index to be deleted:" + selectedItem.getValue());
//Here was my database data retrieving and selectd
// item deleted and then table refresh
table.refresh();
return;
}
});
Ответ 5
Если вам нужна не только строка, но и x | y позиция ячейки таблицы, сделайте следующее:
table.getFocusModel().focusedCellProperty().addListener(
new ChangeListener<TablePosition>() {
@Override
public void changed(ObservableValue<? extends TablePosition> observable,
TablePosition oldPos, TablePosition pos) {
int row = pos.getRow();
int column = pos.getColumn();
String selectedValue = "";
if (table.getItems().size() > row
&& table.getItems().get(row).size() > column) {
selectedValue = table.getItems().get(row).get(column);
}
label.setText(selectedValue);
}
});
В этом примере я использую "классическую" TableView
с List<String>
в качестве модели столбца. И, конечно, что label
является всего лишь примером из моего кода.