madzioch
madzioch

Reputation: 62

JavaFX TableView String[] column and String[][] values

I try to add String[] as columnNames and String[][] as data to my JavaFx table. I do create the columns (they are visible), but the data values are a no-go... I didn't received any exception so I'm a little bit confused. I was looking for any other way to add items to JavaFX but they are limited and also not work.

My code is:

private void createScene(String[] columnNames, String[][] inputData) {

TableView table = new TableView();

table.setEditable(false);

for (int i = 0; i < columnNames.length; i++) {

    table.getColumns().add(new TableColumn(columnNames[i]));

}

List<List<String>> data = new ArrayList<List<String>>();

for (int i = 0; i < inputData.length; i++) {
    List<String> row = new ArrayList<String>();
    for (int j = 0; j < inputData[0].length; j++) {

        row.add(inputData[i][j]);

    }

    data.add(row);

}

ObservableList<ObservableList> inpData = FXCollections.observableArrayList();

for (List<String> dataList : data) {
    ObservableList<String> row = FXCollections.observableArrayList();
    for (String rowData : dataList) {
        row.add(rowData);
    }
    inpData.add(row); 
}

table.setItems(inpData); 

table.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);

VBox vbox = new VBox();
vbox.setSpacing(5);
vbox.setPadding(new Insets(10, 0, 0, 10));
vbox.getChildren().add(table);

Scene scene = new Scene(vbox, 500, 500);
jfxPanel.setScene(scene);

}

Any idea how to fix that?

Upvotes: 2

Views: 1405

Answers (1)

James_D
James_D

Reputation: 209694

You need to add a cell value factory to each table column, so that it knows what data to display.

I strongly recommend properly typing your table view and table columns by providing type parameters to them.

private void createScene(String[] columnNames, String[][] inputData) {

    TableView<List<String>> table = new TableView<>();

    table.setEditable(false);

    for (int i = 0; i < columnNames.length; i++) {

        TableColumn<List<String>, String> column = new TableColumn<>(columnNames[i]);

        final int colIndex = i ;
        column.setCellValueFactory(cellData -> 
            new SimpleStringProperty(cellData.getValue().get(colIndex)));

        table.getColumns().add(column);

    }

    List<List<String>> data = new ArrayList<List<String>>();

    for (int i = 0; i < inputData.length; i++) {
        List<String> row = new ArrayList<String>();
        for (int j = 0; j < inputData[0].length; j++) {

            row.add(inputData[i][j]);

        }

        data.add(row);

    }

    ObservableList<List<String>> inpData = FXCollections.observableArrayList(data);



    table.setItems(inpData); 

    table.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);

    VBox vbox = new VBox();
    vbox.setSpacing(5);
    vbox.setPadding(new Insets(10, 0, 0, 10));
    vbox.getChildren().add(table);

    Scene scene = new Scene(vbox, 500, 500);
    jfxPanel.setScene(scene);

}

Upvotes: 4

Related Questions