2016-10-26 23 views
1

私はJavaFXで新しくなっています。したがって、2つのコントローラ間でデータを共有する際には助けが必要です。私はのmenuItem visluga_vid.setOnActionでクリックすると新しいmdi windowsが開いているコントローラ間のjavafx通信

@FXML 
Label labelLabel; 

@FXML 
MenuItem sbor; 

@FXML 
MenuItem alim_poluch; 

@FXML 
MenuItem paragraphs; 

@FXML 
MenuItem poluch_cat; 

@FXML 
MenuItem visluga_vid; 


@FXML 
AnchorPane menuPane; 


@FXML 
MDICanvas mdiCanvas; 

@FXML 
Tab tabOne; 

@FXML 
VislugaVidController vid; 

@FXML 
Tab tabTwo; 

@FXML 
public void initialize() { 

    MDICanvas mdiCanvas = new MDICanvas(MDICanvas.Theme.DEFAULT); 
    menuPane.getChildren().add(mdiCanvas); 

    AnchorPane.setBottomAnchor(mdiCanvas, -1d); 
    AnchorPane.setLeftAnchor(mdiCanvas, 0d); 
    AnchorPane.setTopAnchor(mdiCanvas, 0d);//Button place 
    AnchorPane.setRightAnchor(mdiCanvas, 0d); 


    sbor.setOnAction(new EventHandler<ActionEvent>() { 
     public void handle(ActionEvent event) { 
      Stage stage = new Stage(); 
      AnchorPane pane = null; 
      try { 
       pane = FXMLLoader.load(getClass().getResource("/fxml/spr_pocht_sbor.fxml")); 
      } catch (IOException e) { 
       System.err.print("Can't open the resource file"); 
       e.printStackTrace(); 
      } 
      stage.setTitle("Почтовый сбор для перевода алиментов"); 
      stage.setResizable(false); 
      Scene scene = new Scene(pane, 600, 450); 
      stage.setScene(scene); 
      stage.show(); 
     } 
    }); 

    alim_poluch.setOnAction(new EventHandler<ActionEvent>() { 
     public void handle(ActionEvent event) { 
      Stage stage = new Stage(); 
      AnchorPane pane = null; 
      try { 
       pane = FXMLLoader.load(getClass().getResource("/fxml/spr_alim_poluch.fxml")); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

      stage.setResizable(false); 
      stage.setTitle("Справочник получателей алиментов"); 
      Scene scene = new Scene(pane, 800, 640); 
      stage.setScene(scene); 
      stage.show(); 
     } 
    }); 

    paragraphs.setOnAction(new EventHandler<ActionEvent>() { 
     public void handle(ActionEvent event) { 
      Stage stage = new Stage(); 
      AnchorPane pane = null; 
      try { 
       pane = FXMLLoader.load(getClass().getResource("/fxml/paragraf.fxml")); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

      stage.setResizable(false); 
      stage.setTitle("Параграф назначения денежных средств"); 
      Scene scene = new Scene(pane, 300, 450); 
      stage.setScene(scene); 
      stage.show(); 
     } 
    }); 

    poluch_cat.setOnAction(new EventHandler<ActionEvent>() { 
     public void handle(ActionEvent event) { 
      Stage stage = new Stage(); 
      AnchorPane pane = null; 
      try { 
       pane = FXMLLoader.load(getClass().getResource("/fxml/poluch_cat.fxml")); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

      stage.setResizable(false); 
      stage.setTitle("Категории получателей"); 
      Scene scene = new Scene(pane, 600, 450); 
      stage.setScene(scene); 
      stage.show(); 
     } 
    }); 

    visluga_vid.setOnAction(new EventHandler<ActionEvent>() { 
     @Override 
     public void handle(ActionEvent event) { 


      AnchorPane content = null; 
      try { 
       content = FXMLLoader.load(getClass().getResource("/fxml/visluga_vid.fxml")); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      MDIWindow mdiWindow = new MDIWindow("1", new ImageView("/assets/WindowIcon.png"), "Виды выслуг", content); 
      Button buttonMaximize = mdiWindow.getBtnMaximize(); 
      buttonMaximize.setDisable(true); 
      mdiWindow.setMaxSize(350, 450); 
      mdiWindow.setBtnMinimize(buttonMaximize); 
      mdiCanvas.addMDIWindow(mdiWindow); 


     } 
    }); 


} 

は、私はシンプルなメニューがあり、単純なウィンドウを持っています。その後、別のウィンドウをmdi windowから開きたいと思います。 MdiWindowsは親(MDICanvas)を持ち、MDICanvasは親 - AnchorPaneを持っています。 MDIWIndowsにはそれ自身のコントローラーとfxmlファイルがあります。

public class VislugaVidController { 

    @FXML 
    TableView vislugaVidTable; 

    @FXML 
    TextField naim_vislugaField; 

    @FXML AnchorPane menuPane; 

    @FXML 
    public void initialize() { 

     //main.init(this); 



     vislugaVidTable.setOnMousePressed(event -> { 

      if (event.isPrimaryButtonDown() && event.getClickCount() == 2) { 
        System.out.println(vislugaVidTable.getSelectionModel().getSelectedItem()); 
        AnchorPane content = null; 
        try { 
         content = FXMLLoader.load(getClass().getResource("/fxml/visluga_nadb.fxml")); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 


        MDIWindow mdiWindow = new MDIWindow("1", new ImageView("/assets/WindowIcon.png"), "Надбавки", content); 
        Button buttonMaximize = mdiWindow.getBtnMaximize(); 
        buttonMaximize.setDisable(true); 
        mdiWindow.setMaxSize(350, 450); 
        mdiWindow.setBtnMinimize(buttonMaximize); 
        mdiCanvas.addMDIWindow(mdiWindow); 



       } 

     }); 

    } 


} 

新しいMDIWindowを開くために、私はMDIWindowControllerMainControllerからAnchorPaneとMDICanvasを共有するにはどうすればよいですか?

+1

データを保存し、異なるコントローラ間でモデルを共有するモデルを作成します。 MVCのロジックが欠けている重要な部分です。 – Blip

+0

'getter'メソッドをコントローラに追加してコントローラのインスタンスに呼び出すことができます。素晴らしいアプリケーションを構築するのに役立つ' Model View Controller Pattern '(MVC)を学ぶべきです。 – GOXR3PLUS

+0

@Blipがhttp://stackoverflow.com/questions/32342864/applying-mvc-with-javafxへの回答を示すように、JavaFXでMVCを使用してコントローラ間でデータを共有する簡単な例については、 Eiriniの答えにリンクされた[afterburner.fx](http://afterburner.adam-bien.com/)フレームワークは、同じモデルインスタンスをコントローラに渡すための単純化されたメカニズムを提供します。 –

答えて

0

通常「私は2つのコントローラの間で何かを共有する方法」という質問への答えは「は、サービスを使用する」です。あなたがそれについて考えるなら、データを渡す必要があります。それは何らかの形でコントローラー間で保持されます。javaFxの世界ではモデルでなければなりません。

作成する各.fxmlファイルは、コントローラまたはプレゼンターが1人だけ処理する必要があります。 .fxmlビューは、あなたのアプリケーションのモジュールとしてあなたのコントローラと組み合わされていると考えてください。これは再利用性を提供します。アプリケーションは、1つまたは複数のモジュールで構成されている必要があります。

the afterburner fxもチェックアウトすることをお勧めします。この例では、異なるモジュールが互いにどのように通信するかを実際に見ることができます。

+0

あなたが投稿したリンクがどのように問題解決に役立つか説明できますか? – Blip

+0

MVFをjavaFXの用語で理解するための推奨事項としてリンクを投稿しました。 OKアフターバーナーはさらにDIを使いますが、私はこの例が本当に役に立つと思います。少なくともそれは私が理解するのを助けました。私の見解では、コントローラーを別のコントローラーに渡すときに問題が始まります。アプリケーションが成長したらどうなりますか? –

+0

@Blipこれは、これらのタイプのアプリケーションを書く際の一般的な進化です。まず、コントローラ間で通信する必要があることが分かります。その後、(しばらくして)これを実行する最善の方法を発見すると、更新。そのモデルインスタンスを実際に共有する仕組みが煩雑になり、DIフレームワークが痛みをかなり軽減することがわかります。 –