JavaFX wie funktioniert CSS und javaFX

strußi

Top Contributor
Moin,
IDE:Netbeans 8.2
JDK:1.8.0_102

ich habe das Standard "Hello World" von NetBeans. Ziel ist es jetzt herauszubekommen wie ich den Button ein "Dark-Thema" mittels CSS verpassen kann.
CSS:
#button {
    -fx-color: black;
    -fx-background-color: black;
    -fx-fill: thistle;
    -fx-border-color: thistle;
}
Java:
package csstest;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

/**
*
* @author user
*/
public class CssTest extends Application{
  
    @Override
    public void start( Stage primaryStage ){
        Button btn = new Button();
        btn.setId( "button");
        btn.setText( "Say 'Hello World'" );
        btn.setOnAction(( ActionEvent event ) -> {
            System.out.println( "Hello World!" );
        });
      
        StackPane root = new StackPane();
        root.getChildren().add( btn );
      
        Scene scene = new Scene(root, 300, 250 );
        primaryStage.setTitle( "Hello World!" );
        primaryStage.setScene( scene );
        scene.getStylesheets().add( "Dark.css");
      
      
        primaryStage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main( String[] args ){
        launch( args );
    }
  
}
css und java-Datei liegen im gleichen Package
Das Programm läuft zwar durch und das Fenster öffnet sich auch aber der CSS-File wird nicht angewendet weil die Resource nicht gefunden wird.

-- log
ant -f C:\\Users\\user\\Documents\\NetBeansProjects\\CssTest -Djavac.includes=csstest/CssTest.java -Dnb.internal.action.name=run.single -Drun.class=csstest.CssTest run-single
init:
Deleting: C:\Users\user\Documents\NetBeansProjects\CssTest\build\built-jar.properties
deps-jar:
Updating property file: C:\Users\user\Documents\NetBeansProjects\CssTest\build\built-jar.properties
Compiling 1 source file to C:\Users\user\Documents\NetBeansProjects\CssTest\build\classes
compile-single:
run-single:
Nov 07, 2016 3:21:49 PM com.sun.javafx.css.StyleManager loadStylesheetUnPrivileged
WARNING: Resource "Dark.css" not found.
BUILD SUCCESSFUL (total time: 4 seconds)

viele Grüße
 

dennisbauer

Aktives Mitglied
Ungeachtet davon, wie Netbeans mit der Verzeichnisstruktur umgeht, versuch doch zunächst mithilfe des nachfolgenden Codeschnipsels zu debuggen, wo du dich überhaupt befindest bzw. was aktuell alles in deinem Verzeichnis an Dateien liegt:

Code:
File file = new File(".");
for(File child: file.listFiles())
System.out.println(child.getName());

damit wirst du schonmal rausfinden, ob deine CSS-Datei überhaupt in deinem Verzeichnis liegt, auf das du zugreifen möchtest.
Was ich jedoch glaube ist, dass er die Dark.css-Datei, wenn du sie so wie bei dir einbindest, dass er sie über das Verzeichnis wo deine Jar-Datei liegt einbindet, statt aus deinem Jar-Archiv selbst. Probier als zweiten Anlauf also einmal, die Jar-Datei in ein Verzeichnis zu legen bzw. leg die CSS-Datei einfach zur Jar-Datei dazu, dann sollte es gehen.

Ich halte alle FXML/CSS/Bild-Dateien im Resources-Verzeichnis unter src/main/resources, dann werden die Dateien mit in die Jar gepackt beim Bauen und du kannst mithilfe getClass().getResource(...) eine Url mit reinladen. Generell solltest du deine CSS-Dateien auch in der FXML mit einbinden statt im Code, das vereinfacht in erster Linie die Trennung zwischen deiner GUI und deinem Code.
 

dennisbauer

Aktives Mitglied
Dann siehst du hieran, dass die Dateiangabe zum Dark.css nicht ausreicht, sondern du noch weiter bis zu dem Package navigieren musst. Die Pfadangabe sollte also aussehen wie "src/main/java/deinpackagepfad/Dark.css"
 

strußi

Top Contributor
ich habe jetzt alle Varianten, von
scene.getStylesheets().add( "C:\\Users\\user\\Documents\\NetBeansProjects\\CssTest\\src\\csstest\\Dark.css" ); bis
scene.getStylesheets().add( "csstest/Dark.css" );
ausprobiert
die Ausgabe war immer dieselbe
ant -f C:\\Users\\user\\Documents\\NetBeansProjects\\CssTest -Djavac.includes=csstest/CssTest.java -Dnb.internal.action.name=run.single -Drun.class=csstest.CssTest run-single
init:
Deleting: C:\Users\user\Documents\NetBeansProjects\CssTest\build\built-jar.properties
deps-jar:
Updating property file: C:\Users\user\Documents\NetBeansProjects\CssTest\build\built-jar.properties
Compiling 1 source file to C:\Users\user\Documents\NetBeansProjects\CssTest\build\classes
compile-single:
run-single:
Nov 07, 2016 9:22:19 PM com.sun.javafx.css.StyleManager loadStylesheetUnPrivileged
WARNING: Resource "src/csstest/Dark.css" not found.
BUILD SUCCESSFUL (total time: 5 seconds)

nur mit dem Unterschied in dem Resource-Pfad.

Kann es sein, das ich etwas generelles überseh?
 

dzim

Top Contributor
Also als allererstes:
wie funktioniert CSS und javaFX
Antwort: Gut! :D

Zu deinem Problem
Java:
scene.getStylesheets().add( "Dark.css");

Hier mal die JavaDoc
public final ObservableList<String> getStylesheets()
Gets an observable list of string URLs linking to the stylesheets to use with this scene's contents.
The URL is a hierarchical URI of the form [scheme:][//authority][path]. If the URL does not have a [scheme:] component, the URL is considered to be the [path] component only. Any leading '/' character of the [path] is ignored and the [path] is treated as a path relative to the root of the application's classpath.

package com.example.javafx.app;

import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class MyApp extends Application {

@Override public void start(Stage stage) {
Scene scene = new Scene(new Group());
scene.getStylesheets().add("/com/example/javafx/app/mystyles.css");
stage.setScene(scene);
stage.show();
}

public static void main(String[] args) {
launch(args);
}
}

For additional information about using CSS with the scene graph, see the CSS Reference Guide.
Was lernen wir?
1) Es verlangt eine URL ODER
2) einen Pfad im Classpath.
3) dein Code muss wie folgt aussehen (vorausgesetzt, dass die Datei Dark.css am Ende auch im JAR enthalten ist, oder wenn du das .class-File ausführst, dass die Datei daneben liegt und in den Classpath aufgenommen wurde - was NetBeans auch machen sollte)
Java:
scene.getStylesheets().add(getClass().getResource("/Dark.css"));
(wobei der Slash "/" am Anfang laut Doku auch weggelassen werden kann)

#edit: die Variante
Java:
getClass().getResource("")
nutze ich meist, damit ich sicher bin, dass ein ordentlicher Pfad draus wird. Ich geh da gerne auch Nummer sicher und es funktioniert so bei mir in diversen Anwendungen.
 

strußi

Top Contributor
hi, die Variante scene.getStylesheets().add(getClass().getResource("/Dark.css")); hatte ich auch schon gesehen und ausprobiert, mit dem Resultat, could not find Resource
 

dzim

Top Contributor
Dann solltest du wirklich mal überprüfen, ob die Dark.css denn überhaupt dort liegt, wo sie sein sollte: Neben dem Class-File!
 

lam_tr

Top Contributor
Hallo dzim,

das Problem habe ich auch, das beim Compilieren, dass die CSS Dateien nicht in das Binary Verzeichnis kopiert werden. Kann man das irgendwo in Eclipse konfigurieren? Ich habe die css einfach in das Bin Verzeichnis gelegt.

Grüße
lam
 

dzim

Top Contributor
Hm. Bei mir klappt es immer. Ich müsste dazu deine Projektstruktur kennen (Pfadstruktur).
Wie arbeitest du? Mit Maven? Oder erstellst du "nur" e(fx)clipse-Projekte?
Ich habe bereits eine ganze Batterie an verschiedenen Projekten gemacht. Wichtig war für alle (jedenfalls für mich persönlich), das ich das e(fx)clipse-Plugin nutzen konnte. Damit hat alles geklappt...
 

lam_tr

Top Contributor
Axo, nee ich habe ein JavaProject angelegt und in dem Project ist ein css/default.css Datei.
Und speziell das Css Verzeichnis habe ich in den Classpath hinzugefügt.
 

dzim

Top Contributor
wenn du in einen normalen Projekt im src-Verzeichniss ein Package "css" anlegst und da dein File rein tust, sollte das automatisch Teil des Classpath sein. Alles ausserhalb des src musst du selbst einbinden, wenn du es benötigst.
Ich denke mal, dass es bei NetBeans nicht anders ist...
 

lam_tr

Top Contributor
Ja genau, aber ich habe in dem Fall ein separates Verzeichnis außerhalb des src Verzeichnis, aber selbst mit Classpath Einbindung, hatte die IDE nicht ordnungsgemäß ins Bin kopiert.
 

dzim

Top Contributor
Ich würde dir e(fx)clipse ans Herz legen. Und dann erstell ein JavaFX-Projekt. Das macht alles so, dass es funktioniert...
 

domjos1994

Mitglied
Hallo,
besteht das Problem mit CSS immer noch?

Wenn ja, hast du es mal auch so probiert?
Code:
this.getClass().getResource("/styles/Dark.css").toExternalForm()
LG Dominic
 

dzim

Top Contributor
Ja, hat er wohl. Wenn ich es richtig verstehe, ist sein CSS eifach nicht im ClassPath und somit nicht per getClass().getResource("...") auffindbar...
Irgendetwas muss an seinem Projekt-Setup schief sein.
 

domjos1994

Mitglied
Mhm, okay stimmt. Da das Projekt ja noch mir noch nicht soo groß erscheint, könnte man versuchen einfach mit Netbeans mal ein neues JavaFX-Projekt zu erstellen und den Quellcode da hinein zu pasten. Normalerweise funktioniert es, wenn die CSS-Datei im selben Ordner liegt zum Beispiel mit der Zeile hier:
Code:
scene.getStylesheets().add(this.getClass().getResource("Dark.css").toExternalForm());
 

dzim

Top Contributor
Ja. Er verwendet zwar Eclipse, aber auch dort gibt es, wenn man das entsprechende Plugin kurz nachinstalliert hat, spezifische JavaFX-Projekte. Und das funktioniert. Habe mit dem Plugin in seinen frühesten und hässlichsten Stunden auf Eclipse noch mit dem separat herunterzuladenen JavaFX begonnen, auf dieses Framework umzusteigen. Und nie grossartige Probleme damit.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
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
R auto. Importanweisungen für javafx funktioniert in Eclipse nicht mehr AWT, Swing, JavaFX & SWT 4
sserio Wie funktioniert ein Controller bei JavaFx? AWT, Swing, JavaFX & SWT 1
Zrebna JavaFX-Projekt mit Bildern funktioniert nicht - um Hilfe wird gebeten AWT, Swing, JavaFX & SWT 14
K JavaFX funktioniert nicht AWT, Swing, JavaFX & SWT 2
S JavaFX mit javac compilieren funktioniert nicht AWT, Swing, JavaFX & SWT 2
K javafx app > "run in browser" funktioniert nicht AWT, Swing, JavaFX & SWT 3
J JavaFX Button funktioniert(nicht) AWT, Swing, JavaFX & SWT 3
J Zellen in JavaFx einfärben funktioniert nicht AWT, Swing, JavaFX & SWT 1
H import javafx. Anweisungen funktioniert nicht AWT, Swing, JavaFX & SWT 2
Juelin if Abfrage funktioniert nicht richtig AWT, Swing, JavaFX & SWT 10
C Button ActionListener funktioniert nicht AWT, Swing, JavaFX & SWT 1
P AWT Programm funktioniert nicht richtig AWT, Swing, JavaFX & SWT 35
M Scrollbar funktioniert nicht AWT, Swing, JavaFX & SWT 10
D Repaint Funktioniert nicht AWT, Swing, JavaFX & SWT 2
W JEditorPane textausrichtung nach settext funktioniert nicht mehr AWT, Swing, JavaFX & SWT 11
H Swing Anpassen der Textgröße im JLabel funktioniert nur bedingt AWT, Swing, JavaFX & SWT 7
sserio JFrame setIconImmage() funktioniert nicht AWT, Swing, JavaFX & SWT 3
T Swing Tooltip-Delay funktioniert nicht immer. AWT, Swing, JavaFX & SWT 1
B Output GUI funktioniert nur beim ersten Mal richtig. AWT, Swing, JavaFX & SWT 4
U Wie funktioniert das rotieren unter 2dGraphics, also wie stelle ich z. B. 90° ein? AWT, Swing, JavaFX & SWT 1
U Wie funktioniert Polygon? AWT, Swing, JavaFX & SWT 1
U Wie genau funktioniert 2dgraphics, in diesem Bezug? AWT, Swing, JavaFX & SWT 4
S ChoiceBox aus ArrayList per setValue() mit Wert belegen funktioniert nicht. AWT, Swing, JavaFX & SWT 0
H KeyListener funktioniert nicht AWT, Swing, JavaFX & SWT 1
H BufferedImage zurücksetzen funktioniert nicht AWT, Swing, JavaFX & SWT 12
H RPG Programmieren, label.setLocation funktioniert nicht AWT, Swing, JavaFX & SWT 7
EinNickname9 Einfacher parser funktioniert nicht AWT, Swing, JavaFX & SWT 2
F Swing Adapt Row Height funktioniert nicht richtig :( AWT, Swing, JavaFX & SWT 7
P Swing jxmapviewer hinzufügen/nutzen funktioniert nicht AWT, Swing, JavaFX & SWT 7
CptK Wie funktioniert contains() für Path2D.Double AWT, Swing, JavaFX & SWT 10
J Anbindung Textfeldklasse an Table funktioniert nicht AWT, Swing, JavaFX & SWT 3
R Actionlistener funktioniert nicht AWT, Swing, JavaFX & SWT 4
B Stylen eines JTextPane funktioniert nicht AWT, Swing, JavaFX & SWT 1
VPChief Swing Eclipse: Nach Exportieren, Button funktioniert nicht mehr AWT, Swing, JavaFX & SWT 26
H Bewegung funktioniert nicht AWT, Swing, JavaFX & SWT 3
N Pixelfarbe abgleichen funktioniert nicht AWT, Swing, JavaFX & SWT 5
A Swing JTextField an Button übergeben für Popup-Fenster funktioniert nicht AWT, Swing, JavaFX & SWT 3
N eclipse Java, bilder benutzten Funktioniert nicht AWT, Swing, JavaFX & SWT 6
steven789hjk543 Swing Weiß jemand, warum dieses Programm nicht funktioniert? AWT, Swing, JavaFX & SWT 7
M Swing setMaximumSize funktioniert nicht AWT, Swing, JavaFX & SWT 1
B AWT actionPerformed Method funktioniert nicht AWT, Swing, JavaFX & SWT 12
L JavaFX Drag and Drop funktioniert nicht AWT, Swing, JavaFX & SWT 3
M Swing Code funktioniert auf Windows aber nicht Linux... AWT, Swing, JavaFX & SWT 3
T LookAndFeel LookAndFeel funktioniert nicht beim JFrame wechsel AWT, Swing, JavaFX & SWT 3
J JavaFX addListener funktioniert nicht AWT, Swing, JavaFX & SWT 1
P CardLayout funktioniert fehlerhaft AWT, Swing, JavaFX & SWT 13
L WrapLayout funktioniert nicht AWT, Swing, JavaFX & SWT 1
kodela Accalerator für einige Menüoptionen funktioniert nicht mehr AWT, Swing, JavaFX & SWT 3
K Swing Entfernen von Panel funktioniert nicht AWT, Swing, JavaFX & SWT 5
J AWT System Farben / java.awt.SystemColor funktioniert nicht AWT, Swing, JavaFX & SWT 4
G Swing Swing Binding JList funktioniert nicht AWT, Swing, JavaFX & SWT 5
it_is_all ActionListener umlenken/ updaten mit AddActionListener funktioniert nicht AWT, Swing, JavaFX & SWT 3
N JavaFX GridPane Halignment funktioniert nicht AWT, Swing, JavaFX & SWT 1
it_is_all JLabel.setIcon - funktioniert nicht mehr AWT, Swing, JavaFX & SWT 2
R Ausgabe über JOptionPane.showMessageDialog funktioniert nicht AWT, Swing, JavaFX & SWT 2
L 2D-Grafik Frage zu Ellipse2D.Double, Abfrage, ob Punkt enthalten ist funktioniert nicht AWT, Swing, JavaFX & SWT 3
J JTable Selection Listener funktioniert nicht AWT, Swing, JavaFX & SWT 4
F "ActionListener" funktioniert nicht AWT, Swing, JavaFX & SWT 4
Z BoxLayout funktioniert nicht und Buttongröße AWT, Swing, JavaFX & SWT 18
C Java Hintergrund funktioniert nicht AWT, Swing, JavaFX & SWT 9
J Swing Wie funktioniert dieser ChangePropertyListener??? AWT, Swing, JavaFX & SWT 0
GreenTeaYT Button funktioniert nicht für Ein-und Auszahlungen? AWT, Swing, JavaFX & SWT 8
C Keylistener funktioniert nicht AWT, Swing, JavaFX & SWT 1
A Swing Programm funktioniert aber zwei Buttons werden angezeigt AWT, Swing, JavaFX & SWT 3
M UIManager funktioniert nicht mit Farben AWT, Swing, JavaFX & SWT 9
M Swing UIManager funktioniert nicht mit Farben AWT, Swing, JavaFX & SWT 0
T KeyListener funktioniert nicht wenn ich ein JButton hinzufüge AWT, Swing, JavaFX & SWT 1
S KeyListener funktioniert nicht AWT, Swing, JavaFX & SWT 2
J JScrollPane funktioniert nicht AWT, Swing, JavaFX & SWT 5
M JavaFX Eventhandler Funktioniert nicht AWT, Swing, JavaFX & SWT 3
Sogomn JavaFX Injektion funktioniert nicht AWT, Swing, JavaFX & SWT 4
Blender3D Swing KeyBoardListener funktioniert nicht unter UBUNTU AWT, Swing, JavaFX & SWT 7
J DefaultCloseOperation funktioniert nicht AWT, Swing, JavaFX & SWT 9
F JavaFX ObservableList -- warum funktioniert das so.... AWT, Swing, JavaFX & SWT 3
R Swing Bewegung eines Graphics Objektes innerhalb eines JPanels funktioniert nicht richtig AWT, Swing, JavaFX & SWT 2
Paul15 Button funktioniert nur einmal AWT, Swing, JavaFX & SWT 9
D Swing Warum erhalte ich keine Ausgabe? Funktioniert der equals-vergleich in actionPeformed nicht richtig? AWT, Swing, JavaFX & SWT 3
H UpdatePolicy wird nicht richtig gesetzt / funktioniert nicht AWT, Swing, JavaFX & SWT 5
W Paint-Methode in anderer Klasse funktioniert nicht AWT, Swing, JavaFX & SWT 7
N KeyListener funktioniert nicht richitg AWT, Swing, JavaFX & SWT 4
L Event Handling wie funktioniert .getComponent? AWT, Swing, JavaFX & SWT 1
B JavaFX Scene Builder: resize funktioniert (meist) nicht AWT, Swing, JavaFX & SWT 6
J Swing Basics - JButton funktioniert nicht. AWT, Swing, JavaFX & SWT 1
D Passwort [Aber mit 3 Versuchen] Funktioniert nicht wie erwartet AWT, Swing, JavaFX & SWT 4
C Applet Applet funktioniert in Eclipse aber nicht in Browser AWT, Swing, JavaFX & SWT 1
S Swing Warum funktioniert der automatische Zeilenumbruch mit arabischen Zeichen beim JTextPane nicht AWT, Swing, JavaFX & SWT 3
Joew0815 JDialog repaint() funktioniert nicht wie gewünscht. AWT, Swing, JavaFX & SWT 2
C KeyPressed funktioniert auf iOS nicht richtig? AWT, Swing, JavaFX & SWT 4
D Event Handling MouseListener funktioniert seit Java 8 nicht mehr AWT, Swing, JavaFX & SWT 13
M LayoutManager GridLayout funktioniert nicht AWT, Swing, JavaFX & SWT 0
I Objekte aus contentPane löschen funktioniert nicht AWT, Swing, JavaFX & SWT 3
F JavaFX Antialiasing funktioniert nicht? AWT, Swing, JavaFX & SWT 8
F CardLayout.show() funktioniert teilweise nicht AWT, Swing, JavaFX & SWT 5
M Listener funktioniert nicht AWT, Swing, JavaFX & SWT 7
M "Update" der JTable funktioniert nicht AWT, Swing, JavaFX & SWT 2
T JAXB funktioniert ohne IDE nicht verlässlich AWT, Swing, JavaFX & SWT 12
C Repaint() funktioniert nicht in TabbedPanel AWT, Swing, JavaFX & SWT 5
T LayoutManager GridLayout panel.setSize funktioniert nicht AWT, Swing, JavaFX & SWT 1
R JavaFX Stage.close() funktioniert nicht im jar-File AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen


Oben