JavaFX JavaFX und CSS

MichaProgs

Aktives Mitglied
Guten Abend zusammen,

wie man vielleicht schon öfter in diesem Forum mitbekommen hat, bin ich dabei von Swing auf FX umzusteigen. Mit der größte Grund dafür waren die Designmöglichkeiten in FX und genau darum geht es in diesem Thread.

Ich habe schon öfter mit CSS gearbeitet - hauptsächlich natürlich in Verbindung mit HTML. In FX sind die Befehle allerdings anders aufgebaut. Die Dokumentation hilft da zwar schon um einiges weiter, aber ganz logisch erscheint mir das dennoch nicht. Das nötigste konnte ich gestalten, bei den Tabellen wird es dann aber zu viel.

Ich möchte diesen Thread nutzen, um allgemein das Thema CSS in Verbindung mit FX zu behandeln. Gibt es ein "Grundtutorial" über die Funktionsweise, ausgenommen der von Oracle bereitgestellten? Oder kann jemand mit seinen eigenen Worten die Grundkenntnisse erläutern?

Ich hoffe ich habe den Thread mit der Fragestellung nicht zu offen gehalten und freue mich über konstruktive Antworten.

Gruß
TB94
 

dzim

Top Contributor
Ist zwar schon ein paar Tage her, aber ich möchte noch mal kurz dazu was sagen:
Was mit zu JavaFX 2-Zeiten geholfen hat, war das caspian.css aus der jfxrt.jar (mal im jdk-Verzeichnis suchen, entpacken und dann diese Datei suchen), sowie diese CSS Referenz.
Leider wurde letztere nie auf JavaFX8 geupdated, so dass ich sie nur noch sporadisch verwende, dafür aber immer ein Auge auf die modena.css werfe. Die findet man auch im o.g. jfxrt.jar.

Dies ist eigentlich die Quelle aller meiner Erfahrung und hat IMHO voll und ganz genügt.

Was es aber an Besonderheiten gibt (und was sich zum Teil von JavaFX 2 zu JavaFX 8 geändert hat), ist:
die CSS-Klasse .root. In ihr kannst du eigene "Variablen" definieren. Ich hab dann z.B. so etwas wie background-colo: <my-color-or-gradient>; definiert und verwende es dann in den anderen Klassen, etc.
Dort setze ich auch die Basisfarbe der Anwendung. Allerdings bin ich mir nicht so sicher, ob das so klug ist, daher habe ich in einer neueren Anwendung auf dem Root der Scene meiner Anwendung eine spezielle CSS-Klasse definiert, die den Hintergrund und den Base auch dort noch einmal setzt. Ich glaube, hier habe es mal ansonsten Probleme mit neueren Java8-Versionen...
 

Tom299

Bekanntes Mitglied
Ich bin auch erst seit ein paar Wochen mit JavaFX beschäftigt und hab vorher aber noch nie richtige Web-Projekte entwickelt, d.h. CSS ist für mich selbst noch in vielen Dingen Neuland.
Aber nach etwas Einarbeitung und Eingewöhnung geht es schon ganz gut von der Hand, auch wenn Eclipse nicht immer alle CSS-JavaFX-Eigenschaften kennt. Mit Google bzw. Stackoverflow findet man oft Antworten oder Hinweise, um weiterzukommen und Modena.css hab ich mir auch extrahiert und im Notepad++ immer offen :)

Mit den Gradients usw. tu ich mir oft schwer und es hat ne Weile gedauert, bis ich das mal kapiert habe, weil manchmal findet man ja anstatt z.B.
Code:
-fx-background-color: linear-gradient(steelblue, skyblue)
sowas wie
Code:
-fx-background-color: red, green, lightblue, darkblue, blue;
-fx-background-insets: 25 0 0 0, 35 10 10 10, 44 20 19 19, 45 18 18 20, 45 20 20 20;
also daß mehrere Farben angegeben werden und mehrere Insets. Hab dann irgendwann eine Seite gefunden, wo das schön erklärt wird, daß die Paints quasi aufeinander gelegt werden und man von außen nach innen dann zeichnet. Ok, für CSS-Erfahrene war das vielleicht kein Neuland, für mich schon. Und daß die Insets nicht relativ zum vorherigen stehen sondern absolut sind, war der nächste AHA-Effekt.

Was mir aber auch aufgefallen ist: es gibt Eigenschaften, wenn ich die in der FXML setze, dann werden sie vom CSS nicht überschrieben. Hab jetzt grad kein Beispiel mehr zur Hand, aber das ist mir schon öfters begegnet.

Ein weiterer Punkt sind Grafiken auf Buttons. Man kann im SceneBuilder eine ImageView in einen Button legen, was ich schon gemacht habe. Man kann auch über CSS die Grafik auf den Button legen. Das klappt aber auch nur gut, wenn man z.B. keinen Text und nur die Grafik auf dem Button hat. Ansonsten hab ich z.B. keine Möglichkeit gefunden, den Abstand zwischen Grafik und Text im CSS einzustellen. Als "Workaround" hab ich dann dem Button im FXML/SceneBuilder ein Padding gegeben, damit der Text einen Abstand zur der CSS-Grafik beommt, aber dann kann man auch gleich wieder eine ImageView auf den Button ziehen.

Ich bin mir auch noch nicht schlüssig, ob ich für jede View eine CSS-Datei erstellen sollte (was ich bis jetzt so gemacht habe als Anfänger) oder ob man nur eine CSS-Datei haben sollte. Ein Bekannter hat mir zu letzterem geraten, da ja öfter Komponenten in mehreren Views gleich aussehen sollen und ich muß das halt dann mehrfach im CSS pflegen.

Das mit dem selbst Farben definieren muß ich mir mal noch anschauen (was dzim geschrieben hat), das kann ich nämlich auch gebrauchen ;-)
 

MichaProgs

Aktives Mitglied
Die modena.css habe ich mir bereits angesehen. Vieles kann man auch durch die Documentation von Oracle herausfinden, aber speziell Tabellen zu gestalten ist eine reine Katastrophe - da hilft auch die modena nicht weiter.

Diese vorgegeben Farben würden mich ebenfalls noch interessieren. Oft sieht man sowas wie "-fx-color: -fx-focused-base;". Wie kann man denn so etwas umsetzen? Irgendwo müsste man ja diese "-fx-focused-base;" als Farbe definieren.

Gruß
TB94
 

Tom299

Bekanntes Mitglied
Na ich denke das geht genauso wie es in der modena.css auch gemacht ist, mit dem .root kannst du (vermutlich) für das ganze dokument die standards definieren:

Auszug aus der modena.css:
Code:
/*******************************************************************************
 *                                                                             *
 * CSS Styles for core infrastructure bits.  The .root section provides the    *
 * overall default colors used by the rest of the sections.                    *
 *                                                                             *
 ******************************************************************************/

.root {
    /***************************************************************************
     *                                                                         *
     * The main color palette from which the rest of the colors are derived.   *
     *                                                                         *
     **************************************************************************/

    /* A light grey that is the base color for objects.  Instead of using
     * -fx-base directly, the sections in this file will typically use -fx-color.
     */
    -fx-base: #ececec;

    /* A very light grey used for the background of windows.  See also
     * -fx-text-background-color, which should be used as the -fx-text-fill
     * value for text painted on top of backgrounds colored with -fx-background.
     */
    -fx-background: derive(-fx-base,26.4%);

    /* Used for the inside of text boxes, password boxes, lists, trees, and
     * tables.  See also -fx-text-inner-color, which should be used as the
     * -fx-text-fill value for text painted on top of backgrounds colored
     * with -fx-control-inner-background.
     */
    -fx-control-inner-background: derive(-fx-base,80%);
    /* Version of -fx-control-inner-background for alternative rows */
    -fx-control-inner-background-alt: derive(-fx-control-inner-background,-2%);

    /* One of these colors will be chosen based upon a ladder calculation
     * that uses the brightness of a background color.  Instead of using these
     * colors directly as -fx-text-fill values, the sections in this file should
     * use a derived color to match the background in use.  See also:
     *
     * -fx-text-base-color for text on top of -fx-base, -fx-color, and -fx-body-color
     * -fx-text-background-color for text on top of -fx-background
     * -fx-text-inner-color for text on top of -fx-control-inner-color
     * -fx-selection-bar-text for text on top of -fx-selection-bar
     */
    -fx-dark-text-color: black;
    -fx-mid-text-color: #333;
    -fx-light-text-color: white;

    /* A bright blue for highlighting/accenting objects.  For example: selected
     * text; selected items in menus, lists, trees, and tables; progress bars */
    -fx-accent: #0096C9;

    /* Default buttons color, this is similar to accent but more subtle */
    -fx-default-button: #ABD8ED;

    /* A bright blue for the focus indicator of objects. Typically used as the
     * first color in -fx-background-color for the "focused" pseudo-class. Also
     * typically used with insets of -1.4 to provide a glowing effect.
     */
    -fx-focus-color: #039ED3;
    -fx-faint-focus-color: #039ED322;

    /* The color that is used in styling controls. The default value is based
     * on -fx-base, but is changed by pseudoclasses to change the base color.
     * For example, the "hover" pseudoclass will typically set -fx-color to
     * -fx-hover-base (see below) and the "armed" pseudoclass will typically
     * set -fx-color to -fx-pressed-base.
     */
    -fx-color: -fx-base;

Code:
.root {   
    -fx-base: #ececec;
    -fx-background: derive(-fx-base,26.4%);
}
 

dzim

Top Contributor
Wie ich schon sagte, wäre ich vorsichtig, den BG im .root zu setzen. Bei mir hat das u.U. zu Problemen geführt, bzw. er wurde nicht in allen Fällen (Java7-Java8) gleich - oder überhaupt nicht - dargestellt.
Ich habe mir dazu eine separate CSS-Klasse .main-root erstellt und sie wie oben beschrieben via scene.getRoot().getStyleClass().add("main-root"); (scene ist die Scene, die ich in der Main-Klasse auf die primary Stage gelegt habe).
Und wie schon erwähnt: Im .root kann man quasi "beliebige" Variablen anlegen und dann im weiteren Verlauf der CSS nutzen. Ich habe das für eine ganze Palette an eigenen Farben oder Verläufen gemacht.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
mihe7 JavaFX - Verhalten ComboBox AWT, Swing, JavaFX & SWT 8
A JavaFX-Applikation als Maven-Projekt : JavaFX-Archetypen AWT, Swing, JavaFX & SWT 9
T JavaFX JavaFX, Dialoggröße in Gnome AWT, Swing, JavaFX & SWT 3
B Eclipse RCP (e4) Anwendung mit JavaFX / e(fx)clipse - Upgrade Probleme AWT, Swing, JavaFX & SWT 2
H JavaFX JAVA_HOME bei javaFX AWT, Swing, JavaFX & SWT 3
H JavaFX javafx-jdk einbinden AWT, Swing, JavaFX & SWT 5
C JavaFX In Eclipse ein JavaFX-Projekt mit Maven aufsetzen AWT, Swing, JavaFX & SWT 4
A JavaFX JavaFX images per Drag&Drop verschieben AWT, Swing, JavaFX & SWT 1
Juelin Javafx hängt sich auf AWT, Swing, JavaFX & SWT 31
Juelin StringGrid in SceneBuilder und javaFX AWT, Swing, JavaFX & SWT 3
Juelin starten maven javafx programm ohne netbeans AWT, Swing, JavaFX & SWT 38
Juelin javax.swing in javafx AWT, Swing, JavaFX & SWT 1
MiMa JUnit5 im JavaFX Projekt AWT, Swing, JavaFX & SWT 2
Juelin in javafx Event auslösen AWT, Swing, JavaFX & SWT 4
MiMa Fonts, Icons, Bilder in JavaFX Anwendung AWT, Swing, JavaFX & SWT 5
MiMa SwingFXUtils in JavaFX 20 AWT, Swing, JavaFX & SWT 6
MiMa JavaFX Fenstertitel zu klein. AWT, Swing, JavaFX & SWT 1
MiMa JavaFX JAR unter Windows ausführen schlägt fehl? AWT, Swing, JavaFX & SWT 5
I JavaFX JavaFx-Anwendung für die Erstellung einer Windows-Anwendung? AWT, Swing, JavaFX & SWT 6
Hatsi09 Javafx MediaPlayer spielt nicht immer AWT, Swing, JavaFX & SWT 3
Hatsi09 Javafx Neuladen von ImageView und MediaView AWT, Swing, JavaFX & SWT 3
Maxim6394 JavaFX Umlaute in JavaFX GUI AWT, Swing, JavaFX & SWT 12
Maxim6394 JavaFX Scene Builder - Crash bei eigener Komponente AWT, Swing, JavaFX & SWT 2
Ernesto95 JavaFX JavaFX GUI mit sehr vielen Update requests AWT, Swing, JavaFX & SWT 4
Telisti Javafx Image wird nicht richtig integiert AWT, Swing, JavaFX & SWT 8
J Netbeans die JavaFX-Anwendung wird nicht ausgeführt AWT, Swing, JavaFX & SWT 16
MartinNeuerlich Kann mir jemand, der einen Mac mit einem m1 oder m2-Chip hat, eine POM geben mit der Javafx-Fullscreen beim Mac mit m-Chip funktioniert? AWT, Swing, JavaFX & SWT 1
tommybalbor JavaFx Anwendung klappt nicht für macOs Nutzern, wenn ich zwei dependecies bei maven hinzufüge AWT, Swing, JavaFX & SWT 6
JavaSchmecktLecker JavaFX JavaFX Ordner automatisch verlinken AWT, Swing, JavaFX & SWT 2
melaniemueller Taschenrechner JavaFX AWT, Swing, JavaFX & SWT 4
R auto. Importanweisungen für javafx funktioniert in Eclipse nicht mehr AWT, Swing, JavaFX & SWT 4
thor_norsk JavaFX Anwendung stürzt ab AWT, Swing, JavaFX & SWT 4
berserkerdq2 Skalieren sich javafx objekte automatisch auf die Bildschirmgröße AWT, Swing, JavaFX & SWT 6
berserkerdq2 Wie füge ich ein Bild in javafx mit dem Scenebuilder ein, das automatisch mitgezogen wird, wenn das Fenster vergrößert wird oder Vollbildmodus AWT, Swing, JavaFX & SWT 6
B Java Projekt mit JavaFX und jfoenix ausführbar machen AWT, Swing, JavaFX & SWT 46
H JavaFX wie JavaFX Projekt aufsetzen? AWT, Swing, JavaFX & SWT 10
thor_norsk JavaFX - Grafikkarte AWT, Swing, JavaFX & SWT 7
MiHimbert Rückmeldung an den aufrufenden JAVAFX-Dialog AWT, Swing, JavaFX & SWT 1
MiMa JavaFX Runtime components are Missing??? AWT, Swing, JavaFX & SWT 3
J JavaFx PDF in einem Element in einem Fenster anzeigen. AWT, Swing, JavaFX & SWT 11
B JavaFX Sprachumschaltung mit Button auf der HMI AWT, Swing, JavaFX & SWT 6
H JavaFX Fehlende JavaFX Package AWT, Swing, JavaFX & SWT 10
K JavaFX unterschiedliche (mehrere Fenster) in seperater Main Methode AWT, Swing, JavaFX & SWT 26
G Kann man ein 2. JavaFX-Fenster auch beenden (exit) statt schließen (close) lassen? AWT, Swing, JavaFX & SWT 8
G JavaFX Line Chart mit Farbverlauf/Gradient in Linie AWT, Swing, JavaFX & SWT 1
thor_norsk JavaFX, FXML und SceneBuilder AWT, Swing, JavaFX & SWT 6
G Über installDist exportiertes Programm wirft "Unsupported JavaFX configuration" AWT, Swing, JavaFX & SWT 0
CodingBerlin JavaFX Programm läuft nur unter Eclipse AWT, Swing, JavaFX & SWT 1
H Fehler: Zum Ausführen dieser Anwendung benötigte JavaFX-Runtime-Komponenten fehlen AWT, Swing, JavaFX & SWT 44
temi JavaFX "Frames" in JavaFx - passende Komponente? AWT, Swing, JavaFX & SWT 13
G JavaFX Steuerung bzw. Test von externer JavaFX Anwendung (liegt nur als jar vor) AWT, Swing, JavaFX & SWT 9
G [JavaFX] Spinner so einstellen, dass er nicht leer bleiben darf? AWT, Swing, JavaFX & SWT 6
S Javafx getResource-Pfad wird nicht erkannt AWT, Swing, JavaFX & SWT 7
A JavaFX exportierte Jar ohne beim starten die Libs hinzufügen? AWT, Swing, JavaFX & SWT 2
J JavaFX Schiffe versenken mit JavaFX und Scene builder AWT, Swing, JavaFX & SWT 3
Encera ArrayList mit eigenen Objekten in JavaFX sortieren und ausgeben AWT, Swing, JavaFX & SWT 50
L JavaFx Textformatierung mittels Datenbank und Funktion anpassen AWT, Swing, JavaFX & SWT 5
sserio Wie funktioniert ein Controller bei JavaFx? AWT, Swing, JavaFX & SWT 1
sserio Kann man bei JavaFx ein Fenster aufkommen lassen? AWT, Swing, JavaFX & SWT 1
Jose05 JavaFx Fxml: GUI aus einer anderen Klasse starten AWT, Swing, JavaFX & SWT 1
Tassos JavaFX/Problem mit der Maussteuerung in Stackpane AWT, Swing, JavaFX & SWT 7
S Ich bringe Code mit JavaFX unter Apache NetBeans IDE 12.6 nicht zum laufen. AWT, Swing, JavaFX & SWT 14
K Bekomme (u.a) javafx.fxml.LoadException trotz "korrektem" Code AWT, Swing, JavaFX & SWT 8
S JavaFX: voneinander abhängige TextFields AWT, Swing, JavaFX & SWT 33
M Gluon will JavaFX in den Browser stecken AWT, Swing, JavaFX & SWT 0
H javafx application does not exist AWT, Swing, JavaFX & SWT 16
A JavaFX Controller Problem AWT, Swing, JavaFX & SWT 1
izoards JavaFX TableView mit Array Inhalt füllen AWT, Swing, JavaFX & SWT 1
M Javafx versuch Bibliothek zu erstellen AWT, Swing, JavaFX & SWT 0
N JavaFX Javafx intelij Projekt zu ausführbaren jar Datei Machen AWT, Swing, JavaFX & SWT 1
K JavaFx, Sound Aufnahme und Thread AWT, Swing, JavaFX & SWT 0
izoards JavaFX TextFlow - Sonderzeichen AWT, Swing, JavaFX & SWT 1
maximstein JavaFX WebView - java.lang.NoSuchMethodError: 'boolean com.sun.prism.ResourceFactory.isDisposed()' AWT, Swing, JavaFX & SWT 4
N JavaFX Unicode zeichnen in javafx Label verwenden AWT, Swing, JavaFX & SWT 2
MiHimbert javaFX openfx (17) datepicker AWT, Swing, JavaFX & SWT 3
A Mit JavaFX einzelne Zeilen in TableView farbig markieren AWT, Swing, JavaFX & SWT 5
melaniemueller JavaFX Taschenrechner mit SceneBuilder AWT, Swing, JavaFX & SWT 12
Jose05 Javafx Label Höhe=Breite AWT, Swing, JavaFX & SWT 1
Jose05 JavaFX: eigene FXML-Datei für einen Button AWT, Swing, JavaFX & SWT 3
izoards JavaFX editierbare Tabelle AWT, Swing, JavaFX & SWT 4
N javafx Position der Bustaben finden label AWT, Swing, JavaFX & SWT 1
D Verschieden Scenen ansprechen mit dem Scene Builder und JavaFX (Eclipse) AWT, Swing, JavaFX & SWT 16
izoards JavaFX Background Task warten auf Knopfdruck AWT, Swing, JavaFX & SWT 4
M Zufallsgenerator bei JavaFx AWT, Swing, JavaFX & SWT 1
N Label Schriftart Ändern javafx AWT, Swing, JavaFX & SWT 2
L JavaFX JavaFX, MVVM und SceneBuilder AWT, Swing, JavaFX & SWT 4
S JavaFx Album AWT, Swing, JavaFX & SWT 137
I JavaFX - Pane wechseln über 2. Controller AWT, Swing, JavaFX & SWT 5
melaniemueller JavaFX Beispiel kann nicht ausgeführt werden AWT, Swing, JavaFX & SWT 4
T FXML Datei in Java Code einbinden: javafx.fxml.LoadException AWT, Swing, JavaFX & SWT 2
J JavaFX - Included FXML - Entfernen feststellen AWT, Swing, JavaFX & SWT 2
J JavaFX JavaFX/ Taskmenu / UML Klassendiagramm AWT, Swing, JavaFX & SWT 2
Davee JavaFX JavaFX Jar ausführbar jedoch nicht alle Stages AWT, Swing, JavaFX & SWT 3
2 JavaFX die ChoiceBox leitet den String nicht weiter oder es komm zu einem NullPointer AWT, Swing, JavaFX & SWT 8
C MouseEvent JavaFX AWT, Swing, JavaFX & SWT 4
L JavaFX javafx.fxml.LoadException bei einem Taschenrechner AWT, Swing, JavaFX & SWT 5
M4cM4rco0707 JavaFX Custom-Komponente mit Custom-Controller AWT, Swing, JavaFX & SWT 3
M Error occurred during initialization of boot layer java.lang.module.FindException: Module javafx.controls not found AWT, Swing, JavaFX & SWT 14
G javafx build.fxbuild in eclipse und ANT AWT, Swing, JavaFX & SWT 9
M Kollisionensbehandlung mit JavaFX AWT, Swing, JavaFX & SWT 1

Ähnliche Java Themen

Neue Themen


Oben