Моя цель - создать приложение, которое действует как «редактор» для 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