2016-04-27 8 views
0

Ich möchte Entity (Steuerelement oder Eigenschaft) haben, die verschiedene Zustände hat, die durch CSS eingefärbt werden können.Implementieren schreibgeschützten Stil in JavaFX?

Betrachten Sie zum Beispiel TextField, das zwei Arten von Werten enthalten kann, normal und fehlerhaft. Sobald es einen fehlerhaften Wert enthält, sollte es "rot" angezeigt werden. Aber die tatsächliche Farbe sollte von CSS definierbar sein.

Ist dies möglich?

Ich fand viele Styleable* Schnittstellen oder Klassen, aber sie sehen aus wie in der Lage, jeden Stil zu akzeptieren.

Kann ich schreiben und Entity, die ihren Stil aus dem Wert ableitet?

Antwort

3

können Sie Node.pseudoClassStateChanged verwenden:

TextField tf = new TextField(); 
final PseudoClass shortText = PseudoClass.getPseudoClass("short"); 
final PseudoClass longText = PseudoClass.getPseudoClass("long"); 
tf.textProperty().addListener((observable, oldValue, newValue) -> { 
    tf.pseudoClassStateChanged(shortText, false); 
    tf.pseudoClassStateChanged(longText, false); 
    if (newValue!=null && !newValue.isEmpty()) { 
     if (newValue.length() < 5) { 
      tf.pseudoClassStateChanged(shortText, true); 
     } else { 
      tf.pseudoClassStateChanged(longText, true); 
     } 
    } 
}); 

Mit einem CSS wie folgt aus:

.text-field:short { 
-fx-background-color: #ffaaaa; 
} 
.text-field:long { 
-fx-background-color: #aaffaa; 
} 

Obwohl ehrlich zu sein, ich bin nicht ganz sicher, was die Vor-und Nachteile der Style-Klasse vs. sind Pseudoklasse.

+1

'PseudoClass' ist viel einfacher für einen booleschen Zustand zu verwalten, da er entweder gesetzt oder nicht gesetzt ist. Reguläre CSS-Klassen werden als eine "Liste" von mit jedem Knoten verknüpften Zeichenfolgen gespeichert. Da es sich um eine 'List' handelt, kann sie Duplikate enthalten. Obwohl Sie Stilklassen aus dieser Liste hinzufügen und entfernen können, müssen Sie darauf achten, dass Sie nicht mehrere Kopien einer bestimmten Stilklasse hinzufügen (es sei denn, das ist aus irgendeinem Grund das, was Sie wirklich wollen). Für Anwendungsfälle wie diese führt die Verwendung von "PseudoClass" daher tendenziell zu einem saubereren Code. –

+0

Danke für die Erklärung! Gibt es ein spezifisches Verhalten, wenn eine Stilklasse mehr als einmal für einen Knoten vorhanden ist (entweder für JavaFX oder einfaches CSS)? Ich bin mir nicht sicher, ob ich mir ein vernünftiges Verhalten vorstellen kann, außer es nur einmal zu sehen. – Itai

+0

Die CSS-Übereinstimmungsregeln sehen nur aus, ob die Stilklasse auf einem Knoten vorhanden ist oder nicht. Wenn es also mehrfach in der Liste hinzugefügt wird, stimmt es mit der Klasse überein. Probleme können jedoch auftreten, wenn Sie versuchen, es zu entfernen: 'myNode.getStyleClass(). Remove (" some-style ");' entfernt das erste Vorkommen. Wenn Sie es also versehentlich mehrmals hinzugefügt haben, hat dies (wahrscheinlich) gewonnen Habe nicht den Effekt, den du suchst ... Es kann wirklich knifflig sein, z in benutzerdefinierten Zellenimplementierungen, in denen Sie nicht viel Kontrolle darüber haben, wann 'updateItem()' aufgerufen wird. –

0

Beim Änderungsereignis einer bestimmten Eigenschaft können Sie die Stilklasse dieser Entität (Steuerelement oder Eigenschaft) ändern, um mehrere Farben anzuwenden.
Dazu müssen Sie mehrere Farbstile in CSS hinzufügen und dann können Sie die Style-Klasse ändern, indem Sie den folgenden Code verwenden.

textfield.getStyleClass().add("red"); 

Zum Beispiel auf Aktion Fall TextField-, können Sie überprüfen, welcher Wert Benutzer in TextField- eingegeben hat und wenn eingegebene Wert „fehlerhaft“ ist dann das Objekt von Textfeld erhalten und die Stil Klassennamen, um es festgelegt mit über dem Code.

Verwandte Themen