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

Моя цель - создать приложение, которое действует как «редактор» для xml -файлов. Пользовательский интерфейс был сделан JavaFx. Существует строка меню, в которой пользователь может «открыть» четко определенный xml -файл, который загружается Jaxb и хранится как переменная stati c в классе Config. Теперь пользовательский интерфейс должен показывать атрибуты xml -структуры. Пользователь должен иметь возможность редактировать эти значения, например, в текстовых полях. Я хочу использовать «двунаправленное связывание данных» для этого. В конце концов, пользователь должен щелкнуть «сохранить», и текущее состояние модели xml, подлежащей возражению, должно быть снова сохранено в файл xml.

Использование Jaxb и создание пользовательского интерфейса через SceneBuilder работало нормально. Но теперь у меня есть проблемы с привязкой указанных полей c от xml -модели к элементам пользовательского интерфейса.

Это то, что я сделал до сих пор (основываясь на минимальном примере):

Мой указанный xml -файл:

<person>
    <name>ThatIsMyName</name>
</person>

Соответствующий класс xml -модели:

@XmlRootElement(name = "person")
public class Person {
    @XmlElement(name="name")
    private String name;

    public String getName() { return name; }
    public SimpleStringProperty getNameProperty() { return new SimpleStringProperty(name); }

    public void setName(String name) { this.name = name; }
}

Класс Config содержит Xml - Данные после загрузки через Jaxb. Во время выполнения должен быть только один экземпляр «Person»:

public class Config {

    private static final Logger LOG = Logger.getLogger(Config.class.getName());
    private static Person person = null;

    public static void load(String filePath) {
        try {
            person = XMLMarshaller.demarshal(filePath);
            LOG.log(Level.INFO, "File loaded: {0}", filePath);
        } catch (Exception e) {
            LOG.log(Level.WARNING, "Exception: ", e);
        }
    }

    public static Person getPerson() {
        return person;
    }
}

Соответствующий файл f xml содержит запись:

<TextField id="tf_name" fx:id="tf_name" />

И, наконец, класс контроллера:

public class MainController {
    @FXML
    private TextField tf_name;

    public void initialize() {
        // This does not work
        tf_name.textProperty().bindBidirectional(Config.getPerson().getNameProperty());
    }
}

Теперь задача состоит в том, чтобы «связать» поле пользовательского интерфейса «tf_name» с переменной «name» класса Person двунаправленным способом. Мой вопрос: как я могу связать эти две переменные «хорошим способом», когда я знаю, что объект «person» и, следовательно, переменная «name» создаются только во время выполнения.

Мои подходы:

(1) Выполнение этого в методе initialize () в классе Controller с помощью кода в классе контроллера не сработало. Мне пришлось создать фиктивный объект для getPerson (), потому что он не существует в начале запуска программы (Результат: NPE).

(2) И даже если я создам пустой фиктивный объект и "перезапишу" модель xml через XMLUnmarshaller, не будет никакого NPE, но я не вижу обновления между "name" и " tf_name ".

Спасибо за любые советы.

С уважением

Alex

...