用于图像URL的FXML变量标记

问题描述 投票:0回答:1

我正在一个项目中,我需要在特定目录的多个图像之间切换,以用作程序的背景。不幸的是,我无法将所有图像路径都硬编码为fxml作为url,并无法使用fxids在每个图像路径之间进行切换,因为我的图像太多,并且整个星期都会添加新图像。我创建了一个fxid,该fxid链接到保存图像路径的特定变量。该变量是一个URL,其路径为“ @ .. / images / Planets / image1.png”。 fxml正确加载了按钮元素,但未能加载与给定变量关联的链接的url。我使用了确切的网址,并将其直接放入fxml中,该fxml可以正确显示一个图像。我需要帮助以确保在fxml中正确识别url变量。下面是我的fxml代码。

<AnchorPane fx:id="AP" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="main.java.controllers.PlanetController">
   <children>
      <fx:define>
      <URL fx:id="image"/>
      </fx:define>
      <ImageView fitHeight="721.0" fitWidth="1289.0">
         <image>
            <Image url="$image"/>
         </image>
      </ImageView>
      <Button fx:id="map" layoutX="709.0" layoutY="685.0" mnemonicParsing="false" onAction="#handleNext" text="Map" />
      <Button layoutX="428.0" layoutY="690.0" mnemonicParsing="false" text="Market" />
   </children>
</AnchorPane>

这里是加载fxml文档的javafx代码。忽略rootController。它将场景设置为vBox。

@FXML
private URL image;

@FXML
public void handleTravelToRegion() {
image = new URL("@../images/Planets/image4.jpg");
try {
            URL url = this.getClass().getResource(getScene("destinationPlanet"));
            FXMLLoader loader = new FXMLLoader(url);
            Node scene = loader.load();
            rootController.setScene(scene);
        } catch (IOException e) {
            e.printStackTrace();
        }
}

[请帮助我获取<Image url="$image"/>以加载图像变量。您的帮助将不胜感激。

image url javafx fxml
1个回答
0
投票

[如果其他人在将节点设置为fxml文档中的变量时遇到困难,请转到控制器类中的initialize方法,然后将所需的节点添加到fxml文档中链接的窗格中。就我而言,我在fxml文档中使用了anchorPane,并使用@FXML标记链接到了我的控制器类。我需要在锚定窗格中添加一个包含随机图像文件的ImageView节点。我需要做的就是在FXML initialize方法内添加节点,否则,将不会显示对场景的任何更改。下面是我的fxml文档和控制器类的最终结果:

<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.AnchorPane?>

<AnchorPane fx:id="ap" maxHeight="-Infinity" maxWidth="-Infinity"
        minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="main.java.controllers.PlanetController">

在控制器类中,我需要执行以下操作:

public class PlanetController implements Initializable {
private ImageView background = new ImageView();

@FXML
private AnchorPane ap = new AnchorPane();

public void initialize(URL url, ResourceBundle resourceBundle) {
    Random rand = new Random();
    File[] imageArray = new File("@../images/Planets/").listFiles();
    Image image = new Image(imageArray[rand.nextInt(imageArray.length)]
        .toURI().toString());
    background = new ImageView(image);
    ap.getChildren().add(background);
}

这是我需要做的所有工作才能使背景工作。

© www.soinside.com 2019 - 2024. All rights reserved.