JavaFX CSS ändern wirft NPE

White_Fox

Top Contributor
Guten Abend allerseits.

Ich spiele jetzt das erste Mal mit CSS-Dateien herum und möchte eine CSS-Datei am Anfang laden. Ich möchte überhaupt erstmal irgendeine CSS-Datei laden, allerdings kommt dabei stets eine NPE. Sieht jemand vielleicht, warum?

Die CSS-Datei liegt in einem Ordner ..\ApplicationDirectory\css\Dark.css, der Pfad stimmt auch. Die .jar liegt im ApplicationDirectory. Die CSS-Datei hab ich von hier (zweiter Post, der mit dem Bild):


Java:
public class MainApplication extends javafx.application.Application {

    private static View view;
    private static UserSettings settings;

    @Override
    public void start(Stage primaryStage) throws Exception {
        view.initGUI(primaryStage);
    }

    public void run(String[] args) {
        Model model;
        Controller controller;
        CommandFactory commandFactory;

        try {
            //Load usersettings
            loadUsersettings();

            //Load model and controller
            model = new Model();
            controller = new Controller();
            controller.setModel(model);

            commandFactory = CommandFactory.newFactory(model, controller);

            view = new View(model, controller, this);            //<--

            controller.setView(view);

            launch(args);
        }
        catch (Exception ex) {
            Logger.getLogger(Launcher.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    public void stop() throws Exception {
        super.stop();
    }
    
    //...
}


public class View implements ModelObservable, ViewdataControllable, ViewsControllerLinkable {
    //...
    public View(ModelsViewLinkable model,
        ControllersViewLinkable controller,
        Application mainapplication) {

        this.controller = controller;
        this.model = model;
        this.mainapplication = mainapplication;
        this.commands = CommandFactory.newFactory();

        //Register as ModelObserver
        registerListenerToModel(this);
    }
    
    public void initGUI(Stage mainstage) throws IOException {
        //Load language
        File file = new File(Statics.lngPath());
        URL[] urls = {file.toURI().toURL()};
        ClassLoader loader = new URLClassLoader(urls);
        textResourceBundle = ResourceBundle.getBundle("text", Locale.getDefault(), loader);

        this.mainStage = mainstage;

        //Generate main window
        mainPane = new BorderPane();
        Scene mainScene = new Scene(mainPane, 1000, 600);
        mainScene.getStylesheets().add(mainapplication.getClass().getResource(Statics.cssPath() + "Dark.css").toExternalForm()); //<-- NPE hier

        getInitData();

        //...

Gruß
WF
 
Vermutlich gibt getResource null zurück?

Wenn die css-Datei als Datei im Filesysten liegt, ist getResource das falsche, damit lädt man Resourcen innerhalb des Jars. Einfach den absoluten Pfad zur Datei übergeben müsste klappen.
 
Ah danke...ja, jetzt geht es wieder, allerdings lädt er die CSS-Datei immer noch nicht.

In der Ausgabe bekomme ich jetzt die Warnung "Dez 18, 2020 12:01:54 AM com.sun.javafx.css.StyleManager loadStylesheetUnPrivileged" gefolgt von der Meldung, daß die Ressource nicht gefunden wurde - obwohl es sie aber gibt. Das Projekt und die Datei befinden sich irgendwo im persönlichen Ordner, also Adminrechte oder so sollten da nicht erforderlich sein...oder?
 
Dann vielleicht doch erst File oder Path draus machen, dann ne URL, und daraus dann mit toExternalForm den String. Kanns grad nicht ausprobieren, aber gut möglich, dass aktuell sonst versucht wird, das als Resource zu laden
 
Danke...so funktioniert es (bzw. es kommt ein anderer Fehler).

Mal eine Frage: Was genau macht die URL-Klasse eigentlicht genau?


Wie gesagt kommt jetzt ein anderer Fehler, jetzt lädt er die Datei, allerdings kommt der CSS-Parser aber mit einem anderen Fehler um die Ecke: "Expected LBRACE at [2,0]".
Anscheinend vermisst er eine linke Akkolade '{' irgendwo, aber wo? Was soll mir [2,0] sagen? Die Datei sieht so aus:

CSS:
/*/////////////////////////////////////////////////////////////////////////////
//                     Dark theme was dropped from here:                     //
// https://stackoverflow.com/questions/49159286/make-a-dark-mode-with-javafx //
//                            Thanks for sharing.                            //
/////////////////////////////////////////////////////////////////////////////*/

.root {
    -fx-accent: #1e74c6;
    -fx-focus-color: -fx-accent;
    -fx-base: #373e43;
    -fx-control-inner-background: derive(-fx-base, 35%);
    -fx-control-inner-background-alt: -fx-control-inner-background ;
}

.label{
    -fx-text-fill: lightgray;
}

.text-field {
    -fx-prompt-text-fill: gray;
}

.titulo{
    -fx-font-weight: bold;
    -fx-font-size: 18px;
}

.button{
    -fx-focus-traversable: false;
}

.button:hover{
    -fx-text-fill: white;
}

.separator *.line {
    -fx-background-color: #3C3C3C;
    -fx-border-style: solid;
    -fx-border-width: 1px;
}

.scroll-bar{
    -fx-background-color: derive(-fx-base,45%)
}

.button:default {
    -fx-base: -fx-accent ;
}

.table-view{
    /*-fx-background-color: derive(-fx-base, 10%);*/
    -fx-selection-bar-non-focused: derive(-fx-base, 50%);
}

.table-view .column-header .label{
    -fx-alignment: CENTER_LEFT;
    -fx-font-weight: none;
}

.list-cell:even,
.list-cell:odd,
.table-row-cell:even,
.table-row-cell:odd{   
    -fx-control-inner-background: derive(-fx-base, 15%);
}

.list-cell:empty,
.table-row-cell:empty {
    -fx-background-color: transparent;
}

.list-cell,
.table-row-cell{
    -fx-border-color: transparent;
    -fx-table-cell-border-color:transparent;
}
 
Also: Ich habe erst den Kommentar entfernt, und dann auch mal die Reihenfolge der Einträge geändert. Und vor jedem Testlauf hab ich das Projekt bereinigt und neu gebaut.

Jedoch bleibt die Fehlermeldung, und sie ändert sich auch nicht. Es wird stets [2, 0] angemäkelt. Kann der Fehler noch irgendwie außerhalb der CSS-Datei liegen?
 
Keine Exception, nur eine Warnung:
Dez 18, 2020 7:44:45 PM com.sun.javafx.css.parser.CSSParser parse
WARNING: CSS Error parsing file:/C:/Pfad/zum/Projekt/jComponent%20Library%20Sorcerer/css/: Expected LBRACE at [2,0]

Edit: Komisch, jetzt geht es...hab vorhin zwischendurch mal meinen Rechner neu gestartet und nun läuft es anständig.

Danke für deine Hilfe, @mrBrown . 🙂
 

Zurück
Oben