JavaFX8: Как создать прослушиватель для выбора строки в Tableview?

17

В настоящее время у меня есть два вида таблиц на одном экране, что приводит к тому, что оба 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();
}

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

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

    
задан bashoogzaad 17.10.2014 в 14:11
источник

5 ответов

40

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();
    }
});
    
ответ дан James_D 17.10.2014 в 16:11
источник
0

Мое решение будет создавать пользовательскую фабрику ячеек для таблицы и устанавливать ее для каждого столбца таблицы.

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();
    ...
    
ответ дан user2186425 17.10.2014 в 15:14
источник
0

Я использую его для удаления выбранной строки.

public void ButtonClicked()
{
  ObservableList<Names> row , allRows;
  allRows = table.getItems();
  row = table.getSelectionModel().getSelectedItems();         
  row.forEach(allRows::remove);
}
    
ответ дан Sofiane Huckfinn Sellam 15.04.2016 в 23:50
источник
0

Этот вопрос помог мне, но во время эксперимента в 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;
            }

        });
    
ответ дан badarshahzad 29.04.2017 в 08:43
источник
-1

Если вам нужна не только строка, но и 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 - всего лишь пример из моего кода.

    
ответ дан java.is.for.desktop 28.08.2017 в 12:45
источник