JavaFX: Wenden Sie text-Farbe zu TableCell mit benutzerdefinierten Stylesheet?

JavaFX: Wie kann ich die text Farbe zu einer TableCell ein benutzerdefiniertes Stylesheet verwenden?

Funktioniert es einwandfrei, wenn ich setTextFill() in meinem CellFactory direkt, aber ich möchte benutzerdefinierte Formatvorlage mit einer externen CSS-Datei. Ich konnte beweisen, dass meine CSS-Klasse wird angewandt, da die Schrift wird Fett. Die CSS Datei die Schriftfarbe, jedoch nicht angewendet wird.

@Override
protected void updateItem(MyObject item, boolean empty) {
    super.updateItem(item, empty);

    if (null != item) {        
        //EITHER:
        this.getStyleClass().add("styleImportant"); //Does NOT set color.

        //OR:
        this.setTextFill(Color.RED); //Does set color.
    }
    else {
        this.getStyleClass().remove("styleImportant");
    }

}

Stylesheet:

.styleImportant {
    -fx-font-weight: bold; /** Does work. */
    -fx-text-fill: red; /** Does NOT work. */
}

Es irgendwie mit der Spezifität von CSS-Selektoren, aber ich habe es nicht geschafft, diese zu finden gültiges setup.


Edit: ich schaffte es gilt, eine benutzerdefinierte text-und Hintergrundfarbe, CSS zu verwenden. Meine Implementierung verwendet nun ein Label ist verpackt in einem VBox um die Hintergrundfarbe füllen die ganze Zelle der Tabelle. Allerdings hatte ich noch einige Probleme mit der Hintergrundfarbe nicht gelöscht, wenn das entfernen der benutzerdefinierten Stil.

Gibt es eine bessere Lösung als die Anwendung einer klaren Stil?

colExample.setCellFactory(new Callback<TableColumn<Example, Example>, TableCell<Example, Example>>() {
  @Override
  public TableCell<Example, Example> call(TableColumn<Example, Example> tableColumn) {
     return new TableCell<Example, Example>() {
        private VBox container;
        private Label text;

        //Anonymous constructor
        {
           this.container = new VBox();
           this.text = this.createLabel();

           this.container.getChildren().add(this.text);
           this.setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
           this.setStyle("-fx-padding: -1 -1 -1 -1;"); //Remove padding from cell

           this.setGraphic(this.container);
        }

        private final Label createLabel() {
           Label label = new Label();

           VBox.setVgrow(label, Priority.ALWAYS);
           label.setMaxWidth(Double.MAX_VALUE);
           label.setMaxHeight(Double.MAX_VALUE);
           label.setAlignment(Pos.CENTER);

           return label;
        }

        @Override
        protected void updateItem(Example example, boolean empty) {
           super.updateItem(example, empty);

           //Reset column styles
           if (null != this.text && null != this.text.getStyleClass()) {
              String[] possibleStyles = new String[] { "styleImportant", "clearStyle" };

              for (String style: possibleStyles) {
                 if (this.text.getStyleClass().contains(style)) {
                    //Will not reset background, even though style is removed?
                    this.text.getStyleClass().remove(style);
                 }
              }

              //Apply reset style to clear background color
              this.text.getStyleClass().add("clearStyle");
           }

           if (null != example) {
              this.text.setText(example.getContent());

              if (example.isImportant()) {
                 this.text.getStyleClass().add("styleImportant");
              }
           }
        }
     };
  }
});

Mein Stylesheet:

/** Keep black text color, when user selects row */
.table-row-cell:focused {
   -fx-dark-text-color: #000000;
   -fx-mid-text-color: #000000;
   -fx-light-text-color: #000000;
}

/** Style to reset background color */
.clearStyle {
   -fx-background-color: transparent;
}

/** Style for important cells */
.styleImportant {
   /** Red text color on any background */
   -fx-dark-text-color: #FF0000;
   -fx-mid-text-color: #FF0000;
   -fx-light-text-color: #FF0000;

   -fx-background-color: #FF9999;
}
  • Du bist wahrscheinlich hinzufügen, die den gleichen Stil Klasse mehrfach. Dann, wenn Sie anrufen remove es entfernt nur das erste vorkommen. Verwenden Sie die Redewendungen if (! text.getStyleClass().contains("...")) text.getStyleClass().add("..."); um sicherzustellen, dass Sie nur einmal hinzufügen, und/oder text.getStyleClass().removeAll(Collections.singleton("...")); entfernen Sie alle vorkommen von etwas.
  • Ich überprüfte die aktuellen Klassen vor, diese zu entfernen, gab es keine Duplikate. Die einzige Art, die Klasse, die übrig blieb, war label, die ich nicht zuordnen (wahrscheinlich Standard-Stil von JavaFX). Aber ich werde überprüfen Sie Ihre idiom morgen.
  • Gerade überprüft-style-Klassen und zusätzlichen Prüfungen, wie Sie vorgeschlagen, aber hat nicht geholfen. Sie sind nur einmal vergeben, aber ich brauche immer noch meine clearStyle Klasse zu entfernen die Hintergrundfarbe.
  • Wie hast du die Probleme mit der Hintergrundfarbe nicht gelöscht, wenn das entfernen der benutzerdefinierten Stil? Ich habe ein sehr ähnliches problem und auch die Einstellung setStyle("") funktioniert nicht... einige scheinbar zufällige Zellen behalten noch die Hintergrundfarbe.
  • Ich habe einen "klaren Stil", wie beschrieben, ganz am Ende von meinem post.
InformationsquelleAutor user1438038 | 2014-11-18
Schreibe einen Kommentar