我是编码的新手,特别是在java中,我尝试将JavaFx与场景构建器一起使用。我今天的问题是我用场景构建器完成了这个菜单:
当我运行它时,图像不显示。我尝试过我做过的其他场景,同样的问题。
这是我的主要:
package com.doki;
import java.io.IOException;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
public class MainRpg extends Application {
private Stage stage;
private BorderPane fenetre;
@Override
public void start(Stage stage) {
this.stage = stage;
this.stage.setTitle("Xar'Saroth");
initFenetre();
showMenu();
}
/**
* Initializes the root layout.
*/
public void initFenetre() {
try {
// Load root layout from fxml file.
FXMLLoader loader = new FXMLLoader();
loader.setLocation(MainRpg.class.getResource("view/Fenetre.fxml"));
fenetre = (BorderPane) loader.load();
// Show the scene containing the root layout.
Scene scene = new Scene(fenetre);
stage.setScene(scene);
stage.show();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* Shows the person overview inside the root layout.
*/
public void showMenu() {
try {
// Load person overview.
FXMLLoader loader = new FXMLLoader();
loader.setLocation(MainRpg.class.getResource("view/Menu.fxml"));
AnchorPane personOverview = (AnchorPane) loader.load();
// Set person overview into the center of root layout.
fenetre.setCenter(personOverview);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* Returns the main stage.
* @return
*/
public Stage getStage() {
return stage;
}
public static void main(String[] args) {
launch(args);
}
}
我的场景代码:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.ButtonBar?>
<?import javafx.scene.image.Image?>
<?import javafx.scene.image.ImageView?>
<?import javafx.scene.layout.AnchorPane?>
<AnchorPane prefHeight="600.0" prefWidth="900.0" xmlns="http://javafx.com/javafx/9.0.1" xmlns:fx="http://javafx.com/fxml/1">
<children>
<ImageView fitHeight="600.0" fitWidth="900.0" pickOnBounds="true" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<image>
<Image url="@../menuImage.jpg" />
</image>
</ImageView>
<ImageView fitHeight="186.0" fitWidth="489.0" layoutX="206.0" layoutY="343.0" pickOnBounds="true" preserveRatio="true" AnchorPane.bottomAnchor="150.0">
<image>
<Image url="@../xarSaroth.png" />
</image>
</ImageView>
<ButtonBar layoutX="295.0" layoutY="518.0" prefHeight="40.0" prefWidth="281.0" AnchorPane.bottomAnchor="50.0">
<buttons>
<Button mnemonicParsing="false" prefHeight="25.0" text="Continuer" />
<Button mnemonicParsing="false" prefHeight="25.0" prefWidth="134.0" text="Nouvelle Partie" />
</buttons>
</ButtonBar>
</children>
</AnchorPane>
我读过帖子:
Why isn't my background image being displayed in FXML
Images imported in scene builder is not getting displayed while executed in netbeans
但解决方案对我不起作用,或者我只是有点太愚蠢。
顺便提一下,当我启动时,我发现这个错误消息,我不认为这是问题:警告:使用版本8.0.1的JavaFX运行时加载版本9.0.1的JavaFX API的FXML文档
谢谢!
编辑:
我做了这个改变:((Image)loader.getNamespace().get("image1")).getException().printStackTrace(System.err);
它会造成这种错误。我明白有路径问题没有?
java.io.FileNotFoundException: C:\Users\Stagiaire ACI\Desktop\Java\XarSaroth\bin\com\doki\menuImage.jpg (Le fichier spécifié est introuvable)
at java.io.FileInputStream.open0(Native Method)
at java.io.FileInputStream.open(Unknown Source)
at java.io.FileInputStream.<init>(Unknown Source)
at java.io.FileInputStream.<init>(Unknown Source)
at sun.net.www.protocol.file.FileURLConnection.connect(Unknown Source)
at sun.net.www.protocol.file.FileURLConnection.getInputStream(Unknown Source)
at java.net.URL.openStream(Unknown Source)
at com.sun.javafx.iio.common.ImageTools.createInputStream(ImageTools.java:486)
at com.sun.javafx.iio.ImageStorage.loadAll(ImageStorage.java:311)
at com.sun.javafx.tk.quantum.PrismImageLoader2.loadAll(PrismImageLoader2.java:127)
at com.sun.javafx.tk.quantum.PrismImageLoader2.<init>(PrismImageLoader2.java:71)
at com.sun.javafx.tk.quantum.QuantumToolkit.loadImage(QuantumToolkit.java:720)
at javafx.scene.image.Image.loadImage(Image.java:1065)
at javafx.scene.image.Image.initialize(Image.java:807)
at javafx.scene.image.Image.<init>(Image.java:695)
at com.sun.javafx.fxml.builder.JavaFXImageBuilder.build(JavaFXImageBuilder.java:47)
at com.sun.javafx.fxml.builder.JavaFXImageBuilder.build(JavaFXImageBuilder.java:37)
at javafx.fxml.FXMLLoader$ValueElement.processEndElement(FXMLLoader.java:763)
at javafx.fxml.FXMLLoader.processEndElement(FXMLLoader.java:2823)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2532)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2409)
at com.doki.MainRpg.showMenu(MainRpg.java:56)
at com.doki.MainRpg.start(MainRpg.java:24)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(LauncherImpl.java:863)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.java:326)
at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
at java.lang.Thread.run(Unknown Source)
好吧,我认为当你在imageView中为图像的url路径编写代码时,你不应该参考IDE的文件树结构,而应该参考编译目录的文件树结构。
例如,这是错误的代码。我在IDEA中将“image”文件夹标记为资源文件夹。在场景构建器中预览时将显示图片,但在运行程序时不会显示该图片。
根据图片,网址路径绝对正确,但无法显示。为什么?我认为你应该参考编译目录“out”的文件树结构,你会明白的。
所以在这种情况下,您可以将代码更改为:
<image>
<Image url="@../desk.jpg" />
</image>
虽然它无法在场景构建器中预览,但它仍然有效。
以下代码也有效,因为“BallGame”是根目录:
<image>
<Image url="@/desk.jpg" />
</image>
另一种方法,在编译之前和之后保持相同的形式。您可以将图像文件夹放在src文件夹中。例如;
它也有效。