2017-01-16 31 views
1

javafxの図形とレイアウトを外部ファイルに保存する方法はありますか?後で復元することができます。私はYouTubeの動画を次のように試してみました。どのように "Text/Int"フィールドでファイルを保存/読み込むことができるか分かりました。しかし、最後に保存したレイアウトをロードする方法が必要です。JavaFX - 保存/読み込み - 図形/レイアウト

import javafx.scene.shape.Polygon; 

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

リソースマネージャクラス::

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(); 
    } 
} 
} 

コントローラクラス:

//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

問題は、それが標準的なJavaの手段をシリアライズすることができない理由です、PolygonクラスはSerializableインタフェースを実装していないということです。

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); 
    } 
} 
、それは十分に後でそれを取得し、そこから新しい Polygonを構築し、あなたがこのようにそれを行うことができますするためにのみそのポイントを保存することでしょう Polygonクラスについては

そして、あなたはそうのような新しいポリゴンを構築することができます

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

もう一度、より複雑なシリアライゼーションを行うには、もっと複雑なツール(gsonのようなもの)を見てください。ポリゴンの場合は単純ですが、この方法ではシリアライズする必要がある他のシェイプで十分です。 – Enigo

+0

正直、あなたは私を救った。どうもありがとうございます!それは完璧に動作した!!!!! :D – TheBeliever12

+0

それを聞いてうれしい) – Enigo

関連する問題