2013-02-05 3 views
9

私は自分の足をjavafxで濡らしています。これは私がやっていることです。シンコントローラ

FXML Views 
DI Controllers 
Weld-SE Managed Services and Models 
Trying to confine UI to FXML 
Trying keep the Controllers thin 

問題:UIをコーディングしようとしますが

、ほとんどの静的なUIは、FXMLの内側に閉じ込められています。しかし、自分自身が追加、削除、表示、隠し要素などを見つけるシナリオがあります。

私は自分自身がコントローラ内でこれをやっていると思います。コントローラのメソッドをfxで設定することで、特定のアクション/イベント。このコードはすべて、動的UIの構築/操作を扱い、ビューレイヤーに属しています。しかし、それはコントローラを脂肪にしてしまいます。

javafxはjavascriptとの統合を提供します。これは、そのビューのマンピュレーションコードを抽象化するための1つの方法です。しかし、これはミックスに完璧なjavascriptを追加しません。

シンコントローラパラダイムを壊さないように、コードをJavaまたはfxmlで抽象化するにはどうすればよいですか?

EDIT

@assylias合意

、私はこれとJavaクラスとFXMLは一緒に再利用可能なウィジェットになることをこの方法について考えています。しかし、それをFXMLにどのように組み込むのですか? FXMLはコントローラー以外何も理解していません。私は、このビュークラスをfx:controllerを使用してfxmlに配線し、それにコントローラ名を付けないとします。だから私はこれのようなものを持っている。

enter image description here

このビュークラスでは、ビューの操作コードが、何もしています。次に、別のコントローラクラスを作成します。しかし、私は何とかフォームデータをこのコントローラに入力すると予想されます。これは、ユーザーがフォームを送信したときにのみ発生します。だから、どういうわけかjavafxに、UI操作要求/イベントが実際のデータ操作要求/イベントと異なることを伝える必要があります。

あなたの考えは、冗長であれば申し訳ありません。私はできるだけ少ない言葉でそれを明確にしようとしました。

+1

動的な処理を行うJavaビュー(コントローラーの第1レイヤー)と最初のものを拡張する適切なJavaコントローラーを持つことができます。 (それがうまくいくかどうか、ちょうどアイデア)。 – assylias

+1

MVCパターンを適用しようとしたようですが、ほとんどのシナリオでは必要ありません。 Java FXのコントローラは、あなたがすでに把握しているようにMVCパターンのコントローラではありません(あなたのダイアグラムのView Class)。では、どのような問題を解決したいですか?サンプルを提供できますか? – Puce

+0

私は自分のコードをより良く整理し、コードの乱れを避ける方法を見つけたいと考えていました。私は他の人が私の前でこの問題の方法を見つけなければならないと思い、回避策を見つけたに違いないと思った。 – ShaggyInjun

答えて

0

ビュー操作コードをメインクラスに入れるのはどうですか?

メインクラス:

public class SampleJavaFXApp extends Application{ 

public static void main(String[] args) { 
    launch(args); 
} 
@Override 
public void start(Stage primaryStage) throws IOException { 
    FXMLLoader loader = new FXMLLoader(getClass().getResource(
      "SampleUI.fxml")); 
    Parent root = (Parent) loader.load(); 
    Controller controller = loader.getController(); 
    viewManipulationLogic(controller); 
    primaryStage.setScene(new Scene(root)); 
    primaryStage.show();  
} 
     // view manipulation logic 
private void viewManipulationLogic(Controller controller) { 
controller.getBlueButton().setOnAction(new EventHandler<ActionEvent>() { 
     @Override 
     public void handle(ActionEvent arg0) { 
      System.out.println(" I am just about button!"); 
     } 
    }); 
} 

コントローラー:

public class Controller implements Initializable { 
    @FXML 
    private Button blueButton; 
    public Button getBlueButton() { 
     return blueButton; 
    } 
@Override 
    public void initialize(URL arg0, ResourceBundle arg1) { 
     //real data manipulation 
} 
} 

短所:あなたはコントローラクラスで、uが操作したいすべてのノードのためのゲッターを必要としています。

+0

私はMainClassでもそれが外れていると思いますが、1つのビューを持つ単純なアプリケーションではうまくいくかもしれません。しかし、複数のFXMLファイルを持っていると、これは手を抜いてしまいます。 – ShaggyInjun

1

私はこれに最も簡単な解決策は、FXMLで指定されたコントローラがビューコントローラであることを覚えておくことだと思います。従来のMVCコントローラコードやビジネスロジックを含まないために、ビューを変更および更新するためのコードを格納するのが目的です。

例えば、私が現在取り組んでいるプロジェクトでは、Akka ActorsでJavaFXを使用しています。アプリケーションはスカラーで書かれています。 JavaFXビューコントローラには、ビューを変更するために必要なコードが含まれています。 1つの画面にログインフォームが含まれています。ユーザーがログインボタンをクリックすると、View Controllerは単にユーザー名とパスワードを含むメッセージを作成し、そのメッセージをビジネスロジックを担当するアクタに送信します。そのアクタがエラーがあると判断した場合、メッセージはView Controllerに返され、View Controllerは画面上でどのような更新が必要かを決定できます。

私は、JavaFXでakkaアクタを使用すると、少なくとも2つの理由でアプリケーションのコーディングが大幅に簡素化されることがわかりました。

  1. アクターシステムを使用すると、アクター間でメッセージを送信する必要があるため、プレゼンテーションコードとビジネスコードの間に自然な境界があります。前後に渡されるメッセージは、この自然の境界を形成します。
  2. アクターを使用すると、作業の複雑さがスレッド/タスクで完全に置き換えられます。これは、長時間実行されているプロセスに対してjavafx.concurrent.Taskをコード化する必要性を完全に排除します。