Подтвердить что ты не робот

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();
}

Итак, первый шаг - проблема. Я думал о наблюдаемом списке, на котором можно создать слушателя, а затем добавить выбранную строку в список. Когда это произойдет, слушатель может вызвать метод. Кто-нибудь подскажет, как это сделать?

Любая помощь очень ценится.

4b9b3361

Ответ 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 является всего лишь примером из моего кода.