Как правильно прописать путь к 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 шт):
Сразу оговорюсь, что это применимо не ко всему, например сборщик spring boot или javafx игнорируют ресурсы в пакетах и получают их из специальной директории resources, которая является корневой для ресурсов.
Допустим есть ресурс
src/main/java/example/cat/cat.png
И два класса
src/main/java/example/cat/Cat.javasrc/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
