TableView mit Combox wert wird nicht in die TableView gesetzt

Bluedaishi

Bekanntes Mitglied
Hallo ich habe folgendes Problem ich habe ein TableView mit einer comboBox in der ich einen wert auswählen kann
das funktioniert soweit auch , aber wenn ich die Spalte auslese bekomme ich keine werte ausgegeben.

Java:
 colSchicht1.setCellValueFactory(new PropertyValueFactory<>("Schicht-1"));
        colSchicht1.setCellFactory(TextFieldTableCell.<Objekte>forTableColumn());
        colSchicht1.setCellFactory(ComboBoxTableCell.forTableColumn(option));
        colSchicht1.setMinWidth(80);
        colSchicht1.setOnEditCommit(new EventHandler<TableColumn.CellEditEvent<Objekte, String>>() {
            @Override
            public void handle(CellEditEvent<Objekte, String> event) {
                System.out.println("Value : " + event.getNewValue());
                TablePosition<Objekte, String> pos = event.getTablePosition();
                int row = pos.getRow();
                System.out.println(row);
                Objekte schicht = event.getTableView().getItems().get(row);
            }

        });

hat vielleicht jemand eine idee

vielen Dank
 
Ich lese die gesamte Spalte aus und egal in welcher Zeile kommt immer null zurück . Obwohl in der GUI die änderten werte drin stehen
 
Google doch einfach mal nach "setOnEditCommit". Da findest du z.B. das Beispiel hier:
https://docs.oracle.com/javafx/2/ui_controls/TableViewSample.java.html
Suche da drin nach "setOnEditCommit" und du siehst, wie sie das Modell der Table ändern.
Auf deinen Use-Case übertragen heißt das soviel wie: Nachdem du dir mit `Objekte schicht = event.getTableView().getItems().get(row);` deine Modelldaten für diese Zeile geholt hast, musst du die Modelldaten für diese Spalte anpassen/setzen.
 
Ausserdem: Warum an zwei Zeilen hintereinander eine andere CellFactory setzen? Die zweite überschreibt die erste, damit kannst du die erste auch gleich löschen.
Und: colSchicht1.setCellFactory(ComboBoxTableCell.forTableColumn(option));
  • an welche Column hängst du die CellFactory? (col#setCellFactory)
  • für welche Column erstellst du die CellFactory? (ComboBoxTableCell#forTableColumn(col))
Ohne den Code zu studieren, würde ich sagen, das könnte sich auch negativ auswirken.
 
Seine Frage zielt darauf ab, dass Du ein und der selben Spalte (colSchicht1) unmittelbar hintereinander zwei CellFactories zuweist. Die zweite Zuweisung ersetzt die erste.
 
*Sigh*

Ersetze mal die nun verbleibende Zeile mit colSchicht1.setCellFactory(ComboBoxTableCell.forTableColumn(colSchicht1)); -> Du setzt die CellFactory, die du mit der Spalte option baust, auf die Spalte colSchicht1.
 
Java:
private String[] option = {"CAFE SPÄT", "CAFE FRÜH", "SPÄT OBEN2", "SPÄT OBEN1", "FRÜH OBEN2", "FRÜH OBEN1", "FRÜH UNTEN", "SPÄT UNTEN", "FREI", "URLAUB", "KRANK"};
option sind die einträge der combobox
 
Java:
colSchicht1.setCellFactory(ComboBoxTableCell.forTableColumn(option));
        colSchicht1.setOnEditCommit(new EventHandler<TableColumn.CellEditEvent<Objekte, String>>() {
            @Override
            public void handle(CellEditEvent<Objekte, String> event) {
                System.out.println("Value : " + event.getNewValue() + "  " + event.getOldValue());
                TablePosition<Objekte, String> pos = event.getTablePosition();
                Object newSchicht = event.getNewValue();
                int row = pos.getRow();

            }
        });
 
die auswahlen der combobox stehen auch in den zellen der spalten . aber wenn ich hinterher mit einer for schleife uber die spalte laufe
bekomme ich immer null werte zurück anstatt die einträge
 
Der Methodenname ist auch strange.


die auswahlen der combobox stehen auch in den zellen der spalten . aber wenn ich hinterher mit einer for schleife uber die spalte laufe
bekomme ich immer null werte zurück anstatt die einträge
Soweit waren wir doch schon. Entweder keinen setOnEditCommit verwenden oder dort die Einträge Deiner Liste selbst aktualisieren.
 
Java:
import javafx.application.Application;
import javafx.beans.property.*;
import javafx.collections.*;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.control.cell.*;
import javafx.scene.layout.VBox;
import javafx.scene.media.AudioClip;
import javafx.stage.Stage;

public class Main extends Application {

    public static class Person {
        private StringProperty name;
        private StringProperty firstName;

        public Person(String name, String firstName) {
            this.name = new SimpleStringProperty(name);
            this.firstName = new SimpleStringProperty(firstName);
        }

        public StringProperty nameProperty() {
            return name;
        }

        public StringProperty firstNameProperty() {
            return firstName;
        }
    }

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

    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("Personen");

        TableView<Person> tv = createPersonTable(newNameList());
        tv.setItems(newPersonList());

        Button button = new Button("Print2Console");
        button.setOnAction(e -> tv.getItems().stream()
            .map(Person::nameProperty)
            .map(StringProperty::get)
            .forEach(System.out::println));


        VBox panel = new VBox();
        panel.getChildren().add(tv);
        panel.getChildren().add(button);                

        Scene scene = new Scene(panel, 200, 200);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    private TableView<Person> createPersonTable(ObservableList<String> nameList) {
        TableView<Person> tv = new TableView<>();
        tv.setEditable(true);
        TableColumn<Person,String> nameColumn = new TableColumn<>("Name");
        nameColumn.setCellValueFactory(cdf -> cdf.getValue().nameProperty());
        nameColumn.setCellFactory(ComboBoxTableCell.forTableColumn(nameList));

        TableColumn<Person,String> firstNameColumn = new TableColumn<>("Vorname");
        firstNameColumn.setCellValueFactory(cdf -> cdf.getValue().firstNameProperty());

        tv.getColumns().add(nameColumn);
        tv.getColumns().add(firstNameColumn);

        return tv;
    }

    private ObservableList<Person> newPersonList() {
        ObservableList<Person> result = FXCollections.observableArrayList();
        for (int i = 0; i < 10; i++) {
            String name = String.format("Name %d", i+1);
            String firstName = String.format("Vorname %d", i+1);
            result.add(new Person(name, firstName));
        }
        return result;
    }

    private ObservableList<String> newNameList() {
        ObservableList<String> result = FXCollections.observableArrayList();
        for (int i = 10; i < 20; i++) {
            result.add(String.format("Name %d", i+1));
        }
        return result;
    }
}
 
Und hier noch mit Handler. Durch das Auskommentieren der Zeile wird der Wert nicht übernommen. Wenn Du den Kommentar entfernst, schon.

Java:
    private TableView<Person> createPersonTable(ObservableList<String> nameList) {
        TableView<Person> tv = new TableView<>();
        tv.setEditable(true);
        TableColumn<Person,String> nameColumn = new TableColumn<>("Name");
        nameColumn.setCellValueFactory(cdf -> cdf.getValue().nameProperty());
        nameColumn.setCellFactory(ComboBoxTableCell.forTableColumn(nameList));

        nameColumn.setOnEditCommit(e -> {
            int row = e.getTablePosition().getRow();
//            tv.getItems().get(row).nameProperty().set(e.getNewValue());
        });

        TableColumn<Person,String> firstNameColumn = new TableColumn<>("Vorname");
        firstNameColumn.setCellValueFactory(cdf -> cdf.getValue().firstNameProperty());

        tv.getColumns().add(nameColumn);
        tv.getColumns().add(firstNameColumn);

        return tv;
    }
 
Das nennt sich "Lambda Expression" und:
Java:
nameColumn.setCellValueFactory(cdf -> cdf.getValue().nameProperty());
ist in diesem Fall ultrakrasser syntaktischer Zucker für:
Java:
nameColumn.setCellValueFactory(new Callback<CellDataFeatures<Person, String>, ObservableValue<String>>() {
  @Override
  public ObservableValue<String> call(CellDataFeatures<Person, String> cdf) {
    return cdf.getValue().nameProperty();
  }
});
 
Hab nun den Fehler gefunden er lag in der klasse Objekte dort war ein Fehler in der Setter bzw dort war die variable falsch hinterlegt ........ TALENT 🙂
 
Jetzt noch kurz eine andere Frage wie bekomme ich das hin das ich den Namen der Spalte nach dem User aus einer Datenbank bennnen kann wie auch die Anzahl der Spalten
 

Zurück
Oben