FXML: альтернативное использование
Можно ли использовать FXML для загрузки объектов без графического интерфейса в память? Например, я создаю простое "голосующее" программное обеспечение для моей школы. Все, что ему нужно - это список "факультативных должностей" и соответствующих кандидатов, а также другие вещи, такие как наборы "свойств" должностей и кандидатов.
Я хочу записать данные в файл FXML, а затем загрузить их, используя FXMLLoader
,
1 ответ
Решение
Да, FXML можно использовать для создания произвольных объектов. Вы определяете объекты так же, как и любой объект с графическим интерфейсом. Вы просто должны убедиться, что:
- Вы соблюдаете соглашения о присвоении имен в Java
- Если у вас есть сеттер с именем
setField
тогда в FXML атрибут будетfield="value"
- Если вы не используете свойства JavaFX, синтаксис привязки не будет работать
- Если у вас нет установщика, но вы можете установить поле с помощью конструктора (или у вас нет конструктора по умолчанию), тогда вы должны аннотировать параметры конструктора с помощью
NamedArg
Вот небольшой пример.
Animal.java
package com.example;
import javafx.beans.NamedArg;
public class Animal {
private final String name;
private boolean housePet;
public Animal(@NamedArg("name") String name) {
this.name = name;
}
public String getName() {
return name;
}
public boolean isHousePet() {
return housePet;
}
public void setHousePet(boolean housePet) {
this.housePet = housePet;
}
@Override
public String toString() {
return "Animal[name=" + name + ", housePet=" + housePet + "]";
}
}
Main.java
package com.example;
import java.io.IOException;
import java.util.List;
import javafx.fxml.FXMLLoader;
public class Main {
public static void main(String[] args) throws IOException {
List<Animal> list = FXMLLoader.load(Main.class.getResource("Main.fxml"));
list.forEach(System.out::println);
}
}
Main.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import com.example.Animal?>
<?import java.util.ArrayList?>
<ArrayList xmlns="http://javafx.com/javafx/10.0.2" xmlns:fx="http://javafx.com/fxml/1">
<Animal name="Cat" housePet="true"/>
<Animal name="Dog" housePet="true"/>
<Animal name="Bear" housePet="false"/>
<Animal name="Wolf" housePet="false"/>
<!-- Another way of declaring an Animal -->
<Animal>
<name>Snake</name>
<housePet>true</housePet>
</Animal>
</ArrayList>
Бег Main
печатает следующее:
Animal[name=Cat, housePet=true]
Animal[name=Dog, housePet=true]
Animal[name=Bear, housePet=false]
Animal[name=Wolf, housePet=false]
Animal[name=Snake, housePet=true]