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]
Другие вопросы по тегам