Java JavaFx TableView / TableColumn Spalten aus Liste / Choice Boxes in Cellen

Master1991

Lieutenant
Registriert
Okt. 2007
Beiträge
686
Hi,

wie erwartet komme ich zum nächsten Problem:

Ich möchte mein TableView auffüllen (am Ende ein MWE) und zwar so das:

id | b | a | choiceBox
--------------------------
0 | 0 | 0 | 0/1
1 | 0 | 1 | 0/1
2 | 1 | 0 | 0/1
3 | 1 | 1 | 0/1

Die ids bekomme ich abhängig von meiner Auswahl (Anzahl Bits) in die Tabelle. Die Daten für a und b generiere ich auch die Frage ist nun wie weise ich den Inhalt der Liste den Spalten zu. Ich habe leider absolut keine Ahnung von JavaFX.

Zudem generiere ich für jede spalte bereits eine ChoiceBox in meiner TableWrapper Klasse. Die ChoiceBox soll in die letzte Spalte einer jeden Zeile.

Ich hoffe jemand kann mir da fix auf die sprünge helfen. (Außerdem funktioniert die automatische Breitenanpassung auch nicht, das ist zZ aber zweitrangig)

Code:
package test;

import java.util.ArrayList;
import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.ChoiceBox;
import javafx.scene.control.Label;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class TableViewTest extends Application {

    private ObservableList<TableWrapper> items = FXCollections.observableArrayList();
    private int count;
    private TableView tv;

    @Override
    public void start(Stage primaryStage) {
        ChoiceBox cb = new ChoiceBox();
        cb.setItems(FXCollections.observableArrayList("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"));
        cb.getSelectionModel().select(0);
        cb.getSelectionModel().selectedIndexProperty().addListener(new ChangeListener<Number>() {
            @Override
            public void changed(ObservableValue ov, Number value, Number new_value) {
                count = new_value.intValue();
                createTableData();
                createTableView();
            }
        });

        VBox root = new VBox();
        root.getChildren().add(cb);
        tv = new TableView();
        createTableData();
        createTableView();
        root.getChildren().add(tv);
        Scene scene = new Scene(root, 300, 250);

        primaryStage.setTitle("Nested Obs list test");
        primaryStage.setScene(scene);

        primaryStage.show();
    }

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

    private void createTableView() {
        tv.setEditable(false);
        tv.getColumns().clear();
        tv.setPlaceholder(new Label("No truthtable"));
        tv.getColumns().clear();
        ArrayList<TableColumn> columns = new ArrayList<>();
        columns.clear();
        TableColumn<String, String> tc;
        if (count > 0) {
            tc = new TableColumn<>("#");
            tc.setResizable(false);
            tc.setSortable(false);
            tc.setCellValueFactory(
                    new PropertyValueFactory<>("id"));
            double tmp = 1 / (count + 2);
            tc.widthProperty().multiply(tmp);
            tc.setStyle("-fx-alignment: CENTER-RIGHT;");
            columns.add(tc);

        }
        for (int i = count; i > 0; i--) {
            tc = new TableColumn(Character.toString((char) (i + 96)));
            tc.setResizable(false);
            tc.setSortable(false);

            double tmp = 1 / (count + 2);
            tc.widthProperty().multiply(tmp);
            columns.add(tc);
        }
        tv.getColumns().addAll(columns);
        tv.setItems(items);

    }

    private void createTableData() {
        ArrayList<TableWrapper> tmpData = new ArrayList<>();
        int max = (int) Math.pow(2, count);
        for (int i = 0; i < max; i++) {
            tmpData.add(new TableWrapper(i, count));
        }
        items = FXCollections.observableArrayList(tmpData);
    }
}

und TableWrapper

Code:
package test;

import java.util.List;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.collections.FXCollections;
import javafx.scene.control.ChoiceBox;


public class TableWrapper {

    private final SimpleStringProperty id;
    private final List<SimpleStringProperty> bits;
    private final ChoiceBox cb;

    public TableWrapper(int id, int length) {
        this.id = new SimpleStringProperty(String.valueOf(id));
        this.cb = new ChoiceBox();
        this.bits = FXCollections.observableArrayList();
        String str = Integer.toBinaryString(id);
        for (int i = 0; i < length - str.length(); i++) {
            bits.add(new SimpleStringProperty("0"));
        }
        for (int i = 0; i < str.length(); i++) {
            bits.add(new SimpleStringProperty(String.valueOf(str.charAt(i))));
        }
        cb.setItems(FXCollections.observableArrayList("0", "1"));
        cb.getSelectionModel().select(0);
    }

    public StringProperty idProperty() {
        return id;
    }

}
 
Der Code zeigt eig genau den aktuellen stand. Spalte eins bekomme ich gefuellt. Spalte 2-x nicht weil ich nicht weiß wie ich die Liste den Spalten zuweise. Und die letzte Spalte kann ich auch nicht befuellen ... da sollen dann die choice boxes rein
 
Dein Code ist nicht kommentiert, es gibt keinen Dummy den man sich selber schnell importieren könnte, und ich habe lange nicht mehr mit JavaFX gearbeitet. In meinen Code der mit Tableview arbeitet, wir alles Zeile für Zeile eingelesen.
Der Code ist ein wenig auf deine Variablen Namen verändert worden:
Code:
private void setTables(ArrayList<Data> list, ObservableList<TableWrapper> table){
		for(int i=0;i<list.size();i++){
			table.add(new TableWrapper( list.get(i).getName(), list.get(i).getOtherData(), 
                                                                                                   list.get(i).getMoreOtherData()));
		}
	}

Code:
public class TableWrapper {

    private SimpleStringProperty 	        name;
    private SimpleIntegerProperty 	otherData;
    private SimpleIntegerProperty 	getMoreOtherData;
    
    
    
    
    public Elo_Table_Data(String name, int otherData, int getMoreOtherData){
    	this.name                    = new SimpleStringProperty(name);
    	this.otherData              = new SimpleIntegerProperty(otherData);
    	this.getMoreOtherData = new SimpleIntegerProperty(getMoreOtherData);
   
    }
}

Ich hoffe das hilft dir ein wenig. Sonst probiere in deinem Code ein simples Beispiel aus den Tut von Oracle zu dem Thema.
 
Zurück
Oben