JavaFX8: jak utworzyć listener do wyboru wiersza w Tableview?

Obecnie mam dwa widoki tableviews na jednym ekranie, co powoduje, że oba widoki tableviews mają wiersze, które użytkownik może wybrać.

Teraz chcę, aby tylko jeden wiersz był zaznaczony w tym samym czasie(nie ma znaczenia, z którego widoku TableView jest wybrany). Myślałem o jakimś słuchaczu, który usuwa zaznaczenie drugiego rzędu, gdy wiersz jest zaznaczony. To jest moja początkowa konfiguracja:

Krok 1 Wyszukaj sposób wiązania metody z zaznaczeniem wiersza (nie ma czegoś takiego jak tableview.setOnRowSelected(method))

Krok 2 Utwórz metodę, która działa jak rodzaj słuchacza: gdy wiersz jest zaznaczony, usuń zaznaczenie drugiego wiersza (wiem, jak zrobić tę część)

Class1 selectedObject1 = (Class1)tableview1.getSelectionModel().getSelectedItem();
Class2 selectedObject2 = (Class2)tableview2.getSelectionModel().getSelectedItem();

if(selectedObject1 != null && selectedObject2 != null) {
   tableview1.getSelectionModel().clearSelection();
}
Więc pierwszym krokiem jest problem. Myślałem o liście obserwowalnej, na której można utworzyć słuchacza, a następnie dodać wybrany wiersz do listy. Gdy tak się stanie, słuchacz może wywołać metodę. Ktoś wie, jak to zrobić? Każda pomoc jest bardzo mile widziana.
Author: bashoogzaad, 2014-10-17

5 answers

selectedItem w modelu selekcji jest obserwowalną właściwością, więc powinieneś być w stanie to osiągnąć za pomocą:

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();
    }
});
 48
Author: James_D,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-17 14:11:52

Moim rozwiązaniem byłoby stworzenie niestandardowej fabryki komórek dla tabeli i ustawienie jej dla każdej kolumny tabeli.

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();
    ...
 1
Author: user2186425,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-17 13:14:28

Używam go do usuwania wybranego wiersza.

public void ButtonClicked()
{
  ObservableList<Names> row , allRows;
  allRows = table.getItems();
  row = table.getSelectionModel().getSelectedItems();         
  row.forEach(allRows::remove);
}
 1
Author: Sofiane Huckfinn Sellam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-16 00:10:28

To pytanie mi pomogło, ale podczas eksperymentu w javafx i jfoenix to również działa dla mnie.

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

        });
 1
Author: badarshahzad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-29 06:43:59

Jeśli potrzebujesz nie tylko wiersza, ale X|Y pozycji komórki tabeli, wykonaj następujące czynności:

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

W tym przykładzie używam "klasycznego" TableView z List<String> jako modelem kolumnowym. I oczywiście to label jest tylko przykładem z mojego kodu.

 0
Author: java.is.for.desktop,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-28 11:22:06