F XML Пометка переменных для URL изображений - PullRequest
0 голосов
/ 17 февраля 2020

Я работаю над проектом, в котором мне нужно переключаться между несколькими изображениями из указанного каталога c, чтобы использовать его в качестве фона для моей программы. К сожалению, я не могу жестко закодировать все пути к изображениям в f xml в виде URL-адресов и переключаться между ними с помощью fxids, потому что у меня слишком много изображений, и новые изображения добавляются в течение недели. Я создал один fxid, который связан с указанной c переменной, которая содержит путь к изображению. Эта переменная является URL-адресом, который имеет путь "@ .. / images / Planets / image1.png". f xml правильно загружает элементы кнопки, но не может загрузить связанный URL, связанный с данной переменной. Я взял точный URL и поместил его прямо в f xml, который правильно отображал одно изображение. Мне нужна помощь, чтобы переменная url была правильно распознана в f xml. Ниже мой код f xml.

<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>

Вот код javafx, который загружает документ f xml. Не обращайте внимания на 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"/> для загрузки переменной изображения. Ваша помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 23 февраля 2020

Если у кого-то еще возникли проблемы с настройкой узлов в качестве переменных в их документе f xml, go укажите метод инициализации в вашем классе контроллера и добавьте нужный узел на панель, связанную в вашем f xml. документ. В моем случае я использовал anchorPane в своем документе f xml, который я связал с моим классом контроллера, используя тег @ F XML. Мне нужно было добавить узел ImageView, содержащий случайный файл изображения, в мою область привязки. Все, что мне нужно было сделать, это добавить узел в метод инициализации F XML, иначе изменения в моей сцене не будут отображаться. Ниже приведен окончательный результат моего класса документов и контроллеров f xml:

<?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);
}

Это было все, что я пришлось сделать, чтобы фоны работали.

...