Mit JavaFX einzelne Zeilen in TableView farbig markieren

AncoAux

Mitglied
Hallo,

ich habe folgendes vor: wenn in meiner TableView ein Wert in der zweiten Spalte unter 12 liegt, dann soll entsprechend die ganze Zeile farblich markiert werden, bspw. rot. Dieser Wert bzw. Inhalt der Spalte wird von einem TextField (fx:id „meinTextField“) per Knopfdruck in die Tabelle übertragen. Das Ganze funktioniert wie folgt:
Java:
person newPerson = new person(datepicker.getValue(), meinTextField.getText(),
                              meinTextField2.getText(), meinTextField3.getText());

meinTableView.getItems().add(newPerson);

Die Klasse person bzw. Der Konstruktor ist der folgende:
Java:
public person(LocalDate birthday, String a1, String a2, String p1) {
        this.birthday = birthday;
        this.a1 = new SimpleStringProperty(a1);
        this.a2 = new SimpleStringProperty(a2);
        this.p1 = new SimpleStringProperty(p1);
    }
Ich habe die ganze GUI mit dem Scenebuilder gebaut und habe es wie folgt strukturiert:

  • 1x TabPane (fx:id „meinTabPane“)
  • 4x Tabs (fx:id „meinTab1“ – „meinTab4“)
  • In jedem Tab ist ein AnchorPane (fx:id „meinAnchorPane1“ – „meinAnchorPane4“)
  • In meinTab2 befindet sich die TableView mit insgesamt 5 Spalten
Ich habe schon versucht, mein Problem per CSS zu lösen, allerdings weiß ich nicht, wie ich die TableView ansprechen kann und zusätzlich noch die Abhängigkeit von dem Wert 12 abbilden kann.

Ebenfalls habe ich es versucht, alles per Code zu lösen, allerdings habe ich bislang nur geschafft mit einem
Java:
meineTabelleSpalte2.setStyle("-fx-background-color: red")
die ganze Spalte, allerdings nicht die Reihe bzw. Zeile farbig zu markieren.

Kann mich hier jemand dabei unterstützen, inwiefern es möglich ist, mit JavaFX innerhalb einer Tabelle einzelne Zeilen farblich hervorzuheben?

Vorab vielen Dank!
 
[CODE lang="java" title="tableViewRowColor"]private void tableViewRowColor() {
tableView.setRowFactory(tv -> new TableRow<BesucheDO>() {
@Override
protected void updateItem(BesucheDO item, boolean empty) {
super.updateItem(item, empty);
setStyle("-fx-background-color:#ffffFF;");
if (item != null && item.getColor() == 1) {
setStyle("-fx-background-color:#86c6ae;");
}
}
});
}[/CODE]

Sobald du deine TableView gefüllt hast, kann du wie ich mit der obigen Methode Attribute abfragen und entsprechende Farben setzen.
 
Wenn du weiter runterscrollst, findest du eine Anleitung, wie genau das zu machen ist.
currentRow = getTableRow();
if (...) {
currentRow.setStyle( ... );
} else {
currentRow.setStyle( ... );
}
Danke für den Link, habe das ganze mal rein kopiert, allerdings wird das "calllogs" nicht erkannt, um was handelt es sich hier denn? Ist es der Name der Klasse die von der TableView aufgerufen wird?
 
[CODE lang="java" title="tableViewRowColor"]private void tableViewRowColor() {
tableView.setRowFactory(tv -> new TableRow<BesucheDO>() {
@Override
protected void updateItem(BesucheDO item, boolean empty) {
super.updateItem(item, empty);
setStyle("-fx-background-color:#ffffFF;");
if (item != null && item.getColor() == 1) {
setStyle("-fx-background-color:#86c6ae;");
}
}
});
}[/CODE]

Sobald du deine TableView gefüllt hast, kann du wie ich mit der obigen Methode Attribute abfragen und entsprechende Farben setzen.
Danke auch hierfür, allerdings läuft das auch nicht... habe das "<BesucheDO> mal auf meinen Namen der Tableview angepasst, das wirft mir zumindest keine Fehler mehr. Allerdings ist mir noch nicht ganz schlüssig, wo genau ich den Code denn einbauen bzw. wie er aufgerufen werden muss? Kommt das in die Methode "@FXML void initialize() { ... }" ?
 
[CODE lang="java" title="Aufruf der Methode tableViewRowColor" highlight="15"]private void tableViewFuellen() {
// ----------------------------------------------
//
aufbereitenTableView();

if (!obsList.isEmpty()) {
if (selectedBesucheDO == null) {
selectedBesucheDO = obsList.get(0);
}
}

tableView.setItems(obsList);
tableView.setVisible(true);

tableViewRowColor();

tableView.getSelectionModel().selectedItemProperty().addListener((obs, oldSelection, newSelection) -> {
if (obs != null) {
selectedBesucheDO = obs.getValue();
eingabeFuellen();
}
});
}
[/CODE]

private ObservableList<BesucheDO> obsList = FXCollections.observableArrayList();

Die obsList wird vorher mit den Klassen BesucheDO gefüllt. In meinem Fall speichere ich mir dort in einem Attribut Color die FarbeId. Ich wechsle die Farbe sobald eine andere Woche antritt. Mit der Anmerkung @JsonIgnore wird dieses temporäre Attribut beim RestFul ignoriert.
@JsonIgnore
int color = 0;
 

Anhänge

  • besuche.jpg
    besuche.jpg
    54,6 KB · Aufrufe: 0

Zurück
Oben