显示三张卡片图像 - JavaFX

时间:2015-09-18 22:39:14

标签: java javafx

我正在完成我的第一个JavaFX任务。我必须随机显示3张卡片图片。最初我把卡片放在一个单独的文件夹中,但是它给了我一个错误,所有我能从这个新的极大错误中解读的是无法找到的东西。我假设它是卡片图像,所以我将它们移动到与.java文件相同的目录中。通常情况下,我只会给我的导师发电子邮件,但直到下周他才出城。任何帮助,将不胜感激。我将在代码块之后包含异常输出的屏幕截图。

import java.util.ArrayList;
import javafx.application.Application;
//import javafx.event.ActionEvent;
//import javafx.event.EventHandler;
import javafx.scene.Scene;
//import javafx.scene.control.Button;
import javafx.scene.layout.HBox;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.stage.Stage;

public class Ch14DisplayThreeCards extends Application {

@Override
public void start(Stage primaryStage) {

    ArrayList<String> cards = new ArrayList<>();

    for (int i = 0; i < 52; i++)
        cards.add(String.valueOf(i+1));

    java.util.Collections.shuffle(cards);

    ImageView viewCard1 = new ImageView(new Image(cards.get(0) + ".png"));
    ImageView viewCard2 = new ImageView(new Image(cards.get(1) + ".png"));
    ImageView viewCard3 = new ImageView(new Image(cards.get(2) + ".png"));

    HBox root = new HBox();

    root.getChildren().add(viewCard1);
    root.getChildren().add(viewCard2);
    root.getChildren().add(viewCard3);

    Scene scene = new Scene(root, 400, 500);

    primaryStage.setTitle("Display 3 Random Cards");
    primaryStage.setScene(scene);
    primaryStage.show();
}



}

没有足够的代表来包含图片,所以这里是错误的屏幕截图:http://i.stack.imgur.com/fiZpm.png

1 个答案:

答案 0 :(得分:2)

Image constructor期望指定URL,而不是文件系统路径。

执行此操作的最佳方法可能是从加载当前类的类加载器中获取URL,然后将其转换为String。您可以使用

获取此类网址
getClass().getResource(cards.get(0)+".png");

这基本上说&#34;构造一个URL,表示从加载此类&#34;的同一个地方加载的资源。因此,如果您的文件与类在同一个包中,它将起作用。如果从文件系统运行(即类作为文件加载),则会生成file://... URL。如果您运行捆绑为jar文件的应用程序,它将生成jar://... URL。您当然可以记录URL(或其String表单:见下文),并查看它给您的内容。这有助于调试您所看到的错误。

要获取网址的String形式,请在网址上调用toExternalForm()。所以你的最终代码可能如下:

ImageView viewCard1 = new ImageView(new Image(getClass().getResource(cards.get(0) + ".png").toExternalForm()));
ImageView viewCard2 = new ImageView(new Image(getClass().getResource(cards.get(1) + ".png").toExternalForm()));
ImageView viewCard3 = new ImageView(new Image(getClass().getResource(cards.get(2) + ".png").toExternalForm()));