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 をミックスに追加することになります。

Thin Controller Paradigm を壊さないように、Java または fxml でコードを抽象化するにはどうすればよいですか?

編集

@assylias

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

ここに画像の説明を入力

このビュー クラスにはビュー操作コードしかありません。次に、別のコントローラー クラスを作成します。しかし、フォーム データをこのコントローラーに何らかの方法で入力することを期待します。これは、ユーザーがフォームを送信したときにのみ発生します。ある意味、UI操作のリクエスト・イベントと実際のデータ操作のリクエスト・イベントが違うことをjavafxにどうにかして伝える必要があります。

あなたの考え、冗長だったらごめんなさい。できるだけ短い言葉でそれを明確にしようとしました。

4

2 に答える 2

0

ビュー操作コードを Main Class に入れてみませんか?

メイン クラス :

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

短所:コントローラークラスで、操作したいすべてのノードのゲッターが必要です。

于 2013-02-05T21:05:37.657 に答える