我正在完成我的第一个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
答案 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()));