2015-05-16 53 views
1

我正在使用场景生成器2.0和月食月神。 在fxml文件中我有我的场景代码与图像。 如果我测试这个Eclipse的一切都还好吧,但是如果我出口这可运行罐子,然后运行这个我有窗口而不图片... 下面是部分代码:Javafx从罐子的图像

<ImageView layoutX="63.0" layoutY="14.0"> 
        <image> 
         <Image url="@../Images/MainPage/O.png" /> 
        </image> 
        </ImageView> 

文件的结构:

Graph: 
    MainPage: 
     MainPage.fxml 
    Images: 
     MainPage: 
      O.png 

我认为问题出在路径上,但我不知道如何制作这条路径。 代码装载机:

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

初始化函数:

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(); 
} 
+0

您可以添加StackTrace吗? – ItachiUchiha

+0

我没有StackTrace ...:/ 它只是没有加载 –

+0

进入jar目录并输入'java -jar '并粘贴输出到这里。 – ItachiUchiha

回答

0

你在你的路径开始缺少/。请使用:

FXMLLoader myLoader= new FXMLLoader(getClass() 
.getResource(/com/gmail/Slupik98/Project_Stangar/Graph/MainPage/MainPage.fxml)); 
+0

我有这个:) \t public static final String START_PREFIX_PATH =“/ com/gmail/Slupik98/Project_Stangar /”; \t private static final String GRAPHIC_PREFIX_PATH =“Graph /”; \t private static final String STANDARD_PREFIX_PATH = START_PREFIX_PATH + GRAPHIC_PREFIX_PATH; \t \t public static String screen1ID =“Login”; \t public static String screen1File = STANDARD_PREFIX_PATH +“登录/”+“登录。FXML “; \t公共静态字符串screen2ID = ”的MainPage“; \t公共静态字符串screen2File = STANDARD_PREFIX_PATH +” 的MainPage/“+” MainPage.fxml“; –

+0

该项目工程,但只有一个编译器和这里的问题,因为当我导出它,并将它继续加载,但没有图形.... –

+0

我不明白你的观点,做FXMLs加载吗? – ItachiUchiha