2016-04-13 26 views
2

基本アプリケーションを持っています。おもちゃボックスのようなもので、シェイプをダブルクリックすると画面上でシェイプを移動させる以外は何もしません。それを前景に持っていく。私は、画面上の図形の現在の状態を保存し、彼らがいたとして、それらをアップロード持ってできるようにしたいjavafxの枠線枠に描かれたファイルにシェイプを保存する

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.control.Menu; 
import javafx.scene.control.MenuBar; 
import javafx.scene.control.MenuItem; 
import javafx.scene.control.SeparatorMenuItem; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.paint.Color; 
import javafx.scene.shape.Circle; 
import javafx.scene.shape.Rectangle; 
import javafx.scene.text.Font; 
import javafx.scene.text.Text; 
import javafx.stage.Stage; 

public class RandCMove extends Application 
{ 
    public static void main(String [] args) 
    { 
     launch(args); 
    } 
    public void start(Stage primaryStage) 
    { 
     BorderPane root = new BorderPane(); 

     MenuBar menuBar = new MenuBar(); 
     menuBar.prefWidthProperty().bind(primaryStage.widthProperty()); 


     Menu fileMenu = new Menu("File"); 
     MenuItem newMenuItem = new MenuItem("New"); 
     MenuItem openMenuItem = new MenuItem("Open"); 
     MenuItem saveMenuItem = new MenuItem("Save"); 
     MenuItem exitMenuItem = new MenuItem("Exit"); 

     fileMenu.getItems().addAll(newMenuItem,openMenuItem,saveMenuItem, 
    new SeparatorMenuItem(),exitMenuItem); 

     menuBar.getMenus().add(fileMenu); 

     Rectangle rect = new Rectangle(); 
     rect.setWidth(200); 
     rect.setHeight(200); 
     rect.setArcHeight(20); 
     rect.setArcWidth(20); 
     rect.setFill(Color.RED); 
     rect.setX(200); 
     rect.setY(100); 

     root.setTop(menuBar); 
     root.getChildren().add(rect); 

     Circle circle = new Circle(
      300,300,100); 

     Text text = new Text(150,150,"Text"); 
     Font phosphate = Font.font("Phosphate",150); 
     text.setFont(phosphate); 

     text.setTranslateY(circle.getBoundsInParent().getMinY()+10); 

     root.getChildren().add(text); 

     //Positions the circle under the rectangle 
     circle.setTranslateY(rect.getBoundsInParent().getMinY()+30); 
     root.getChildren().add(circle); 

     // Moves shapes depending on if the cursor on the particular shape 
     // Brings shape to the front using double click 
     root.setOnMouseMoved(e -> 
     { 
      if(rect.contains(e.getX(),e.getY())) 
       rect.setOnMouseDragged(f ->{ 
        rect.setX(f.getX()); 
        rect.setY(f.getY()); 
       }); 
       rect.setOnMouseClicked(f ->{ 
        if(f.getClickCount() >= 2) 
         rect.toFront(); 
       }); 
      if(circle.contains(e.getX(),e.getY())) 
        circle.setOnMouseDragged(f->{ 
        circle.setCenterX(f.getX()); 
        circle.setCenterY(f.getY());  
       }); 
       circle.setOnMouseClicked(f ->{ 
        if(f.getClickCount() >= 2) 
         circle.toFront(); 
       }); 
      if(text.contains(e.getX(),e.getY())) 
       text.setOnMouseDragged(f ->{ 
        text.setX(f.getX()); 
        text.setY(f.getY()); 
        }); 
       text.setOnMouseClicked(f ->{ 
        if(f.getClickCount() >= 2) 
         text.toFront(); 
       }); 

     }); 

     Scene scene = new Scene(root,600,600); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 
} 

- 「新しい、 『オープン』、 『保存』メニュー項目を持つメニューもあります「オープン」。

を押した時に、私は、誰もがいくつかのガイダンスを提供したり、正しい方向に私を指すことができ、これに関する有益な何かを見つけるように見えることはできません?どのような援助がいただければ幸いです!

答えて

2

アプリケーションは、好みや設定が必要ですjava.util.prefsパッケージは、アプリケーションがユーザーおよびシステムのprを格納および取得する方法を提供しますエフェクションと構成データ。データは実装依存のバッキングストアに永続的に格納されます。設定ノードのツリーは、ユーザー設定用とシステム設定用の2つのツリーに分かれています。で

より:

http://docs.oracle.com/javase/8/docs/technotes/guides/preferences/

0

これは非自明な課題です。 (あなたがシリアライザを自分でコーディングする必要があります)FXMLにあなたの形状をシリアル

  1. :私はここでそれ用のコードを提供する予定が、唯一の一般的なアプローチの概要ではないのです。
  2. ユーザーがシェイプを編集するたびに、FXMLに再度シリアル化し、FXMLをpreference(Frank Fotangsの回答に概説されているように)として保存します。
  3. ユーザーが最初にアプリケーションを開くときは、現在の図形のFXMLを含む現在の設定を読み込み、FXMLLoaderを使用して読み込みます。

同じ方法を使用して、シリアル化されたデータを優先度に書き込む代わりに、FileChooserで選択されたファイルの場所に書き込むことができます。

私は実際にFxmlではなくFX方法を使用します。

解決しなければならない問題を誤解していると思います。これを行うための「FX方法」はありません。

あなたの問題は、コアJavaFX APIが完全な実装を提供していないシーングラフからノードを直列化および逆直列化する必要があることです。

JavaFX APIを使用してJavaFXを使用してシーングラフを作成すると、シーンのインメモリ表現であり、プログラムの実行中にのみ使用できます。そのシーンをファイルに保存しておけば、アプリケーションをシャットダウンしたときにシーンを表すデータがどこかに保存されるようにすることができます。その後、ユーザーがアプリケーションのバックアップを再び開始すると、ファイルからデータを読み取り、メモリ内のシーンを再作成する必要があります。これを実行する唯一の方法は、必要に応じてオブジェクトをストレージにシリアル化し、アプリケーションが再びバックアップを開始するときにストレージからオブジェクトを逆シリアル化することです。概念的なプロセスを理解するには、serializationに関するウィキペディアの記事を読んでください。

シリアライズされたフォーマットにFXMLを使用する必要はありません。JSONやYAMLなどの他のフォーマットや、Jacksonなどのシリアライゼーションサポートライブラリを使用できます。しかし、FXMLは、JavaFXがFXMLLoaderと一緒に出荷されるため、最も論理的なフォーマットと思われます。シリアライズされたデータ(シーンを表すFXMLファイル)をインメモリ構造に転送するための使いやすいAPIを提供します(シーングラフ)、load methodへの簡単な呼び出しを介して。

JavaFX APIにはFXMLLoaderが付属しているだけで、対応するクラス(FXMLSaverなど)は搭載されていません。メモリ内の構造シーングラフ)とそれからシリアル化されたデータ(FXMLファイル)を作成します。だからあなたは自分でそのような論理を書く必要があります。

SceneBuilderはオープンソースのプロジェクトで、シーングラフをFXMLファイルに保存するロジックが含まれています。たとえば、SceneBuilderのソースでfind source code for an FXMLSaverとすることができます。おそらく、そのコードを使用したり適応させたりして、シーングラフオブジェクトをシリアル化されたフォーマットに保存することができます。シーンビルダアプリケーションを使用してシーンを作成して保存するのではなく、SceneBuilderソースコードを自分のアプリケーションに組み込んでシーンを作成して保存することになります。

+0

私はFxmlではなくFXのやり方をするのが本当に好きです。それは同じアプローチで可能ですか? – Treeno1

+0

私はあなたが意味することを理解していません。 「FX方法」とは何ですか? – jewelsea

+0

私はそれを説明する最善の方法を推測します - http://www.javafxtutorials.com/tutorials/switching-to-different-screens-in-javafx-and-fxml/。基本的には、シーンビルダーを使用するFXMLまたはjavaFXをコーディングするだけで、2つのアプローチを使用してフレームを切り替えることについてのデモです。 FXMLの話を聞くとすぐに、シーンビルダーの使用を前提としていました。本当にFXMLの私の唯一の経験でした。私は残念なことにあまり良くはありません。その例に似ています。 FXMLを使わずにコードを書く方法はありますか? – Treeno1