JavaFX TableView mit CheckBox als Boolean

mathiasj

Bekanntes Mitglied
Hallo,
ich versuche jetzt schon seit einiger Zeit in meiner TableView die booleans aus meinem Model als CheckBoxen darzustellen. Das hier ist mein Model:

Java:
package net.softwarepage.voclearn.code;

import java.io.Serializable;

public class Card implements Serializable{
	
	private static final long serialVersionUID = 2526051651510336406L;
	private String question;
	private String anwser;
	private boolean doppelt;
	
	public Card(String question_, String anwser_, boolean doppelt_) {
		question = question_;
		anwser = anwser_;
		doppelt = doppelt_;
	}
	
	public void setQuestion(String question_) {
		question = question_;
	}
	
	public void setAnwser(String anwser_) {
		anwser = anwser_;
	}
	
	public void setDoppelt(boolean doppelt_) {
		doppelt = doppelt_;
	}
	
	public String getQuestion() {
		return question;
	}
	
	public String getAnwser() {
		return anwser;
	}
	
	public boolean isDoppelt() {
		return doppelt;
	}
	
	public Card invert() {
		return new Card(getAnwser(), getQuestion(), isDoppelt());
	}
}

Hier tritt auch schon das erste Problem auf: Beim googlen bin ich meistens nur auf Ansätze gestoßen, in denen BooleanProperties verwendet werden, das kann ich aber nicht machen, da diese nicht serialisierbar sind, ich diese Klasse aber abspeichern muss. Meine Tabelle erstelle ich so:

Java:
doppelt.setCellFactory(CheckBoxTableCell.<Card>forTableCell(doppelt));

Wenn ich jetzt aber eine Datei lade, ist die CheckBox immer nicht selected.
Ich habe auch so etwas probiert:

Java:
doppelt.setCellFactory(c -> new MyCheckBoxTableCell<>());

public static class MyCheckBoxTableCell<S, T> extends TableCell<S, T> {

        private final CheckBox checkBox;

        private ObservableValue<T> ov;

 

        public MyCheckBoxTableCell() {

            this.checkBox = new CheckBox();

            this.checkBox.setAlignment(Pos.CENTER);

 

            setAlignment(Pos.CENTER);

            setGraphic(checkBox);

        } 

         

        @Override 
        public void updateItem(T item, boolean empty) {

            super.updateItem(item, empty);

            if (empty) {

                setText(null);

                setGraphic(null);

            } else {

                setGraphic(checkBox);

                if (ov instanceof BooleanProperty) {

                    checkBox.selectedProperty().unbindBidirectional((BooleanProperty) ov);

                }

                ov = getTableColumn().getCellObservableValue(getIndex());

                if (ov instanceof BooleanProperty) {

                    checkBox.selectedProperty().bindBidirectional((BooleanProperty) ov);

                }

            }

        }

    }

Dieser Entwurf hat auch nicht funktioniert.

Außerdem weiß ich auch noch nicht, wie ich die CheckBox dann letztendlich mit dem Model verknüpfen kann, also das beides richtig synchronisiert ist. Füge ich dafür ein onEdit bei der Column ein, oder mache ich das anders? (Es gibt ja auch noch ein bindBidirectional() (wie ich es im letzten Code Beispiel verwendet habe), aber ich glaube das funktioniert nur mit BooleanProperties...).

Ich habe auch schon versucht so etwas zu machen:

Java:
package net.softwarepage.voclearn.code;

import java.io.Serializable;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;

public class Card implements Serializable{
	
	private static final long serialVersionUID = 2526051651510336406L;
	private String question;
	private String anwser;
	private transient BooleanProperty doppelt;
        private boolean doppeltBoolean;
	
	public Card(String question_, String anwser_, boolean doppelt_) {
		question = question_;
		anwser = anwser_;
		doppeltBoolean = doppelt_;
                doppelt = new SimpleBooleanProperty(doppelt_);
	}
	
	public void setQuestion(String question_) {
		question = question_;
	}
	
	public void setAnwser(String anwser_) {
		anwser = anwser_;
	}
	
	public void setDoppelt(boolean doppelt_) {
		doppeltBoolean = doppelt_;
                doppelt = new SimpleBooleanProperty(doppelt_);
	}
	
	public String getQuestion() {
		return question;
	}
	
	public String getAnwser() {
		return anwser;
	}
	
	public boolean isDoppelt() {
		return doppeltBoolean;
	}
        
        public BooleanProperty doppeltProperty() {return doppelt;}
	
	public Card invert() {
		return new Card(getAnwser(), getQuestion(), isDoppelt());
	}
}

Aber damit hab ich das ganze auch nicht zum Laufen gebracht.

Ich hoffe ihr könnt mir helfen, bin echt langsam am verzweifeln!
 

dzim

Top Contributor
Ich versuche gerade durch deine Gedankengänge durchzusteigen, aber ich hab wohl tatsächlich zu wenig Schlaf abbekommen heute Nacht: Ich schaffe es nicht!

Fangen wir von vorne an. Du *musst* dein Modell zwingend serialisierbar machen? Wieso? (Entschuldige die doofe Frage, aber in meinen ganzen Jahren als Java-Entwickler habe ich dieses Feature nie verwenden müssen und wenn, dann XML oder JSON verwendet.)
Das Observables wie BooleanProperties allerdings nicht serialialisierbar sind, wusste ich nicht. Sei's drum: Ich verstehe deine erweiterte Card-Klasse nicht. Warum verwendest du boolean und BooleanProperty nebeneinander? Warum überschreibst du bei jedem setDoppelt die BooleanProperty, statt sie nur neu zu setzen?

Warum dieses "ov" in der TableCell? Warum nicht ((Card)item)doppeltProperty() - du musst es nicht in der Cell noch einmal abspeichern. Auch die Cell würde ich einfach vor Ort machen ([c]CheckBox cb=new CheckBox(); cb.selectedProperty().bind...;setGraphic(cb);[/c] - aber das ist eher Geschmackssache).

BTW: Warum überhaupt Denglische Bezeichner für alles, da graust es mir ja! :p
 

Felli

Mitglied
Wenn keine FX-Propertys zur Verfügung stehen, muss man einiges manuell dazuprogrammieren. Ich würde es wie folgt probieren:

Java:
    public void start(Stage stage) 
    throws Exception
    {
        VBox pane = new VBox();
        TableView<Card> tv = new TableView<>();
        tv.setEditable(true);
        tv.getItems().add(new Card("?", "Fu", true));
        tv.getItems().add(new Card("?", "Bar", false));
        
        TableColumn<Card, Boolean> doppelt = new TableColumn<>("doppelt");
        doppelt.setEditable(true);
        doppelt.setCellValueFactory(new PropertyValueFactory<>("doppelt"));
        doppelt.setCellFactory( tc -> {
            return new TableCell<Card,Boolean>()
            {
                CheckBox checkBox = new CheckBox();  
                CardChangeListener changeListener = new CardChangeListener();
                
                {
                    setAlignment(Pos.CENTER);
                }
                
                protected void updateItem(Boolean item, boolean empty)
                {
                    super.updateItem(item, empty);
                    if (!empty)
                    {
                        setGraphic(checkBox);
                        checkBox.selectedProperty().removeListener(changeListener);
                        Card card = getTableView().getItems().get(getIndex());
                        checkBox.setSelected(card.isDoppelt());
                        changeListener.setCard(card);
                        checkBox.selectedProperty().addListener(changeListener);
                    }
                    else
                    {
                         setGraphic(null);
                    }
                }
            };
        } );
        tv.getColumns().add(doppelt);
        
        
        pane.getChildren().add(tv);
        stage.setScene(new Scene(pane));
        stage.show();
    }


    public static class CardChangeListener
    implements ChangeListener<Boolean>
    {
        private Card card;
        
        public void setCard(Card c)
        {
            this.card = c;
        }
        
        public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue)
        {
            if (card != null)
                card.setDoppelt(newValue);                             
        }
    }
 
Zuletzt bearbeitet:

mathiasj

Bekanntes Mitglied
@dzim
Ja, die Serialisierbarkeit würde ich gerne behalten, da ich es genauso in früheren Versionen vom Programm gehandhabt habe, und ich will, dass auch alte abgespeicherte Dateien noch geladen werden können. Ich habe dann versucht ein BooleanProperty zu machen, das ich aber nicht abspeichere, sondern einfach mit dem boolean in Synchronisierung halte; dass ich sie neu setze war natürlich ein Fehler. Und die bezeichner finde ich selbst schlimm :) Der Code ist schon älter (aus meinen Java Anfängen) und ist noch nicht in den Genuss eines ordentlichen Refactoring gekommen ^^

Die Lösung, die von @Felli vorgeschlagen wurde, funktioniert perfekt! Danke! Nur eine Stelle im Code verstehe ich nicht:

Java:
return new TableCell<Card,Boolean>()
            {
                CheckBox checkBox = new CheckBox();  
                CardChangeListener changeListener = new CardChangeListener();
                
                {
                    setAlignment(Pos.CENTER);  //Ist das hier der Konstruktor?  
                }
                ...

Nach den Instanzvariablen wird einfach eine spitze Klammer geöffnet, ohne dass eine Methode oder sonst was deklariert wird. Ist das dann der Konstrukor einer anonymen inneren Klasse?

Danke auf jeden Fall!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A checkbox in einer TableView abhängig von einem anderen Celleninhalt disablen AWT, Swing, JavaFX & SWT 1
J JavaFx TableView mit CheckBox AWT, Swing, JavaFX & SWT 4
J SceneBuilder TableView Checkbox AWT, Swing, JavaFX & SWT 1
Juelin setzen background color für selected Row im Tableview AWT, Swing, JavaFX & SWT 19
M JavaFX TableView nur erste Zeile editable machen und gelb markieren AWT, Swing, JavaFX & SWT 0
Encera TableView Zeilen als Spalten im SceneBuilder AWT, Swing, JavaFX & SWT 0
T TableView Button onAction AWT, Swing, JavaFX & SWT 3
mrbody234 ArrayList<Message> in eine TableView visualisieren AWT, Swing, JavaFX & SWT 2
izoards JavaFX TableView mit Array Inhalt füllen AWT, Swing, JavaFX & SWT 1
A Mit JavaFX einzelne Zeilen in TableView farbig markieren AWT, Swing, JavaFX & SWT 5
I JavaFX Zellen in Tableview editieren AWT, Swing, JavaFX & SWT 0
A TableView updatet sich nicht AWT, Swing, JavaFX & SWT 3
missy72 JavaFX TableView Spalte zwischen den Zeilen AWT, Swing, JavaFX & SWT 5
W TableView füllen AWT, Swing, JavaFX & SWT 18
missy72 JavaFX TableView / IconView mit MousEvent AWT, Swing, JavaFX & SWT 7
missy72 JavaFX Performance / ImageView in TableView über TimeLine AWT, Swing, JavaFX & SWT 1
T TableView aktualisieren AWT, Swing, JavaFX & SWT 1
N JavaFX Tableview nach Löschen von Element falscher Index AWT, Swing, JavaFX & SWT 4
T TableView Zeilen einfärben AWT, Swing, JavaFX & SWT 13
T TableView über Methode befüllen AWT, Swing, JavaFX & SWT 10
missy72 JavaFX TableView / TableColumn / ObservableList / zwei Werte in einer Zelle AWT, Swing, JavaFX & SWT 2
W JavaFX TableView aktualisieren AWT, Swing, JavaFX & SWT 1
S JavaFX - mit Listener Veränderungen in einer TableView abhören AWT, Swing, JavaFX & SWT 3
B JavaFX TableView-Zellen sollen automatisch so groß wie der größte Inhalt sein AWT, Swing, JavaFX & SWT 6
D JavaFX Nullpointerexception wegen TableView AWT, Swing, JavaFX & SWT 2
S Alternative JavaFX TableView AWT, Swing, JavaFX & SWT 1
L JavaFX Tableview row callback AWT, Swing, JavaFX & SWT 0
G Bekomme ResultSet mittels ObservableList nicht ins TableView AWT, Swing, JavaFX & SWT 25
S JavaFX JavaFX TableView scrollen färbt falsche Zeilen AWT, Swing, JavaFX & SWT 1
P JavaFX TableView Zelle markieren AWT, Swing, JavaFX & SWT 3
L JavaFX Tableview Datamodel AWT, Swing, JavaFX & SWT 2
M TableView Zeile hinzufügen AWT, Swing, JavaFX & SWT 5
Bluedaishi TableView mit Combox wert wird nicht in die TableView gesetzt AWT, Swing, JavaFX & SWT 38
J TableView Update/Refresh CPU AWT, Swing, JavaFX & SWT 2
B Text im Tetfeld in einer TableView darstellen AWT, Swing, JavaFX & SWT 20
J Tableview - kann man mit Enter die Zellen wechseln AWT, Swing, JavaFX & SWT 1
ralfb1105 JavaFX Dynamisch TableView Spalten erstellen AWT, Swing, JavaFX & SWT 4
M TableView + Datenbank Aktualisierung AWT, Swing, JavaFX & SWT 4
B TableView als PDF speichern AWT, Swing, JavaFX & SWT 8
B JavaFX TableView eine Zeile markieren AWT, Swing, JavaFX & SWT 5
B JavaFX JavaFX TableView PropertyValueFactory für Werte aus HashMap AWT, Swing, JavaFX & SWT 2
L JavaFX TableView Column Sortierung AWT, Swing, JavaFX & SWT 1
L Java FX Keine Anzeige Im Tableview AWT, Swing, JavaFX & SWT 4
L JavaFX TableView kein content text ändern AWT, Swing, JavaFX & SWT 2
L JavaFX TableView mit Aktionenbuttons AWT, Swing, JavaFX & SWT 1
C JavaFX Edit TableView in Verbindung mit SceneBuilder AWT, Swing, JavaFX & SWT 1
C JavaFX ProGuard -> TableView kein Inhalt AWT, Swing, JavaFX & SWT 7
J JavaFX Elemente werden nicht zu TableView hinzugefügt AWT, Swing, JavaFX & SWT 3
F JavaFX (Tree)TableView korrekt drucken AWT, Swing, JavaFX & SWT 1
robinab JavaFX TableView column resize nach setItems() AWT, Swing, JavaFX & SWT 0
G JavaFX TableView Wert in Spalte ändern AWT, Swing, JavaFX & SWT 0
S JavaFx - ausgewählte Rows in Arraylist (Tableview) AWT, Swing, JavaFX & SWT 4
S JavaFX - Populate TableView AWT, Swing, JavaFX & SWT 2
N JavaFX TableView aus Map AWT, Swing, JavaFX & SWT 2
J TableView Daten werden nicht ausgegeben AWT, Swing, JavaFX & SWT 9
B JavaFX TableView aus Collection befüllen AWT, Swing, JavaFX & SWT 1
S JavaFX TableView einzelne Zelle Layout zuweisen AWT, Swing, JavaFX & SWT 3
zhermann TableView die zweite AWT, Swing, JavaFX & SWT 7
H Java FX List<AlbumsBean> in FXML TableView AWT, Swing, JavaFX & SWT 37
E JavaFX TableView mit Zeilenumbruch in Zellen AWT, Swing, JavaFX & SWT 5
zhermann TableView wird nicht gefüllt AWT, Swing, JavaFX & SWT 14
M JavaFX JavaFX ResultSet in TableView ausgeben AWT, Swing, JavaFX & SWT 2
W JavaFX Mehrere Klassen in ein TableView AWT, Swing, JavaFX & SWT 6
MaxG. JavaFX Inhalt in Tableview wird nicht angezeigt AWT, Swing, JavaFX & SWT 11
M JavaFX berechneten Wert in TableView schreiben AWT, Swing, JavaFX & SWT 1
K JavaFX Message in TableView AWT, Swing, JavaFX & SWT 2
H TableView mit variabler Anzahl Spalten AWT, Swing, JavaFX & SWT 2
L JavaFX List oder TableView Größe dynamisch anpassen? AWT, Swing, JavaFX & SWT 4
L JavaFX TableView mit Excelfunktion AWT, Swing, JavaFX & SWT 1
D JavaFX TableView AWT, Swing, JavaFX & SWT 2
L JavaFX TableView mit XYChart verbinden AWT, Swing, JavaFX & SWT 3
blazingblade JavaFX Tableview Clock Column update AWT, Swing, JavaFX & SWT 5
P JavaFX, TableView und Datenbank AWT, Swing, JavaFX & SWT 4
K TableView: 'Komplexes' Object AWT, Swing, JavaFX & SWT 11
L JavaFX TableView background transparent machen AWT, Swing, JavaFX & SWT 7
F TableCell aus TableView holen AWT, Swing, JavaFX & SWT 8
K JavaFX TableView mit Rectangle AWT, Swing, JavaFX & SWT 3
M Befüllung der einzelnen Zeilen des TableView AWT, Swing, JavaFX & SWT 3
J JavaFX Tableview Daten hinzufügen aus anderer Klasse AWT, Swing, JavaFX & SWT 7
J Tableview Daten hinzufügen und aktualisieren AWT, Swing, JavaFX & SWT 5
N JavaFX TableView füllt nicht das gesamte ScrollPanle aus AWT, Swing, JavaFX & SWT 2
M JavaFX TableView & CSS, Rand um Tabellenkopf entfernen AWT, Swing, JavaFX & SWT 3
L JavaFX ListView oder TableView Style überschreiben? AWT, Swing, JavaFX & SWT 6
G Event Handling TableView daten in ein neues Fenster herauslesen? AWT, Swing, JavaFX & SWT 3
thet1983 JavaFX TableView Objekt Daten anzeige AWT, Swing, JavaFX & SWT 2
J JavaFX TableView - Höhe der Zeilen AWT, Swing, JavaFX & SWT 3
L JavaFX TableView mit Attributs der Modellreferenzerierung für die Spalte AWT, Swing, JavaFX & SWT 3
I JavaFX Buttons und TableView AWT, Swing, JavaFX & SWT 2
J JavaFX Bestimmte Zellen im TableView ändern (Farbe und Text) AWT, Swing, JavaFX & SWT 1
B Java FX TableView Zeilen mit verschiedenen Typen AWT, Swing, JavaFX & SWT 15
Z JavaFX TableView cellValueFactory für Arrays AWT, Swing, JavaFX & SWT 2
E JavaFX TableView mit Rechtsklick Zelle auswählen AWT, Swing, JavaFX & SWT 8
C (JavaFX 8) SQLite Datenbank in einem TableView darstellen AWT, Swing, JavaFX & SWT 2
D JavaFX TableView bleibt leer. AWT, Swing, JavaFX & SWT 8
M JavaFX TableView nach Spalte sortieren AWT, Swing, JavaFX & SWT 1
P JavaFX Dynamische TableView AWT, Swing, JavaFX & SWT 14
V Java FX POJO aus Datenbank in FX TableView / Best Practice AWT, Swing, JavaFX & SWT 0
P JavaFX TableView Item hinzufügen AWT, Swing, JavaFX & SWT 20
W JavaFX TableView frage AWT, Swing, JavaFX & SWT 5
M JavaFX Tutorial zu Tableview AWT, Swing, JavaFX & SWT 5

Ähnliche Java Themen

Neue Themen


Oben