2017-01-16 2 views
1

Есть ли способ сохранить фигуры и макеты в javafx во внешний файл. Которые затем могут быть восстановлены позднее. Я пробовал следующие видеоролики YouTube, и я знаю, как я мог сохранять/загружать файлы с полями «Текст/Int». Однако мне нужен способ загрузки последнего сохраненного макета.JavaFX - Сохранение/Загрузка - Формы/Макеты

Например, я хочу, чтобы сохранить многоугольник, я создал следующий класс:

import javafx.scene.shape.Polygon; 

public class saveFile implements java.io.Serializable { 
    private static final long serialVersionUID = 1L; 
    public Polygon fp; 
    } 

Resource Manager Класс:

import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 
import java.io.Serializable; 
import java.nio.file.Files; 
import java.nio.file.Paths; 

public class ResourceManager { 

public static void save(Serializable data, String fileName) throws Exception { 
    try (ObjectOutputStream oos = new ObjectOutputStream(Files.newOutputStream(Paths.get(fileName)))) { 
     oos.writeObject(data); 
    } 
} 

public static Object load(String fileName) throws Exception { 
    try (ObjectInputStream ois = new ObjectInputStream(Files.newInputStream(Paths.get(fileName)))) { 
     return ois.readObject(); 
    } 
} 
} 

Controller Класс:

//Field 
private Polygon fp = new Polygon(); 
@FXML 
private AnchorPane container2; 

//Methods 
public void saveLayout(){ 
    saveFile data = new saveFile(); 
    data.fp = fp; 
    try { 
     ResourceManager.save(data, "savefile"); 
    } catch (Exception e) { 
     System.out.println("Error"); 
    } 
} 

public void loadLayout() throws IOException { 
    try { 
     saveFile data = (saveFile) ResourceManager.load("save"); 
     container2.getChildren().add(data.fp); 
    } 
    catch(Exception e){ 
     System.out.println("Error"); 
    } 
} 

I знаю, что метод загрузки полностью ошибочен прямо сейчас, однако я думал, что было бы хорошо его предоставить.

Редактировать: e.printStackTrace(); вернулся:

java.io.NotSerializableException: javafx.scene.shape.Polygon 
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184) 
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548) 
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509) 
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432) 
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178) 
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348) 
at Model.ResourceManager.save(ResourceManager.java:14) 
at Controller.NewLayoutController.saveLayout(NewLayoutController.java:191) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:497) 
at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:71) 
at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:497) 
at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:275) 
at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1771) 
at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1657) 
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86) 
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238) 
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74) 
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49) 
at javafx.event.Event.fireEvent(Event.java:198) 
at javafx.scene.control.MenuItem.fire(MenuItem.java:462) 
at com.sun.javafx.scene.control.skin.ContextMenuContent$MenuItemContainer.doSelect(ContextMenuContent.java:1405) 
at com.sun.javafx.scene.control.skin.ContextMenuContent$MenuItemContainer.lambda$createChildren$343(ContextMenuContent.java:1358) 
at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218) 
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80) 
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238) 
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191) 
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74) 
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54) 
at javafx.event.Event.fireEvent(Event.java:198) 
at javafx.scene.Scene$MouseHandler.process(Scene.java:3757) 
at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485) 
at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762) 
at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494) 
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:352) 
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:275) 
at java.security.AccessController.doPrivileged(Native Method) 
at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$355(GlassViewEventHandler.java:388) 
at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389) 
at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:387) 
at com.sun.glass.ui.View.handleMouseEvent(View.java:555) 
at com.sun.glass.ui.View.notifyMouse(View.java:937) 
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) 
at com.sun.glass.ui.win.WinApplication.lambda$null$149(WinApplication.java:191) 
at java.lang.Thread.run(Thread.java:745) 
+0

и какова точная проблема? Ваш код должен работать как есть. – Enigo

+0

Проблема заключается в том, что когда я нажимаю кнопку «Сохранить» в программе, она возвращает исключение «Ошибка». Он не сохраняет его во внешний файл. – TheBeliever12

+0

А что такое исключение? – Enigo

ответ

2

Проблема заключается в том, что Polygon класс не реализует интерфейс Serializable, поэтому он не может быть сериализовать стандартными средствами Java. Для Polygon класса было бы достаточно, чтобы только сохранить свои очки, чтобы получить его позже и построить новый Polygon от него, и вы можете сделать это так:

public static void save(ObservableList<Double> points, String fileName) throws Exception { 
    try (ObjectOutputStream oos = new ObjectOutputStream(Files.newOutputStream(Paths.get(fileName)))) { 
      oos.writeObject(new ArrayList<>(points)); 
    } 
} 

, а затем прочитать его обратно:

public static ObservableList<Double> load(String fileName) throws Exception { 
    try (ObjectInputStream ois = new ObjectInputStream(Files.newInputStream(Paths.get(fileName)))) { 
     List<Double> list = (List<Double>) ois.readObject(); 
     return FXCollections.observableList(list); 
    } 
} 

и тогда вы можете построить новый полигон, как так:

ObservableList<Double> points = ResourceManager.load("save"); 
Polygon polygon = new Polygon() 
polygon.getPoints().addAll(points); 
+0

И еще раз, для более сложной сериализации вы должны взглянуть на более сложные инструменты для него (например, gson). Для Polygon это довольно просто, но такого подхода может быть достаточно для других форм, которые вам нужно сериализовать. – Enigo

+0

Честно говоря, ты спас меня. Спасибо большое! Это сработало отлично !!!!! : D – TheBeliever12

+0

Приятно слышать это) – Enigo