JavaFX TableRow / RowFactory Zeile einfärben

missy72

Bekanntes Mitglied
Hallo,

ich habe absolute Verständnisprobleme mit der RowFactory und wahrscheinlich mit artverwandten Themen. Ich habe dazu einiges aus dem Netz versucht zu verstehen, oder zumindest in meinem Programm umzusetzen. Beides ohne Erfolg.

Ich habe zwei Tabellen (tableView) mit mehreren Spalten (table. Column). Jetzt klicke ich auf eine beliebige Zelle in einer Zeile der Ausgangstabelle und kopiere die Werte in meine Empfängertabelle. Über die CSS-Datei steuere ich noch über den Befehl .table-row-cell:hover ein, sodass die Zeile über der sich der Mauszeiger befindet einfärbt wird . So weit so gut.

Jetzt möchte ich die ausgewählte Zeile einfärben, damit der User die kopierten Zeilen überschauen kann. Den Index der Zeile habe ich auch noch ausgelesen.

Lambdas sind mir zwar bekannt, habe dafür aber auch noch kein Verständnis.

Als erstes würde mir der Programmcode für das Einfärben der Zeile aus der TableView (dbFahrerListeTV) ausreichen.
Wenn dann noch eine, hoffentlich auch mir, verständliche Erklärung niedergeschrieben wird, wäre ich sehr dankbar.

Schöne Grüße MB.

[CODE lang="java" title="TableRow / tableFactory"]// Auswahl Teilnehmer und Ansicht Liste Fahrerauswahl

dbFahrerListeTV.setOnMousePressed(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {

boolean doppelt = false;

if (event.isPrimaryButtonDown() && event.getClickCount() == 1) {

Fahrer choosedFahrer = dbFahrerListeTV.getSelectionModel().getSelectedItem();

int index = dbFahrerListeTV.getSelectionModel().getSelectedIndex();

// Tabellenzeile einfärben
dbFahrerListeTV.setRowFactory( row -> new TableRow<Fahrer>(){
@Override
public void updateItem(Fahrer item, boolean empty) {
super.updateItem(item, empty);

setStyle("-fx-background-color: yellow;");

}
});

for (Fahrer tempListeFahrer : listeStarterFahrer) {
if (tempListeFahrer == choosedFahrer) {
doppelt = true;
}
}

if (doppelt == false) {
listeStarterFahrer.add(choosedFahrer);
printListeFahrer = listeStarterFahrer;
Collections.reverse(printListeFahrer); // neue Auswahl an Pos1 anzeigen
starterListeTV.setItems(printListeFahrer);
counterMod(true);
}
}
}
});[/CODE]
 
Zuletzt bearbeitet:
Hi,

ich würde diese Methode nicht bei jedem Klick aufrufen, sondern nur einmal.

Java:
 dbFahrerListeTV.setRowFactory( row -> new TableRow<Fahrer>(){
                        @Override
                        public void updateItem(Fahrer item, boolean empty) {
                            super.updateItem(item, empty);
                                        
                                    setStyle("-fx-background-color: yellow;");
                          
                                                  }                   
                    });

Was ist die Bedingung für das einfärben? Außerdem muss du hier noch behandeln wenn Fahrer == null oder empty ist, ansonsten wird der Hintergrund immer gelb gesetzt.
 
Hallo,

ja der Code im Beispiel war jetzt auch nur ein schlechter Lückenfüller.

Ich hatte mir das halt so gedacht, dass in der Methode, in der ich den Fahrer von der eine Tabelle in die andere Übertrage, ein Befehl eingebe wie:
[CODE lang="java" title="row.setStyle"]row(index).setStyle("-fx-background-color: yellow;");[/CODE]
Den Index habe ich ja. Aber das scheint so nicht zu funktionieren, oder?

MfG MB
 
Hallo,

ja der Code im Beispiel war jetzt auch nur ein schlechter Lückenfüller.

Ich hatte mir das halt so gedacht, dass in der Methode, in der ich den Fahrer von der eine Tabelle in die andere Übertrage, ein Befehl eingebe wie:
[CODE lang="java" title="row.setStyle"]row(index).setStyle("-fx-background-color: yellow;");[/CODE]
Den Index habe ich ja. Aber das scheint so nicht zu funktionieren, oder?

MfG MB
Du brauchst an der Stelle immer noch eine Bedingung damit es nicht färbt. Sonst geht er Zeile für Zeile durch und setzt den Style.

Was willst du denn genau machen?
 
Ich habe mittlerweile auch in einem Video gesehen, dass ich die TableView auch auf Mehrfachauswahl umschalten kann. Dann kann man über die CSS-Datei und den Zusatz select, die Farbe anpassen. Das wäre meine Backup-Lösung, gefällt mir aber nicht so.
 
Ja / Nein.
Nur das Problem ist , wenn ich jetzt auf eine andere Zeile,oder in die andere Tabelle klicke.
Ist ja die kopierte Zeile nicht mehr selectiert und nimmt ihre Ursprungsfarbe wieder an.
Der User soll optisch dauerhaft sehen, welche Zeilen er schon kopiert hat.
 
Ich habe schon überlegt, ob ich in das Objekt eine zusätliche Fahne/Zeiger setzte. An/-Abgewält.
Dannach würde ich die Bedingung abfragen.
Halte ich bis jetzt, aber für eine schlechte Lösung.
 
Ja / Nein.
Nur das Problem ist , wenn ich jetzt auf eine andere Zeile,oder in die andere Tabelle klicke.
Ist ja die kopierte Zeile nicht mehr selectiert und nimmt ihre Ursprungsfarbe wieder an.
Der User soll optisch dauerhaft sehen, welche Zeilen er schon kopiert hat.
Dann kannst du am besten noch ein booelan in dein Datenmodell. Und überprüfst dann ob Daten schon rüberkopiert wurde wenn ja farbe es einfach gelb.
 

Zurück
Oben