7

Java FX で小さなドラッグ アンド ドロップ アプリケーションを開発しようとしています。ユーザーは、ボタン、メニュー、ラベルなどの JFX コンポーネントを特定の位置にドロップします。完了したら、このレイアウトを保存し、後でレイアウトを再度開いて、再び使用します。

ある位置にドロップされたすべてのオブジェクトに関する情報を保存することが重要です。

この目的のためにシリアル化を使用することにしました。しかし、JavaFX コンポーネントをシリアライズできません。Buttons、Scenes、Stages、JFXPane をシリアル化しようとしましたが、何も動作しないようでした (NotSerializableException を取得しました)。

すべてのコンポーネントを保存してから取得する方法について何か提案はありますか?

PS: FXML でいくつかのメソッドを見つけようとしましたが、成功しませんでした。

回答ありがとうございます:)

4

2 に答える 2

5

おっしゃる通り、JavaFX (2.1 以降) は Java Serializableインターフェイスを使用したコンポーネントのシリアル化をサポートしていないため、そのメカニズムを使用することはできません。

JavaFX は、FXMLLoader.load()メソッドを使用して FXML ドキュメントからデシリアライズできます。

しかし、秘訣は、既存のコンポーネントとステートを FXML に書き出す方法です。

現在、FXML シリアライゼーションを実行するプラットフォームから公開されているものはありません。どうやら、一般的なシーングラフを作成する => FXML シリアライザーは非常に複雑な作業です (私が知っている限り、このための公開サードパーティ API はありません)。シーングラフを繰り返し処理し、限られたコンポーネントと属性のセットに対して FXML を書き出すことはそれほど難しくありません。

于 2012-06-14T17:58:15.530 に答える
4

ユーザー コンポーネントをサーバー側に保存する主な目的が、ユーザーに同じインターフェイスを表示できるようにすることである場合、ユーザー コンポーネントについて必要なすべての説明情報を保存し、必要なときにユーザー インターフェイスを再構築するだけです。もう一度、保存された記述情報を使用しますか? これが基本的な例です:

/* 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> 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;
}
}
于 2012-06-14T15:57:42.940 に答える