Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javafx从jar加载图像_Java_Javafx_Fxml - Fatal编程技术网

Javafx从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

我正在使用Scene Builder 2.0和eclipse Luna。 在fxml文件中,我有图像场景的代码。 如果我在eclipse上测试它,一切都正常,但是如果我将它导出到runnable jar,然后运行它,我就有了一个没有图像的窗口。。。 下面是代码的一部分:

<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));