Сериализовать компоненты JavaFX

Я пытаюсь разработать небольшое приложение drag & drop под Java FX. Пользователь потеряет компоненты JFX, такие как кнопки, меню, ярлыки на определенных позициях. Когда закончите, он сохранит этот макет, а позже он снова откроет макет, и он будет использовать его снова.

Его важно хранить информацию обо всех объектах, которые упали в какой-либо позиции.

Я решил использовать сериализацию для этой цели. Но я не могу сериализовать компоненты JavaFX. Я попытался сериализовать кнопки, сцены, этапы, JFXPane, но ничего не работало (я получил NotSerializableException).

Любые предложения по сохранению всех компонентов, а затем их извлечению?

PS: Я пытался узнать какой-то метод с FXML, но мне это не удалось.

Большое спасибо за ваши ответы 🙂

Если основная задача сохранения пользовательских компонентов на стороне серверов – это возможность показать один и тот же интерфейс пользователю – почему бы не сохранить всю описательную информацию, необходимую вам о компонентах пользователей, и когда это необходимо – просто перестройте пользовательский интерфейс опять же, используя хранимую описательную информацию? Вот пример:

/* That is the class for storing information, which you need from your components*/ public class DropedComponentsCoordinates implements Serializable{ private String componentID; private String x_coord; private String y_coord; //and so on, whatever you need to get from yor serializable objects; //getters and setters are assumed but not typed here. } /* I assume a variant with using FXML. If you don't - the main idea does not change*/ public class YourController implements Initializable { List dropedComponentsCoordinates; @Override public void initialize(URL url, ResourceBundle rb) { dropedComponentsCoordinates = new ArrayList(); } //This function will be fired, every time //a user has dropped a component on the place he/she wants public void OnDropFired(ActionEvent event) { try { //getting the info we need from components String componentID = getComponentID(event); String component_xCoord = getComponent_xCoord(event); String component_yCoord = getComponent_yCoord(event); //putting this info to the list DropedComponentsCoordinates dcc = new DropedComponentsCoordinates(); dcc.setX_Coord(component_xCoord); dcc.setY_Coord(component_yCoord); dcc.setComponentID(componentID); } catch (Exception e) { e.printStackTrace(); } } private String getComponentID(ActionEvent event){ String componentID; /*getting cpmponentID*/ return componentID; } private String getComponent_xCoord(ActionEvent event){ String component_xCoord; /*getting component_xCoord*/ return component_xCoord; } private String getComponent_yCoord(ActionEvent event){ String component_yCoord; /*getting component_yCoord*/ return component_yCoord; } } 

Вы правы, JavaFX (начиная с версии 2.1) не поддерживает сериализацию компонентов с использованием интерфейса Java Serializable, поэтому вы не можете использовать этот механизм.

JavaFX может десериализоваться из документа FXML с помощью метода FXMLLoader.load () .

Трюк, однако, заключается в том, как написать свои существующие компоненты и указать на FXML?

Существует обсуждение форума по сериализации в FXML.

В настоящее время нет ничего публичного с платформы, которая выполняет сериализацию FXML. По-видимому, создание родового сценария => сериализатор FXML – довольно сложная задача (и для этого я не знаю публичного стороннего API). Было бы не слишком сложно перебирать сценарий и записывать FXML для ограниченного набора компонентов и атрибутов.

Interesting Posts
Давайте будем гением компьютера.