2016-10-26 13 views
1

저는 JavaFX에서 새로워졌습니다. 그래서 두 컨트롤러간에 데이터를 공유하는 데 도움이 필요합니다. 나는이 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

일반적으로 "나는 두 개의 컨트롤러 사이에 아무것도 공유 할 수있는 방법 "질문에 대한 대답은 "는 서비스을 사용하여"입니다. 당신이 그것에 대해 생각한다면, 당신은 단지 컨트롤러 사이에 유지되는 데이터를 전달할 필요가 있습니다. javaFx 세계에서 모델이어야합니다.

만드는 각 .fxml 파일은 하나의 컨트롤러 또는 발표자 만 처리해야합니다. .fxml 뷰를 컨트롤러와 결합하여 애플리케이션 모듈로 생각하십시오. 이는 재사용 성을 제공합니다. 응용 프로그램은 하나 이상의 모듈로 구성되어야합니다.

the afterburner fx도 확인하시기 바랍니다. 이 예에서는 서로 다른 모듈이 서로 통신하는 방식을 실제로 볼 수 있습니다.

+0

문제를 푸는데 도움이되도록 게시 한 링크를 설명 할 수 있습니까? – Blip

+0

javaFX 용어로 MVC를 이해하기위한 권장 사항으로 링크를 게시했습니다. 좋아, 애프터 버너가 더 나아가 DI를 사용하지만 예제가 정말 유용하다고 생각합니다. 적어도 그것이 나를 이해하는 데 도움이되었습니다. 내 관점에서 볼 때 문제는 컨트롤러를 다른 컨트롤러로 전달할 때 시작됩니다. 응용 프로그램이 커지면 어떻게됩니까? –

+0

@Blip 이러한 유형의 응용 프로그램을 작성하는 것은 일반적인 진화입니다. 먼저 컨트롤러간에 의사 소통을해야한다는 것을 알게되면 (잠시 후)이를 수행하는 가장 좋은 방법은 데이터를 관찰하는 모델 인스턴스를 공유하는 것입니다. 최신 정보. 그런 다음 모델 인스턴스를 실제로 공유하는 메커니즘이 번거롭고 DI 프레임 워크가 고통을 상당히 완화한다는 것을 알게되었습니다. –