2017-07-19 80 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'的子包。所以你在这里描述的方法将不起作用(或者至少不能保证工作)。 –