Javafx从jar加载图像
我正在使用Scene Builder 2.0和eclipse Luna。 在fxml文件中,我有图像场景的代码。 如果我在eclipse上测试它,一切都正常,但是如果我将它导出到runnable jar,然后运行它,我就有了一个没有图像的窗口。。。 下面是代码的一部分:Javafx从jar加载图像,java,javafx,fxml,Java,Javafx,Fxml,我正在使用Scene Builder 2.0和eclipse Luna。 在fxml文件中,我有图像场景的代码。 如果我在eclipse上测试它,一切都正常,但是如果我将它导出到runnable jar,然后运行它,我就有了一个没有图像的窗口。。。 下面是代码的一部分: <ImageView layoutX="63.0" layoutY="14.0"> <image> <Ima
<ImageView layoutX="63.0" layoutY="14.0">
<image>
<Image url="@../Images/MainPage/O.png" />
</image>
</ImageView>
我认为问题在于这条路,但我不知道如何走这条路。
装载机代码:
public class ScreensController extends StackPane{
private HashMap<String, Node> screens = new HashMap<>();
public ScreensController() {
super();
}
public void addScreen(String name, Node screen){
System.out.println("name: "+name);
System.out.println("screen: "+name);
screens.put(name, screen);
}
public Node getScreen(String name){
return screens.get(name);
}
//name - nazwa Screenu
//rescue - nazwa pliku FXML
public boolean loadScreen(String name, String rescue){
try {
System.out.println("loading Screen "+name+" path: "+rescue);
System.out.println("0001");
FXMLLoader myLoader= new FXMLLoader(getClass().getResource(rescue));
System.out.println("0002");
Parent loadScreeen = (Parent) myLoader.load();
System.out.println("0003");
ScreenControlled myScreenControler = ((ScreenControlled) myLoader.getController());
System.out.println("0004");
myScreenControler.setScreenParent(this);
System.out.println("0005");
addScreen(name, loadScreeen);//Dodanie do HashMap
System.out.println("0006");
return true;
} catch (IOException e) {
System.out.println("IOException Error in ScreenController: "+e.getMessage().substring(1,e.getMessage().length())
+"\n Cause: "+e.getCause()
+"\n Localized Message: "+e.getLocalizedMessage().substring(1,e.getLocalizedMessage().length())
+"\n Class: "+e.getClass()
+"\n ST: ");
e.printStackTrace();
return false;
}
}
public boolean setScreen(final String name){
System.out.println("Setting Screen: "+name);
if(screens.get(name) != null) { //screen loaded
final DoubleProperty opacity = opacityProperty();
if(!getChildren().isEmpty()) { //if there is more than one screen
Timeline fade = new Timeline(
new KeyFrame(Duration.ZERO, new KeyValue(opacity, 1.0)),
new KeyFrame(new Duration(1000), new EventHandler<ActionEvent>(){
@Override
public void handle(ActionEvent t){
getChildren().remove(0); //remove the displayed screen
getChildren().add(0, screens.get(name)); //add the screen
Timeline fadeIn = new Timeline(
new KeyFrame(Duration.ZERO, new KeyValue(opacity, 0.0)),
new KeyFrame(new Duration(800), new KeyValue(opacity, 1.0)));
fadeIn.play();
}
}, new KeyValue(opacity, 0.0)));
fade.play();
}else{
setOpacity(0.0);
getChildren().add(screens.get(name)); //no one else been displayed, then just show
Timeline fadeIn = new Timeline(
new KeyFrame(Duration.ZERO, new KeyValue(opacity, 0.0)),
new KeyFrame(new Duration(1000), new KeyValue(opacity, 1.0)));
fadeIn.play();
}
return true;
}else{
System.out.println("screen hasn't been loaded!!!\n");
return false;
}
}
public boolean unloadSCreen(String name) {
if(screens.remove(name)==null) {
System.out.println("Screen " +name+ " didn't exist");
return false;
}else{
return true;
}
}
}
您在路径的开头缺少一个
/
。请使用:
FXMLLoader myLoader= new FXMLLoader(getClass()
.getResource(/com/gmail/Slupik98/Project_Stangar/Graph/MainPage/MainPage.fxml));
你能添加StackTrace吗?我没有StackTrace…:/它只是没有加载到jar所在的目录中,键入
java-jar
并将输出粘贴到这里。。。我添加了以下代码:background.setImage(新图像(getClass().getResourceAsStream(“/Graph/images/MainPage/bg.jpg”));我收到了这个错误:我猜是加载FXML而不是图像的问题。我有这样一个:)公共静态最终字符串START_PREFIX_PATH=“/com/gmail/Slupik98/Project_Stangar/”;私有静态最终字符串GRAPHIC_PREFIX_PATH=“Graph/”;私有静态最终字符串标准前缀路径=开始前缀路径+图形前缀路径;公共静态字符串screen1ID=“Login”;公共静态字符串screen1File=STANDARD_PREFIX_PATH+“Login/”+“Login.fxml”;公共静态字符串screen2ID=“MainPage”;公共静态字符串screen2File=STANDARD_PREFIX_PATH+“MainPage/”+“MainPage.fxml”;这个程序可以运行,但只适用于编译器,问题就在这里,因为当我导出它并打开它时,它会继续加载,但不会加载图形…使用开头显示的类加载FXML文件。问题是它看起来像编译器中的项目:所以当导出和运行时:图片显示问题在于图片没有加载,以及我在文件FXML中给出的路径,例如:即使程序在jar文件中,我应该如何处理图形工作?
public void start(Stage stage) throws Exception {
new Fonts().initialize();
this.stage=stage;
ScreensController mainContainer = new ScreensController();
mainContainer.loadScreen(ScreensFramework.screen2ID, ScreensFramework.screen2File);
mainContainer.setScreen(ScreensFramework.screen2ID);
root = new StackPane();//Group root = new Group();
root.getChildren().addAll(mainContainer);
Scene scene = new Scene(root);
this.stage.setScene(scene);
this.stage.show();
}
FXMLLoader myLoader= new FXMLLoader(getClass()
.getResource(/com/gmail/Slupik98/Project_Stangar/Graph/MainPage/MainPage.fxml));