2017-07-19 78 views
0

我正在嘗試創建名爲「奧賽羅」的遊戲。我在scenebuilder中創建了一個按鈕來重新開始遊戲。 我有一個gridPane [從0到7] [從0到7](暗淡陣列)和每個塊,例如myGridPane [i] [j]圖像查看器與其中包含我的作品(黑色或白色)。我有一些錯誤..但我不明白我錯了什麼。幫助我,謝謝你。JavaFX - image,imageview

錯誤,當我按下 「重啓遊戲按鍵」

> Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException 
    at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1774) 
    at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1657) 
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86) 
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238) 
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191) 
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
    at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74) 
    at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49) 
    at javafx.event.Event.fireEvent(Event.java:198) 
    at javafx.scene.Node.fireEvent(Node.java:8413) 
    at javafx.scene.control.Button.fire(Button.java:185) 
    at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:182) 
    at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:96) 
    at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:89) 
    at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218) 
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80) 
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238) 
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191) 
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
    at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74) 
    at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54) 
    at javafx.event.Event.fireEvent(Event.java:198) 
    at javafx.scene.Scene$MouseHandler.process(Scene.java:3757) 
    at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485) 
    at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762) 
    at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494) 
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:381) 
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:295) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$354(GlassViewEventHandler.java:417) 
    at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389) 
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:416) 
    at com.sun.glass.ui.View.handleMouseEvent(View.java:555) 
    at com.sun.glass.ui.View.notifyMouse(View.java:937) 
    at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method) 
    at com.sun.glass.ui.gtk.GtkApplication.lambda$null$49(GtkApplication.java:139) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: java.lang.reflect.InvocationTargetException 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:71) 
    at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:275) 
    at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1769) 
    ... 52 more 
Caused by: java.lang.IllegalArgumentException: Invalid URL: Invalid URL or resource not found 
    at javafx.scene.image.Image.validateUrl(Image.java:1118) 
    at javafx.scene.image.Image.<init>(Image.java:620) 
    at othello.controller.BoardController.restartGame(BoardController.java:72) 
    ... 62 more 
Caused by: java.lang.IllegalArgumentException: Invalid URL or resource not found 
    at javafx.scene.image.Image.validateUrl(Image.java:1110) 
    ... 64 more 

我的板代碼

@FXML 
    private void restartGame(ActionEvent event)throws Exception{ 
     myGrid = new GridPane(); 
     black = new Image("images/black.png"); 
     white = new Image("images/white.png"); 
     empty = new Image("images/empty.png"); 
     ImageView square = new ImageView(); 
     square.setImage(empty); 
     ImageView blackSquare = new ImageView(); 
     blackSquare.setImage(black); 
     ImageView whiteSquare = new ImageView(); 
     whiteSquare.setImage(white); 
     for (int i = 0; i < 8; i++){ //Per righe 
     for (int j = 0; j < 8; j++){ // Per colonne 
      myGrid.add(square, i, j); 
     } 

     } 
     myGrid.add(blackSquare, 3, 3); 
     myGrid.add(blackSquare, 4, 3); 
     myGrid.add(whiteSquare, 4, 4); 
     myGrid.add(whiteSquare, 4, 3); 
    } 

路徑:

I have main project in src of netbeans. 
Inside it, i have: 
- othello (it contains my main) 
- othello.images (it cointains all my image also backgrounds) 
- othello.view (it contains my FXML files) 
- othello.model (now nothing) 
- othello.controller (it contains the controllers about the fxml files) 
+0

你嘗試調試應用程序? –

+0

這個問題似乎是在'othello.controller.BoardController.restartGame(BoardController.java:72)' – deHaar

回答

3

documentationImage類:

通過URL支持的所有網址,可以傳遞給構造函數。如果傳遞的字符串不是有效的URL,而是路徑,則在該情況下,將在類路徑中搜索圖像。

所以,你的圖像路徑images/black.png將搜索相對於類路徑,並明確有在classpath的根目錄沒有images資源。您需要

new Image("othello/images/black.png") 

由於您的Main類是在othello包,另一種選擇是獲取資源相對於,例如

new Image(Main.class.getResource("images/black.png")) 

注意你有進一步的錯誤,這是不顯示尚未當你達到他們之前的代碼失敗。您不能添加同一節點的場景圖不止一次,所以

myGrid.add(blackSquare, 3, 3); 
    myGrid.add(blackSquare, 4, 3); 

將引發與消息的IllegalStateException「重複添加子」,因爲你要添加blackSquare多次到現場圖。您需要爲網格中的每個方格創建一個新的ImageView(如果您願意,可以在不同的ImageView之間使用相同的Image)。

所以,你應該做的:

@FXML 
private void restartGame(ActionEvent event)throws Exception{ 
    myGrid = new GridPane(); 
    black = new Image(Main.class.getResource("images/black.png")); 
    white = new Image(Main.class.getResource("images/white.png")); 
    empty = new Image(Main.class.getResource("images/empty.png")); 
    for (int i = 0; i < 8; i++){ //Per righe 
    for (int j = 0; j < 8; j++){ // Per colonne 
     myGrid.add(square, i, j); 
    } 

    } 
    myGrid.add(new ImageView(black), 3, 3); 
    myGrid.add(new ImageView(black), 4, 3); 
    myGrid.add(new ImageView(white), 4, 4); 
    myGrid.add(new ImageView(white), 4, 3); 
} 
-2

使用此代碼來獲取圖像

File f = new File("images/black.png"); 
    Image img = new Image(f.toURI().toString()); 
+0

這將搜索相對於工作目錄,所以它只會工作,如果工作目錄恰好是'圖像的父'(它可能不是)。在應用程序捆綁爲jar文件時(因爲圖像不再是文件,而是jar文件中的條目),它在任何情況下都不起作用。 –

0

你得到一個java.lang.IllegalArgumentException異常:無效的URL。您沒有提供有效的圖片網址。比方說,我想顯示一個名爲boldedRow.png的圖像,而boldedRow.png恰好在視圖文件夾內,而我的主要java文件位於src目錄中,那麼我可以通過以下方式獲取圖像url。

程序的結構: src目錄:

- > ShowImage.java

- >查看/ boldedRow.png

public class ShowImage extends Application { 
    @Override 
    public void start(Stage primaryStage) throws Exception { 
     Pane root = new Pane(); 
     ImageView image = new ImageView(new Image(getClass().getResourceAsStream("view/boldedRow.png"))); 
     root.getChildren().add(image); 
     Scene scene = new Scene(root); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 
+1

但是,在這種情況下,OP無法獲取相對於當前類的引用,因爲包含該映像的包不是包含當前類的包的子包。 (你可以嘗試使用'getResourceAsStream(「../ images/black.png」)',它可能在類加載器從文件系統加載時工作,但在加載類加載器時會失敗,例如從jar文件加載,因爲'..'不是有效的資源名稱。) –

+0

好吧,從來沒有從其他jar文件加載過的圖像。謝謝(你的)信息。我會記住它。 – karna

+0

這不是來自另一個jar文件,它只是來自一個不是當前子包的包。 OP說當前課程在'othello.controller'中,圖像在'othello.images'中。 'othello.images'不是'othello.controller'的子包。所以你在這裏描述的方法將不起作用(或者至少不能保證工作)。 –