web-dev-qa-db-fra.com

Moyen simple d'ajouter des données aux colonnes

Je souhaite insérer deux ensembles de données distincts dans les colonnes de JavaFX TableView. En gros, j'ai 2 LinkedLists with Strings et je veux mettre une liste dans une colonne et une autre dans la seconde.

Quelle est la manière la plus simple de faire ça? Ou un autre élément JavaFX est-il préférable pour cela?

Seules les solutions que j'ai trouvées jusqu'à présent étaient basées sur des collections insérées dans des lignes, ce qui n'est pas ce que je veux faire.

5
tikend

Je vous recommande fortement de réorganiser vos données, de sorte que vous ayez une classe avec deux propriétés, dont l’un est un élément de votre première liste et l’autre, l’élément correspondant de votre deuxième liste. Ensuite, vous pouvez faire une liste d'objets de cette classe et vous êtes réduit au cas habituel.

Par exemple. supposez que vous avez

// your first list:
List<Integer> intList = ... ;
// your second list:
List<String> stringList = ... ;

Puis définir

public class MyDataType {
    private final int intValue ;
    private final String stringValue ;
    public MyDataType(int intValue, String stringValue) {
        this.intValue = intValue ;
        this.stringValue = stringValue ;
    }
    public int getIntValue() {
        return intValue ;
    }
    public String getStringValue() {
        return stringValue ;
    }
}

Maintenant tu peux faire

TableView<MyDataType> table = new TableView<>();
for (int i = 0; i < intList.size() && i < stringList.size(); i++) {
    table.getItems().add(new MyDataType(intList.get(i), stringList.get(i)));
}

et définir les colonnes de la manière habituelle.

Si vous ne pouvez vraiment pas effectuer cette transformation de données pour une raison quelconque, vous pouvez alors considérer le type de la table comme un entier, la valeur de chaque ligne correspondant à l'index des deux listes. Remplissez le tableau avec les valeurs 0, 1,... jusqu'à la taille des listes. Cela ressemble à:

import Java.util.Arrays;
import Java.util.List;

import javafx.application.Application;
import javafx.beans.property.ReadOnlyIntegerWrapper;
import javafx.beans.property.ReadOnlyStringWrapper;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

public class TableViewByColumns extends Application {

    @Override
    public void start(Stage primaryStage) {
        List<Integer> intValues = Arrays.asList(1, 2, 3, 4, 5);
        List<String> stringValues = Arrays.asList("One", "Two", "Three", "Four", "Five");

        TableView<Integer> table = new TableView<>();
        for (int i = 0; i < intValues.size() && i < stringValues.size(); i++) {
            table.getItems().add(i);
        }

        TableColumn<Integer, Number> intColumn = new TableColumn<>("Value");
        intColumn.setCellValueFactory(cellData -> {
            Integer rowIndex = cellData.getValue();
            return new ReadOnlyIntegerWrapper(intValues.get(rowIndex));
        });

        TableColumn<Integer, String> nameColumn = new TableColumn<>("Name");
        nameColumn.setCellValueFactory(cellData -> {
            Integer rowIndex = cellData.getValue();
            return new ReadOnlyStringWrapper(stringValues.get(rowIndex));
        });

        table.getColumns().add(intColumn);
        table.getColumns().add(nameColumn);

        primaryStage.setScene(new Scene(new BorderPane(table), 600, 600));
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
9
James_D

J'ai trouvé un tutoriel JavaFX qui semble avoir des solutions pour prendre des collections et remplir des colonnes en fonction de celles-ci, ainsi que pour avoir la table automatiquement mise à jour à mesure que les collections changent, à l'aide d'une ObservableList.

http://code.makery.ch/library/javafx-8-tutorial/part2/

Leur code a une liste d'objets avec deux attributs, vous voudrez peut-être modifier leur code pour tirer de vos deux listes séparées au lieu d'accéder aux deux variables de leurs objets pour les colonnes séparées.

1
dbillz