JavaFXでMVCの練習を兼ねて簡単なアプリを作っているのですが、うまく作れません。
特にViewの入力をControllerに伝えるのが上手くできません。

以下が今作っているソースですが、View内でsetOnActionして、idと共にControllerへ渡すという方法をとってます。ただ、これだとViewがControllerのインスタンスを持っていないため、Controllrer側の受け取るメソッドをstaticにする必要があり、そこからModelのメソッドを呼ぶとstaticのものしか使えないという連鎖が起きてしまい困っています。

対応策としては、

  • ControllerのインスタンスをViewに渡す ・・・MVC的に...?
  • ControllerのコンストラクタでModelのインスタンスを作っておく ・・・static内で読んでいるので、結局詰んでる

というのを考えたのですが、よくよく考えると問題があるように感じました。
そもそもControllerに渡す方法自体怪しく思えてきました。
どなたかアドバイスを頂けないでしょうか。
よろしくお願いします。

ちなみに、今回はfxmlの使用予定はないです。
また、以下のコードは長いのでimportを省略してます。


MainController

public class MainController extends Application {
    public static Stage stage;
    @Override
    public void start(Stage primaryStage) {
        //初期設定
        primaryStage.setWidth(1000);
        primaryStage.setHeight(500);
        primaryStage.setTitle("タイトル");
        primaryStage.show();

        stage = primaryStage;
        new MainView(primaryStage);//画面表示
    }

    //ボタン処理
    public static void inButton(Event e, String id){
        switch (id) {
        case "0"://マイページ
            break;
        case "1"://計算ページ
            new CalController(stage);
            break;
     }

    public static void main(String[] args) {
      launch(args);
    }
}

MainView

public class MainView {
    EcMainView(Stage stage) {
        VBox root = new VBox();
        Button[] button = new Button[2];
        button[0] = new Button("マイページ");
        button[1] = new Button("計算");
        for(int i=0; i<2; i++){
            int tmpI = i;
            button[tmpI].setId(""+tmpI);
            button[tmpI].setOnAction(e ->EcMainController.inButton(e,button[tmpI].getId()));
        }
        root.getChildren().addAll(button);
        stage.setScene(new Scene(root));
    }
}

----------

CalController

public class CalController {
    private Stage stage;
    private CalView calView;
    private CalModel calModel;
    CalController(Stage stage) {
        this.stage = stage;
        calView = new CalView(stage);// 表示
        calModel = new CalModel();
    }
    public static void inButton(Event e, String id) {
        switch (id) {
        case "0":// ファイル選択
            /*----この辺が特に困る----*/
            CalModel.getFileList();
            break;
        case "1":// 編集
            break;
        }
    }
}

CalView

public class CalView {
    CalView(Stage stage){
        calViewMain(stage);
    }
    void calViewMain(Stage stage){
        VBox root = new VBox();
        Button[] button = new Button[2];
        button[0] = new Button("ファイル読み込み");
        button[1] = new Button("編集");
        //ボタンの共通初期設定
        for(int i=0; i<button.length; i++){
            int tmpI = i;
            button[i].setId(i + "");
            button[i].setOnAction(e -> CalController.inButton(e, button[tmpI].getId()));
        }
        HBox hBox = new HBox();
        hBox.getChildren().addAll(button);
        //表示
        root.getChildren().addAll(hBox);
        stage.setScene(new Scene(root));
    }
}

CalModel

public class CalModel {
    static String filePath = "data";
    public static String[] getFileList() {
        String[] list;
        readText();
        //リスト化
        return list;
    }
    public static String readText() {
        String text = "";
            //ファイル読み込み
        return text;
    }
}