Я закончил небольшой частный проект в JavaFX с клипом e (fx). Теперь я хотел бы экспортировать его как исполняемый файл jar. Все работает отлично, за исключением того, что фоновые изображения панели и кнопки теряются. Пути к этим изображениям были определены в отдельном файле CSS. Другие определения из этого файла хорошо реализованы, только изображения отсутствуют. Любая идея, что может быть причиной этого? Или есть даже лучший способ опубликовать готовый проект java?
Это, по-видимому, общая проблема. Я сам боролся с этим. Посмотрите, как я ссылаюсь на css и изображение в css.
Вот решение, которое работает в среде разработки, в Scene Builder и в упакованном JAR.
Структура папок:
Main.java:
package application;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;
public class Main extends Application {
@Override
public void start(Stage primaryStage) {
try {
FXMLLoader loader = new FXMLLoader(Main.class.getResource("view/RootLayout.fxml"));
AnchorPane rootLayout = (AnchorPane) loader.load();
Scene scene = new Scene(rootLayout, 400, 400);
scene.getStylesheets().add(getClass().getResource("css/application.css").toExternalForm());
primaryStage.setScene(scene);
primaryStage.show();
} catch(Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
launch(args);
}
}
RootLayout.fxml:
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.AnchorPane?>
<AnchorPane xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.view.RootLayoutController">
<children>
<Pane layoutX="0.0" layoutY="0.0" prefHeight="200.0" prefWidth="200.0">
<children>
<Button fx:id="sunButton" layoutX="74.0" layoutY="88.0" mnemonicParsing="false" onAction="#handleSunButtonClick" styleClass="sun-button" stylesheets="/toolbar.css" text="Button" />
</children>
</Pane>
</children>
</AnchorPane>
RootLayoutController.java:
package application.view;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
public class RootLayoutController {
@FXML
Button sunButton;
@FXML
public void handleSunButtonClick() {
System.out.println( "Button clicked");
}
}
toolbar.css:
.sun-button {
-fx-graphic: url('./icons/sun.png');
}
application.css:
.root {
-fx-background-color:lightgray;
}
sun.png:
Это работает как в среде разработки, так и при упаковке JAR (выберите "Извлечь требуемые библиотеки в сгенерированный JAR" в Eclipse).
Скриншот (только кнопка с иконкой, загруженной через css)