web-dev-qa-db-fra.com

JavaFX 8: Comment créer un écouteur pour la sélection d'une ligne dans Tableview?

J'ai actuellement deux vues de table sur un seul écran, ce qui fait que les deux vues de table ont des lignes que l'utilisateur peut sélectionner.

Maintenant, je veux qu'une seule ligne soit sélectionnée en même temps (peu importe de quelle TableView elle est sélectionnée). Je pensais à une sorte d'auditeur qui désélectionne l'autre ligne lorsqu'une ligne est sélectionnée. Voici ma configuration initiale:

Étape 1 Recherchez un moyen de lier une méthode à la sélection d'une ligne (il n'y a pas quelque chose comme tableview.setOnRowSelected(method))

Étape 2 Créez la méthode qui agit comme une sorte d'auditeur: lorsqu'une ligne est sélectionnée, désélectionnez l'autre ligne (je sais comment faire cette partie)

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

if(selectedObject1 != null && selectedObject2 != null) {
   tableview1.getSelectionModel().clearSelection();
}

Donc, la première étape est le problème. Je pensais à une liste observable sur laquelle un auditeur peut être créé, puis ajouter la ligne sélectionnée à la liste. Lorsque cela se produit, l'auditeur peut appeler la méthode. Quelqu'un sait-il comment faire cela?

Toute aide est grandement appréciée.

24
bashoogzaad

Le selectedItem dans le modèle de sélection est une propriété observable, vous devriez donc pouvoir y parvenir avec:

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

Je l'utilise pour supprimer la ligne choisie.

public void ButtonClicked()
{
  ObservableList<Names> row , allRows;
  allRows = table.getItems();
  row = table.getSelectionModel().getSelectedItems();         
  row.forEach(allRows::remove);
}

Cette question m'a aidé mais pendant l'expérience dans javafx et jfoenix, cela fonctionne aussi pour moi.

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
badarshahzad

Ma solution serait de créer une fabrique de cellules personnalisée pour la table et de la définir pour chaque colonne de table.

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
user2186425

Dans le cas où vous avez besoin non seulement de la ligne, mais de la position x | y de la cellule du tableau, procédez comme suit:

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

Dans cet exemple, j'utilise un "classique" TableView avec List<String> comme modèle de colonne. Et, bien sûr, que label n'est qu'un exemple de mon code.

0
java.is.for.desktop