Как правильно прописать путь к CSS для отдельного Node

Имеется следующая структура :

введите сюда описание изображения

Далее я хочу для созданного MenuBar назначить новый стиль.

Пытаюсь сделать это следующим образом :

//
    MenuBar menuBar = new MenuBar();
    new DoBlackMenuBar(menuBar);
// здесь ошибок нет

DoBlackMenuBar

 public class DoBlackMenuBar {
    
        public DoBlackMenuBar(MenuBar node) {
            node.getStylesheets().add(
                    getClass().getResource("menuBar.css").toString());
                   //Здесь getResourse возвращает null
        }
    
    }

Подскажите пожалуйста, что я делаю не так. Предполагаю что я неверно прописываю путь для getResourse(), хотя файл css лежит в метке resourses (IDE).

Как для любого Node назначать свои стили css, избегая тысячи строк в одном файле ?


Ответы (1 шт):

Автор решения: lampa

Сразу оговорюсь, что это применимо не ко всему, например сборщик spring boot или javafx игнорируют ресурсы в пакетах и получают их из специальной директории resources, которая является корневой для ресурсов.

Допустим есть ресурс

  • src/main/java/example/cat/cat.png

И два класса

  • src/main/java/example/cat/Cat.java
  • src/main/java/example/dog/Dog.java

Если мы хотим получить изображение cat.png в классе Cat.java (а изображение и класс лежат в одном пакете), то следует сделать так: getClass().getResource("cat.png"), Что буквально означает Cat.class.getResource("./cat.png"), где ./ указывает на пакет example.cat.

Если мы хотим получить изображение cat.png в классе Dog.java (а изображение и класс уже не лежат в одном пакете), то мы должны указать либо абсолютный путь до ресурса: getClass().getResource("/example/cat/cat.png"), что будет означать Dog.class.getResource("/example/cat/cat.png"). Либо относительный путь, где пакет dog относится к пакету cat: Dog.class.getResource("../cat/cat.png")

Кстати да, как вы могли заметить есть конструкция getClass().getResource(...), где getClass() получает класс текущего объекта, а есть Cat.class.getResource() где явно указывается класс, поэтому вызов этих двух выражений из класса Dog:

Cat.class.getResource("cat.png")
getClass().getResource("cat.png")

будет совершенно разные ресурсы получать. А где вызывается getClass() совершенно не важно, в конструкторе, методе или статичном методе. Он всегда будет возвращать тот класс, где идет его вызов:

class Dog {
    public Dog {
        getClass(); // => Dog.class
    }

    public void woof() {
        getClass(); // => Dog.class
    }

    public static void sleep() {
        getClass(); // => Dog.class
    }
}

Конкретно в вашем случае ресурсы лежат в отдельной директории resources, которая является корневой, т.е. все ресурсы лежат по пути /menuBar.css, /menuSide.css и так далее. Но при вызове getClass().getResource("menuBar.css") ресурс ищется по пути, относительно класса DoBlackMenuBar, т.е.: /setSomethingtoGUI/DoBlackMenuBar/menuBar.css

→ Ссылка