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 Redewendungenif (! text.getStyleClass().contains("...")) text.getStyleClass().add("...");
um sicherzustellen, dass Sie nur einmal hinzufügen, und/odertext.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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als José betont in seiner Antwort, wenn Sie eine Grafik in Ihre Zelle, Sie (vermutlich) brauchen, um zu übernehmen die css-style-Klasse für die Grafik (je nachdem, was, die Grafik ist). Wenn Sie den Aufruf einfach
setText(...)
dein code sollte funktionieren.Dem Grund, dass eine
Label
als Grafik Erben nicht-fx-text-fill
aus der Tabelle Zelle ist, dass dieLabel
hat auch eine Einstellung für-fx-text-fill
. In der default-stylesheet, beideTableCell
undLabel
haben diese wie folgt festgelegt:fx-text-background-color
ist ein sah-Farbe, die definiert ist als eine Leiter, wie folgt:Diese (ziemlich Komplex) - Einstellung bedeutet, dass der Wert von
-fx-text-background-color
hängt der Wert des-fx-background
. Wenn-fx-background
weniger als 45% der maximalen Intensität (also dunkel), wird der Wert von-fx-text-background-color
eingestellt ist-fx-light-text-color
. Wenn-fx-background
ist zwischen 46% und 59% Intensität, der Wert ist gleich-fx-drak-text-color
. Wenn es 60% oder mehr ist für die-fx-mid-text-color
. Die Idee hier ist, dass die Farbe des Textes automatisch anpassen, um den hintergrund sichtbar bleiben. Die Werte der-fx-dark-text-color
,-fx-mid-text-color
, und-fx-light-text-color
sind festgelegt auf schwarz, einem dunklen Grau (#333), und weiß, beziehungsweise.Seit
Label
überschreibt nicht den Wert von-fx-text-background-color
können Sie erreichen, was Sie brauchen, einfach indem der Wert, der für Ihre Zelle in der Tabelle:Nun überschreibt dieses die gesuchte Farbe, Wert für die Zelle in der Tabelle, und da die Grafik in der Zelle nicht überschreiben, dass ein Wert an sich, übernimmt es ihn aus der Zelle.
Eine elegantere Art dies zu tun ist, neu zu definieren
-fx-[light|mid|dark]-text-color
s. Dies hat den Vorteil, dass die Farben entsprechend anpassen, wenn Sie den hintergrund ändern: insbesondere dann, wenn die Zelle ausgewählt ist, können Sie sicherstellen, dass der text bleibt sichtbar:.table-row-cell:focused .text
war sich mit den benutzerdefinierten Stil ein. Nun, ich-fx-[light|mid|dark]-text-color
es funktioniert. Ich hatte einige Probleme mit dem zurücksetzen der Hintergrundfarbe, obwohl.Da ich nicht weiß, welche Art von Objekt ist in der Zelle, verwende ich einen
Label
.Dies ist, was Sie tun:
Diese geben Sie text Fett, sondern schwarz.
Wenn Sie möchten, dass ein Objekt (in meinem Fall ein
Label
) mit rotem text, das Stylesheet anzuwenden, um das Objekt:BEARBEITEN
Dies ist der vollständige code des Beispiels:
denen in der Tabelle.css:
Läuft dieses kurze Beispiel sollte wie folgt Aussehen:
setText()
noch, wenn ich einenLabel
und meine style-Klasse zu. Alles, was ich bekommen ist frech, aber nie farbigem text. Außerdem, ich lief in Probleme mit der Hintergrundfarbe noch die ganze Zelle ausfüllen, wenn mit einem label..table-row-cell:focused .text { -fx-fill: #000000; }
eingestellt zu haben schwarze Schrift, wenn der Benutzer wählt eine Zeile in der Tabelle. Das scheint interfer mit meinem eigenen Stil. Die Informationen @James_D gab, ist sehr hilfreich in dieser Hinsicht, aber ich bin immer noch herauszufinden... ich werde auf dich zurückkommen, sobald ich Feste meine Probleme.Label
undVBox
jetzt. Funktioniert bei mir nun, außer für einige Probleme hatte ich mit dem zurücksetzen der Hintergrundfarbe der Zelle.