JavaFX aktuelle Tabellenzeile bei Choice-Box-Auswahl in Zelle ermitteln

Padde85

Mitglied
Hallo zusammen,

die Titelzeile klingt vielleicht etwas kryptisch, daher hier noch Mal erläutert :)

Ich habe eine editierbare TableView mit 3 Spalten. In diesen drei Spalten existieren zwei String-Propertys und eine Choice-Box.
Ich bekomme auch alles angezeigt und bekomme auch die Werte der Choice-Box. So weit so gut. Jetzt wird es aber interessant.

Wenn ich nun z.B. 5 Zeilen habe und der Anwender wählt in der 3. Zeile in der Choice-Box einen Eintrag aus, möchte ich darauf reagieren (onAction-Event der Choice-Box) und in der Zeile, wo die Choice-Box enthalten ist, einen Wert in Spalte 2 oder 3 abfragen bzw. eintragen.

Jetzt stellt sich mir die spannende Frage, wie ich denn raus finden kann, in welcher Tabellenzeile das Ereignis ausgelöst wurde...?
Bei einer Checkbox wird das Edit-Event verwendet, was wiederum über event.getTablePosition.getRow.get die Möglichkeit bietet, auf das Datenobjekt der x-ten Zeile zuzugreifen.
Blöderweise kennt das ActionEvent diese Vorgehensweise nicht. Und die ChoiceBox wird ja auch nicht editiert, daher bringt mir das Edit-Event hier nichts. Oder doch...?

Eine ganze dirty Möglichkeit wäre natürlich, im Objekt der ChoiceBox vom Typ xyz einen weiteren Parameter mitzugeben und dort die Zeilennummer zu speichern. Das halte ich allerdings für sehr unsauber und bin mir relativ sicher, dass es da einen eleganteren Weg geben muss.

Zur Veranschaulichung hier ein Screen-Shot was ich meine:
screen.png

Der Anwender hat nun in diesem Fall die erste Zeile "geändert", indem anstatt "Kopfzeile" der Eintrag "Hauptbereich" ausgewählt wurde. Jetzt möchte ich wissen, in welcher Zeile das war, um hinten die Checkbox abzuprüfen, da eine Kombination Kopfbereich und markierte Checkbox nicht zulässig sein soll.

Ich hoffe, ich habe mich verständlich ausgedrückt :)

Danke für eure Hilfe
 

Padde85

Mitglied
Spalte 2 ist uninteressant für die Betrachtung, aber wenn jemand Kopfbereich auswählt und der Haken hinten gesetzt ist, soll der Haken wieder automatisch entfernt und der Anwender darauf aufmerksam gemacht werden.

Aber ich schaue Mir deinen Link Mal an. Danke für die Info :)
 

lam_tr

Top Contributor
Spalte 2 ist uninteressant für die Betrachtung, aber wenn jemand Kopfbereich auswählt und der Haken hinten gesetzt ist, soll der Haken wieder automatisch entfernt und der Anwender darauf aufmerksam gemacht werden.

Aber ich schaue Mir deinen Link Mal an. Danke für die Info :)

Ja das sollte über den CellFactory Problem losgehen. Wahrscheinlich muss du nachdem der Wert ausgelesen wird noch im CellFactory die TableView refreshed werden.
 

Padde85

Mitglied
Also ich habe mir das Mal angeschaut und verstehe nicht, wie das funktionieren soll.
In der CellFactory habe ich auch wieder nur das Datenobjekt der aktuellen Zelle im Zugriff. Das hilft mir ja an der Stelle wieder nicht weiter...
 

lam_tr

Top Contributor
Da ich keinen Code von dir vor mir habe, passe ich das hier ein bisschen an
Code:
positionColumn.setCellFactory(column -> {
    return new TableCell<MeineRow , MeineRow>() {
        @Override
        protected void updateItem(MeineRow item, boolean empty) {
            super.updateItem(item, empty);

            if (item == null || empty) {
                setText(null);
                setGraphic("");
            } else {
                ChoiceBox cb = new ChoiceBox();
                cb.setItems(FXCollections.observableArrayList("Kopfzeile", "Fusszeile", "Header"));
                cb.getSelectionModel().setSelection(item.getPosition());
                cb.setOnAction(e->{
                   System.out.println(item.isTabellarisch());
                   System.out.println(item.isTabellarisch());
                });
                setGraphic(cb);
            }
        }
    };
});

Der Code ist ungetestet, aber ich denke ungefähr so könnte bei dir aussehen.
 

Padde85

Mitglied
danke für das Beispiel. Eclipse ist aber der Meinung, dass ich das so nicht darf :(

Hier mal die relevanten Coding-Strecken:

Aufbau der TableView:
Java:
 // TableView erzeugen
    public void initTableView() {
    EventHandler<TableColumn.CellEditEvent<VarUsageTypeDef, String>> handler = new EventHandler<TableColumn.CellEditEvent<VarUsageTypeDef,String>>() {
        @Override
        public void handle(CellEditEvent<VarUsageTypeDef, String> event) {
        controller.onTextInputCommit(event);
        }
    };
    
    controller.tcPosition.setCellValueFactory(new PropertyValueFactory<VarUsageTypeDef, ChoiceBox<PositionDefinition>>("cbPosition"));
    controller.tcPosition.setCellFactory(column -> {
       return new TableCell<VarUsageTypeDef, ChoiceBox<PositionDefinition>>() {

        @Override
        protected void updateItem(ChoiceBox<PositionDefinition> item, boolean empty) {
        // TODO Auto-generated method stub
        super.updateItem(item, empty);
        }
          
       };
    });
    controller.tcDescription.setCellValueFactory(new PropertyValueFactory<VarUsageTypeDef, String>("description"));
    controller.tcDescription.setCellFactory(TextFieldTableCell.forTableColumn());
    controller.tcDescription.setOnEditCommit(handler);
    controller.tcTableType.setCellValueFactory(new PropertyValueFactory<VarUsageTypeDef, CheckBox>("ckbTable"));

    controller.tvTypeDef.setItems(controller.getSettingsList());
    }
    
    // Choice-Box für Positionierungen erzeugen
    public ChoiceBox<PositionDefinition> getTableChoiceBox() {
    ChoiceBox<PositionDefinition> cBox = new ChoiceBox<PositionDefinition>();
    cBox.setMinWidth(controller.tcPosition.getWidth());
    cBox.setMaxWidth(controller.tcPosition.getWidth());
    cBox.setConverter(new StringConverter<PositionDefinition>() {
        @Override
        public String toString(PositionDefinition object) {
        return object.toString();
        }
        
        @Override
        public PositionDefinition fromString(String string) {
        return null; // Box ist nicht editierbar, daher keine Konvertierung in Object nötig
        }
    });
    return cBox;
    }

Die Klasse der Choice-Box:
Java:
/*
 * Container-Klasse für die Definition der Positionierung im Dokument (Kopf, Body, Fußzeile)
 */
public class PositionDefinition {
    private char usage;
    private String description;
    
    public PositionDefinition(char usage, String description) {
    this.description = description;
    this.usage = usage;
    }

    public int getUsage() {
    return this.usage;
    }

    public void setUsage(char usage) {
    this.usage = usage;
    }
    
    public String toString() {
    return this.description;
    }
}

Und die Klasse für die allgemeine Zeilenstruktur:
Java:
import java.util.ArrayList;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.control.CheckBox;
import javafx.scene.control.ChoiceBox;

/*
 * Container-Klasse für die Verwendungsart-Definition
 */
public class VarUsageTypeDef {
    private int id;
    private boolean isChanged;
    private SimpleObjectProperty<ChoiceBox<PositionDefinition>> cbPosition;
    private SimpleStringProperty description;
    private SimpleObjectProperty<CheckBox> ckbTable;
    
    // Konstruktor, um Datenpaket aufzubauen mit übergebenen Daten
    public VarUsageTypeDef(int id, String description, char usage, ArrayList<PositionDefinition> posList, boolean table, ChoiceBox<PositionDefinition> box) {
    int index = 0;
    int id_selected = -1;
    
    this.setId(id);
    this.description = new SimpleStringProperty();
    setDescription(description);
    
    this.cbPosition = new SimpleObjectProperty<ChoiceBox<PositionDefinition>>();
    ObservableList<PositionDefinition> olist = null;
    for (PositionDefinition item : posList) {
        if (olist == null)
        olist = FXCollections.observableArrayList(item);
        else
        olist.add(item);
        
        if (item.getUsage() == usage)
        id_selected = index;
        index++;
    }
    
    box.setItems(olist);
    if(id_selected >= 0)
        box.getSelectionModel().select(id_selected);
    setCbPosition(box);
    
    // Checkbox erzeugen
    this.ckbTable = new SimpleObjectProperty<CheckBox>();
    CheckBox checkBox = new CheckBox();
    checkBox.setSelected(table);
    setCkbTable(checkBox);
    }

    public int getId() {
    return id;
    }

    public void setId(int id) {
    this.id = id;
    }

    public ChoiceBox<PositionDefinition> getCbPosition() {
    return this.cbPosition.get();
    }

    public void setCbPosition(ChoiceBox<PositionDefinition> cbPosition) {
    this.cbPosition.set(cbPosition);
    }

    public String getDescription() {
    return this.description.get();
    }

    public void setDescription(String description) {
    this.description.set(description);
    }

    public CheckBox getCkbTable() {
    return this.ckbTable.get();
    }

    public void setCkbTable(CheckBox ckbTable) {
    this.ckbTable.set(ckbTable);
    }
    
    public boolean getIsChanged() {
    return this.isChanged;
    }
    
    public void setIsChanged() {
    this.isChanged = true;
    }
}

Ggf. liegt auch schon im allgemeinen Vorgehen der Fehler begraben...
 

lam_tr

Top Contributor
danke für das Beispiel. Eclipse ist aber der Meinung, dass ich das so nicht darf :(

Hier mal die relevanten Coding-Strecken:

Aufbau der TableView:
Java:
 // TableView erzeugen
    public void initTableView() {
    EventHandler<TableColumn.CellEditEvent<VarUsageTypeDef, String>> handler = new EventHandler<TableColumn.CellEditEvent<VarUsageTypeDef,String>>() {
        @Override
        public void handle(CellEditEvent<VarUsageTypeDef, String> event) {
        controller.onTextInputCommit(event);
        }
    };
   
    controller.tcPosition.setCellValueFactory(new PropertyValueFactory<VarUsageTypeDef, ChoiceBox<PositionDefinition>>("cbPosition"));
    controller.tcPosition.setCellFactory(column -> {
       return new TableCell<VarUsageTypeDef, ChoiceBox<PositionDefinition>>() {

        @Override
        protected void updateItem(ChoiceBox<PositionDefinition> item, boolean empty) {
        // TODO Auto-generated method stub
        super.updateItem(item, empty);
        }
         
       };
    });
    controller.tcDescription.setCellValueFactory(new PropertyValueFactory<VarUsageTypeDef, String>("description"));
    controller.tcDescription.setCellFactory(TextFieldTableCell.forTableColumn());
    controller.tcDescription.setOnEditCommit(handler);
    controller.tcTableType.setCellValueFactory(new PropertyValueFactory<VarUsageTypeDef, CheckBox>("ckbTable"));

    controller.tvTypeDef.setItems(controller.getSettingsList());
    }
   
    // Choice-Box für Positionierungen erzeugen
    public ChoiceBox<PositionDefinition> getTableChoiceBox() {
    ChoiceBox<PositionDefinition> cBox = new ChoiceBox<PositionDefinition>();
    cBox.setMinWidth(controller.tcPosition.getWidth());
    cBox.setMaxWidth(controller.tcPosition.getWidth());
    cBox.setConverter(new StringConverter<PositionDefinition>() {
        @Override
        public String toString(PositionDefinition object) {
        return object.toString();
        }
       
        @Override
        public PositionDefinition fromString(String string) {
        return null; // Box ist nicht editierbar, daher keine Konvertierung in Object nötig
        }
    });
    return cBox;
    }

Die Klasse der Choice-Box:
Java:
/*
* Container-Klasse für die Definition der Positionierung im Dokument (Kopf, Body, Fußzeile)
*/
public class PositionDefinition {
    private char usage;
    private String description;
   
    public PositionDefinition(char usage, String description) {
    this.description = description;
    this.usage = usage;
    }

    public int getUsage() {
    return this.usage;
    }

    public void setUsage(char usage) {
    this.usage = usage;
    }
   
    public String toString() {
    return this.description;
    }
}

Und die Klasse für die allgemeine Zeilenstruktur:
Java:
import java.util.ArrayList;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.control.CheckBox;
import javafx.scene.control.ChoiceBox;

/*
* Container-Klasse für die Verwendungsart-Definition
*/
public class VarUsageTypeDef {
    private int id;
    private boolean isChanged;
    private SimpleObjectProperty<ChoiceBox<PositionDefinition>> cbPosition;
    private SimpleStringProperty description;
    private SimpleObjectProperty<CheckBox> ckbTable;
   
    // Konstruktor, um Datenpaket aufzubauen mit übergebenen Daten
    public VarUsageTypeDef(int id, String description, char usage, ArrayList<PositionDefinition> posList, boolean table, ChoiceBox<PositionDefinition> box) {
    int index = 0;
    int id_selected = -1;
   
    this.setId(id);
    this.description = new SimpleStringProperty();
    setDescription(description);
   
    this.cbPosition = new SimpleObjectProperty<ChoiceBox<PositionDefinition>>();
    ObservableList<PositionDefinition> olist = null;
    for (PositionDefinition item : posList) {
        if (olist == null)
        olist = FXCollections.observableArrayList(item);
        else
        olist.add(item);
       
        if (item.getUsage() == usage)
        id_selected = index;
        index++;
    }
   
    box.setItems(olist);
    if(id_selected >= 0)
        box.getSelectionModel().select(id_selected);
    setCbPosition(box);
   
    // Checkbox erzeugen
    this.ckbTable = new SimpleObjectProperty<CheckBox>();
    CheckBox checkBox = new CheckBox();
    checkBox.setSelected(table);
    setCkbTable(checkBox);
    }

    public int getId() {
    return id;
    }

    public void setId(int id) {
    this.id = id;
    }

    public ChoiceBox<PositionDefinition> getCbPosition() {
    return this.cbPosition.get();
    }

    public void setCbPosition(ChoiceBox<PositionDefinition> cbPosition) {
    this.cbPosition.set(cbPosition);
    }

    public String getDescription() {
    return this.description.get();
    }

    public void setDescription(String description) {
    this.description.set(description);
    }

    public CheckBox getCkbTable() {
    return this.ckbTable.get();
    }

    public void setCkbTable(CheckBox ckbTable) {
    this.ckbTable.set(ckbTable);
    }
   
    public boolean getIsChanged() {
    return this.isChanged;
    }
   
    public void setIsChanged() {
    this.isChanged = true;
    }
}

Ggf. liegt auch schon im allgemeinen Vorgehen der Fehler begraben...
Kannst du mir auch sagen an welcher Stelle Eclipse meckert?

An sich muss du mein Beispiel überall wo MeineRow steht mit deiner Datenklasse ersetzen.
 

Padde85

Mitglied
Eclipse meckert an der Stelle, wo das updateItem ist, weil er zwingend den Datentyp ChoiceBox erwartet und nicht den Datentyp der kompletten Zeile.
 

lam_tr

Top Contributor
Achso das ist klar, du kannst die PropertyValueFactory so definiert, der erwartet eine ChoiceBox.

Code:
controller.tcPosition.setCellValueFactory(new PropertyValueFactory<VarUsageTypeDef, ChoiceBox<PositionDefinition>>("cbPosition"));

Du muss daraus das hier machen

Code:
controller.tcPosition.setCellValueFactory(new PropertyValueFactory<VarUsageTypeDef, PositionDefinition>("cbPosition"));

Soweit ich weiß gibt das zweite Argument den Datentyp von dem Feld den du holen willst.
 

Padde85

Mitglied
Also nach einigem Hin und Her-Probieren geht das auch nicht. Der meckert dann rum, dass er die ChoiceBox nicht in den Typ der Zeile konvertieren kann und schmiert ab.
Eine ChoiceBox lässt der einen nur dann einfügen, wenn auch der Typ der Zelle eine ChoiceBox erwartet.

Also baue ich eine Cross-Referenz der Zeile in die Choice-Box ein. Nicht schön, aber funktioniert scheinbar nicht anders...
 
Zuletzt bearbeitet:

lam_tr

Top Contributor
Also nach einigem Hin und Her-Probieren geht das auch nicht. Der meckert dann rum, dass er die ChoiceBox nicht in den Typ der Zeile konvertieren kann und schmiert ab.
Eine ChoiceBox lässt der einen nur dann einfügen, wenn auch der Typ der Zelle eine ChoiceBox erwartet.

Also baue ich eine Cross-Referenz der Zeile in die Choice-Box ein. Nicht schön, aber funktioniert scheinbar nicht anders...

Okay ich habe noch einen Punkt gesehen, du hast in deiner Datenklassen die cbPosition mit ChoiceBox deklariert, das muss natürlich auch raus und nur PositionDefinition defininiert werden.

private SimpleObjectProperty<ChoiceBox<PositionDefinition>> cbPosition;
 

Padde85

Mitglied
Super, danke dir für die Unterstützung :)

Musste einiges umbauen, aber dafür funktioniert es nun sauber und ohne es hinten herum durch die Brust ins Auge zu machen :)
Und wieder was dazugelernt.
 

Padde85

Mitglied
In der Tat :)

Leider hört der Spaß schon wieder auf. Ich kann nun super Werte eintragen und verändern und es stimmt immer.
Aber folgendes Problem:

Ich lade die Daten, die angezeigt werden sollen, aus einer Datenbank. In der Datenbank steht nun logischerweise nur noch die ID, die der Anwender in der Choice-Box ausgewählt hat.
Wenn ich die Daten nun in die TableView lade, steht in dem Feld leider nichts drin :(

Wie kann ich nun erreichen, dass die Daten direkt beim Laden und Einfüllen schon in der ChoiceBox entsprechend angezeigt und korrekt selektiert sind?

Bevor ich die Anpassungen gemacht habe, konnte ich ja die Choice-Box als Objekt anpassen und dort den entsprechenden Index slektieren.

Wie geht das aber nun mit dem Ansatz von oben?
 

lam_tr

Top Contributor
Das ist an sich schon implementiert oben

Code:
positionColumn.setCellFactory(column -> {
    return new TableCell<MeineRow , MeineRow>() {
        @Override
        protected void updateItem(MeineRow item, boolean empty) {
            super.updateItem(item, empty);

            if (item == null || empty) {
                setText(null);
                setGraphic("");
            } else {
                ChoiceBox cb = new ChoiceBox();
                cb.setItems(FXCollections.observableArrayList("Kopfzeile", "Fusszeile", "Header"));
                // Hier wird der Wert von dem DatenModel selektiert, warum hast du nur eine Id?
                cb.getSelectionModel().setSelection(item.getPosition());
                cb.setOnAction(e->{
                   System.out.println(item.isTabellarisch());
                   System.out.println(item.isTabellarisch());
                });
                setGraphic(cb);
            }
        }
    };
});
 

Padde85

Mitglied
ich wollte das gerade ausprobieren und leider geht das aus dem alten bekannten Grund nicht:
Die Methode updateItem hat nur einen Parameter mit Werten und das sind die vom Typ VarUsageType. Damit habe ich wieder keine Info über die Zeile, in der ich mich befinde und damit auch keinen Zugriff auf die Daten zu der Zeile.

So generiert mir das Eclipse hin:
Java:
main.tcHdType.setCellFactory(column -> {
        return new TableCell<TemplateData, VarUsageType>() {

        @Override
        protected void updateItem(VarUsageType item, boolean empty) {
            // TODO Auto-generated method stub
            super.updateItem(item, empty);
        }
        
        };
    });

Die Spalte ist jetzt mittlerweile so deiniert:
Java:
public TableColumn<TemplateData, VarUsageType> tcHdType;

und hier noch der Rest vom Code, der für diese Spalte relevant ist:
Java:
main.tcHdType.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<TemplateData,VarUsageType>, ObservableValue<VarUsageType>>() {
        @Override
        public ObservableValue<VarUsageType> call(CellDataFeatures<TemplateData, VarUsageType> param) {
        VarUsageType def = null;
        TemplateData tdata = param.getValue();
        ObservableList<VarUsageType> list = main.getUsageTypes('H');
        for (VarUsageType item : list) {
            if (item.getUsage() == tdata.getVtype()) {
            def = item;
            break;
            }
        }
        return new SimpleObjectProperty<VarUsageType>(def);
        }
    });
    main.tcHdType.setCellFactory(column -> {
        return new TableCell<TemplateData, VarUsageType>() {

        @Override
        protected void updateItem(VarUsageType item, boolean empty) {
            // TODO Auto-generated method stub
            super.updateItem(item, empty);
        }
        
        };
    });
    main.tcHdType.setOnEditCommit((CellEditEvent<TemplateData, VarUsageType> event) -> {
        TablePosition<TemplateData, VarUsageType> position = event.getTablePosition();
        VarUsageType type = event.getNewValue();
        TemplateData data = event.getTableView().getItems().get(position.getRow());
        data.setVtype(type.getId());
    });

Übersehe ich was oder stehe ich nur wieder auf dem Schlauch?
 

lam_tr

Top Contributor
Was repräsentiert bei dir eine Zeile, TemplateData? Und VarUsageType ist nicht der gewünschte Anzeigewert bei tcHdType?

Woher kommt das jetzt main.getUsageTypes('H');?

Es ist etwas schwierig für mich was zu sagen, wenn wir von verschiedenen Columns reden und nur Codefragmente sehe.

Ich vermute der Part sollte so aussehen:
Code:
main.tcHdType.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<TemplateData,VarUsageType>, ObservableValue<VarUsageType>>() {
        @Override
        public ObservableValue<VarUsageType> call(CellDataFeatures<TemplateData, VarUsageType> param) {
        VarUsageType def = null;
        TemplateData tdata = param.getValue();
        return new SimpleObjectProperty<VarUsageType>(tdata.getVtype());
        }
    });

Und in der CellFactory solltest du die ComboBox hinzufügen, sonst würdest vermutlich nichts sehen.

Code:
 main.tcHdType.setCellFactory(column -> {
        return new TableCell<TemplateData, VarUsageType>() {

        @Override
        protected void updateItem(VarUsageType item, boolean empty) {
            // TODO Auto-generated method stub
            super.updateItem(item, empty);

            if (item == null || empty) {
                setText(null);
                setGraphic("");
            } else {
                ChoiceBox cb = new ChoiceBox();
                cb.setItems(FXCollections.observableArrayList(main..getUsageTypes('H')));
                // Hier wird der Wert von dem DatenModel selektiert, warum hast du nur eine Id?
                cb.getSelectionModel().setSelection(item.getVtype());
                setGraphic(cb);
            }



        }
        
        };
    });
 

Padde85

Mitglied
Sorry, das hätte ich dazuschreiben müssen. Da waren die Finger schneller als das Hirn...

Oben ging es darum, den Typen zu definieren, der jetzt in diesem Beispiel verwendet wird.

Hier ein Screenshot, wie es aussieht plus Erläuterung:
1592993632906.png

Das Blaue ist der komplette Zeilentyp, in dem dann die ChoiceBox eingebaut wird, so wie wir sie oben im ursprünglichen Beitrag, aufgebaut haben.
In rot die Choice-Box, die nur die für den jeweiligen Dokumentenabschnitt relevanten Einträge enthält. Daher das main.getUsageTypes. Diese Methode liefert die für den Bereich (im Screenshot die Kopfzeile eines Word-Dokumentes) relevanten Verwendungsarten.

Hier der Code für die Zeilenstruktur:
Java:
/*
 * Container-Klasse für die Tabellendaten zum Template
 * Die Daten werden dann in die jeweiligen GUI-Tabellen geschrieben
 * Jede Tabellenzeile wird dabei von einem Objekt repräsentiert
 */
public class TemplateData {
    private char table;
    private int id;
    private int vtype;
    private SimpleStringProperty content;
    private SimpleStringProperty varname;
    
    public TemplateData(char table, int id, int vtype, String content, String varname) {   
    this.table = table;
    this.id = id;
    this.vtype = vtype;
    this.content = new SimpleStringProperty();
    setContent(content);
    this.varname = new SimpleStringProperty();
    setVarname(varname);
    }
    
    public char getTable() {
    return this.table;
    }
    
    public int getID() {
    return this.id;
    }
    
    // Setter nötig, da nach Datenbank-Update erzeugte GUIs in Tabellenzeilen übernommen werden müssen
    public void setID(int id) {
    this.id = id;
    }

    public int getVtype() {
    return this.vtype;
    }

    public void setVtype(int vtype) {
    this.vtype = vtype;
    }

    public String getContent() {
    return this.content.get();
    }

    public void setContent(String content) {
    this.content.set(content);
    }

    public String getVarname() {
    return this.varname.get();
    }

    public void setVarname(String varname) {
    this.varname.set(varname);
    }
}

Und hier für den UsageType:
Java:
/*
 * Container-Klasse für die Verwendungsarten in der ChoiceBox in den jeweiligen GUI-Tabellen
 */
public class VarUsageType {
    private int id;
    private char usage;
    private String description;
    
    public VarUsageType(int id, char usage, String description) {
    this.id = id;
    this.description = description;
    this.usage = usage;
    }
    
    public int getId() {
    return this.id;
    }
    
    public void setId(int id) {
    this.id = id;
    }
    
    public char getUsage() {
    return this.usage;
    }
    
    public void setUsage(char usage) {
    this.usage = usage;
    }
    
    public String getDescription() {
    return this.description;
    }
    
    public void setDescription(String description) {
    this.description = description;
    }
    
    public String toString() {
    return this.description;
    }
}

Und zu guter Letzt noch die Definition der Tabelle und der Spalten (nicht wundern, es gibt drei identische Tabellen, die unterschiedliche Daten beinhalten):
Java:
 public TableView<TemplateData> tvTplHeader;
    public TableView<TemplateData> tvTplBody;
    public TableView<TemplateData> tvTplFooter;
    public TableColumn<TemplateData, VarUsageType> tcHdType;
    public TableColumn<TemplateData, String> tcHdContent;
    public TableColumn<TemplateData, String> tcHdVar;
    public TableColumn<TemplateData, VarUsageType> tcBdType;
    public TableColumn<TemplateData, String> tcBdContent;
    public TableColumn<TemplateData, String> tcBdVar;
    public TableColumn<TemplateData, VarUsageType> tcFtType;
    public TableColumn<TemplateData, String> tcFtContent;
    public TableColumn<TemplateData, String> tcFtVar;

Falls noch was fehlen sollte, kann ich das gerne noch ergänzen :)
 

Padde85

Mitglied
In deinem Code-Beispiel habe ich nur den Datentyp VarUsageType im Zugriff. Damit weiß ich aber nicht, was denn aus der Datenbank ausgelesen wird, um diesen in der ChoiceBox vorselektieren zu können, da diese Info nur im TemplateData vorliegt. VarUsageType ist ja nur ein Container für alle möglichen Arten, die ausgewählt werden können, da diese dynamisch sind.

Auf der Datenbank steht zum Beispiel folgender Satz für den Screenshot aus obigem Beispiel:
1593002347616.png
Hierbei ist ID eine rein technische ID, über die der Datensatz auf der Datenbank persisitiert wird und hat hier keine Relevanz. TID ist die Template-ID, da ein Anwender mehrere Konfigurationen abspeichern kann. Die VID bezieht sich dann auf die ausgewählte Verwendungsart.

Und diese sind so definiert:
1593002431261.png

Daher befindet sich die Info, was wo ausgewählt wurde, nur in dem Objekt der Zeile und nicht in den Objekten, die dann in der ChoiceBox dargestellt werden sollen. Und genau der Umstand bereitet mir gerade die Probleme
 

lam_tr

Top Contributor
In deinem Code-Beispiel habe ich nur den Datentyp VarUsageType im Zugriff. Damit weiß ich aber nicht, was denn aus der Datenbank ausgelesen wird, um diesen in der ChoiceBox vorselektieren zu können, da diese Info nur im TemplateData vorliegt. VarUsageType ist ja nur ein Container für alle möglichen Arten, die ausgewählt werden können, da diese dynamisch sind.

Auf der Datenbank steht zum Beispiel folgender Satz für den Screenshot aus obigem Beispiel:
Anhang anzeigen 13675
Hierbei ist ID eine rein technische ID, über die der Datensatz auf der Datenbank persisitiert wird und hat hier keine Relevanz. TID ist die Template-ID, da ein Anwender mehrere Konfigurationen abspeichern kann. Die VID bezieht sich dann auf die ausgewählte Verwendungsart.

Und diese sind so definiert:
Anhang anzeigen 13676

Daher befindet sich die Info, was wo ausgewählt wurde, nur in dem Objekt der Zeile und nicht in den Objekten, die dann in der ChoiceBox dargestellt werden sollen. Und genau der Umstand bereitet mir gerade die Probleme
Benutzt du kein OR Mapper sodass du direkt die Wert auslesen kannst? Dann ist jetzt auch klar, warum du Die Liste durchgehst du das passende Objekt holst.
 

lam_tr

Top Contributor
Wie du den richtigen Wert bekommst, weiß du ja wie, die Anzeige geschieht nach dem Kommentar. An sich muss du das richtige Object holen und dort als Selection übergeben.

// Hier wird der Wert von dem DatenModel selektiert, warum hast du nur eine Id?
cb.getSelectionModel().setSelection(selection);
 

Padde85

Mitglied
Benutzt du kein OR Mapper sodass du direkt die Wert auslesen kannst? Dann ist jetzt auch klar, warum du Die Liste durchgehst du das passende Objekt holst.
Was ist ein OR Mapper? Google spuckt dafür nichts sinnvolles aus.

Wie du den richtigen Wert bekommst, weiß du ja wie, die Anzeige geschieht nach dem Kommentar. An sich muss du das richtige Object holen und dort als Selection übergeben.

// Hier wird der Wert von dem DatenModel selektiert, warum hast du nur eine Id?
cb.getSelectionModel().setSelection(selection);
Das ist ja mein Problem, dass ich keine Ahnung habe, wie ich an den richtigen Wert kommen soll. Ich habe an der Stelle nur eine ID, weil ich aktuell für jeden Bereich (Kopfzeile, Body und Fußzeile) nur einen Eintrag hinzugefügt habe.
Ich habe ja in der updateItem keine Möglichkeit, auf das Objekt der Zeile zuzugreifen, da sowohl focusedIndex als auch selectedIndex der Tabelle jeweils leer sind.
 

fhoffmann

Top Contributor
Was ist ein OR Mapper? Google spuckt dafür nichts sinnvolles aus.
Vielleicht ist dein google ja kaputt - bei mir hat es jedenfalls als ersten Treffer folgendes herausgeworfen:
Es geht dabei darum, Objekte einer Anwendung ("O") in relationale Tabellen einer Datenbank ("R") zu mappen.
 

Padde85

Mitglied
Vielleicht ist dein google ja kaputt - bei mir hat es jedenfalls als ersten Treffer folgendes herausgeworfen:
Es geht dabei darum, Objekte einer Anwendung ("O") in relationale Tabellen einer Datenbank ("R") zu mappen.
Wenn man nach JAVA OR mapper sucht, findet man nichts sinnvolles, nur wenn man nach OR Mapper sucht. Ich bin davon ausgegangen, dass das eine Bezeichnung für eine Java-Funktionalität war.
ich werde mir dann mal ein paar Beispiele dazu durchlesen und schauen, ob das bei meiner Problemstellung die Lösung sein könnte. Danke für die Aufklärung :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B JavaFX Bei Scenen-Wechsel im primaryStage wird aktuelle Fenstergröße nicht mit übernommen AWT, Swing, JavaFX & SWT 16
E Aktuelle Uhrzeit auf jeder Stage anzeigen lassen (JavaFX) AWT, Swing, JavaFX & SWT 2
F JavaFX Aktuelle Zeit in einem TextField anzeigen AWT, Swing, JavaFX & SWT 7
M Java FX Immer aktuelle Mausposition anzeigen AWT, Swing, JavaFX & SWT 6
K Swing Aktuelle Uhrzeit anzeigen AWT, Swing, JavaFX & SWT 3
T Swing Aktuelle Größe eines Textes in einem Label darstellen AWT, Swing, JavaFX & SWT 3
D JFreeChart - aktuelle code beispiele AWT, Swing, JavaFX & SWT 11
P Aktuelle Zeile in JTextPane farblich hervorheben AWT, Swing, JavaFX & SWT 3
B aktuelle Position des Fensters ermitteln AWT, Swing, JavaFX & SWT 3
M Aktuelle Mausposition im Koordinatensystem AWT, Swing, JavaFX & SWT 3
G Aktuelle Mausposition auslesen und ausgeben AWT, Swing, JavaFX & SWT 2
G aktuelle panel herausfinden AWT, Swing, JavaFX & SWT 7
S aktuelle möglichkeit images zu laden? AWT, Swing, JavaFX & SWT 2
S [AWT] Aktuelle Version, bzw. Referenz? AWT, Swing, JavaFX & SWT 3
Landei Swing JTable - Tabellenzeile kopieren AWT, Swing, JavaFX & SWT 2
S Gridlayout - Tabellenzeile "beenden" AWT, Swing, JavaFX & SWT 3
I SWT Größe einer Tabellenzeile, -spalte ändern AWT, Swing, JavaFX & SWT 8
L Farbe des Auswahlrechtecks bei selektierter Tabellenzeile AWT, Swing, JavaFX & SWT 9
G Am Ende einer Tabellenzeile zu definierter Komponente gehen AWT, Swing, JavaFX & SWT 2
M Tabellenzeile fixieren? AWT, Swing, JavaFX & SWT 4
cezary Choice, JComboBox oder JList AWT, Swing, JavaFX & SWT 5
N Swing Choice- Problem! AWT, Swing, JavaFX & SWT 8
S Multiple Choice Test AWT, Swing, JavaFX & SWT 2
J AWT choice mit viel Auswahl aktualisiert sich nicht korrekt beim scrollen?! AWT, Swing, JavaFX & SWT 3
Q AWT Choice ein Zeichen hinzufügen AWT, Swing, JavaFX & SWT 4
N Java Choice Bilderausgabe - images - - image - AWT, Swing, JavaFX & SWT 2
L choice probleme AWT, Swing, JavaFX & SWT 9
T Choice "gezielt" darstellen aber wie - mit Koordinaten aber wie? AWT, Swing, JavaFX & SWT 6
F Probleme mit der GUI (Choice) AWT, Swing, JavaFX & SWT 3
H2SO3- choice mit mehrfarbigen einträgen AWT, Swing, JavaFX & SWT 4
I Choice erkennen AWT, Swing, JavaFX & SWT 3
S Choice editierbar machen? AWT, Swing, JavaFX & SWT 6
A Checkbox-Choice Eventproblem (CMV) AWT, Swing, JavaFX & SWT 2
K Choice auswahl und String in Int AWT, Swing, JavaFX & SWT 8
S Dringend: Choice -> PrintLn? AWT, Swing, JavaFX & SWT 11
O Choice/Combobox wird nur 1x aktualisiert AWT, Swing, JavaFX & SWT 3
B Zwei Choice-Menüs verknüpfen AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen


Oben