2016-10-26 7 views
1

Je suis nouveau dans JavaFX, donc je besoin d'aide dans le partage des données entre les deux contrôleurs.communication JavaFX entre les contrôleurs

J'ai fenêtre simple qui propose un menu simple:

@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); 


     } 
    }); 


} 

Lorsque je clique sur ligneMenu visluga_vid.setOnAction nouvelle mdi windows est l'ouverture. Ensuite, je veux ouvrir une autre fenêtre de mdi window. MdiWindows a parent (MDICanvas) et le MDICanvas a parent - AnchorPane. MDIWIndows possède son propre contrôleur et le fichier 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); 



       } 

     }); 

    } 


} 

Comment puis-je partager AnchorPane et MDICanvas de MainController à MDIWindowController pour ouvrir de nouveaux MDIWindow?

+1

Créez un modèle pour enregistrer vos données, puis partagez le modèle entre différents contrôleurs. C'est la partie importante qui manque dans votre logique de MVC. – Blip

+0

Vous pouvez ajouter la méthode 'getter' aux contrôleurs et les appeler aux instances des contrôleurs..Bien que vous deviez apprendre' Model View Controller Pattern '(MVC) qui vous aidera à créer de superbes applications. – GOXR3PLUS

+0

Pour un exemple simple d'utilisation de MVC dans JavaFX pour partager des données entre contrôleurs, comme le suggère @Blip, voir la réponse à http://stackoverflow.com/questions/32342864/applying-mvc-with-javafx. Le framework [afterburner.fx] (http://afterburner.adam-bien.com/) lié dans la réponse d'Eirini fournit un mécanisme simplifié pour transmettre la même instance de modèle aux contrôleurs. –

Répondre

0

Normalement, la réponse à la question « comment puis-je partager quoi que ce soit entre deux contrôleurs » est « utiliser un service ». Si vous y réfléchissez, il vous suffit de transmettre des données, qui sont en quelque sorte conservées entre vos contrôleurs. Dans le monde javaFx, cela devrait être un modèle.

Chaque fichier .fxml que vous créez doit être manipulé que par un contrôleur ou un présentateur. Pensez à vos vues .fxml combinées avec vos contrôleurs en tant que modules de votre application. Cela fournit la réutilisabilité. Votre application doit comporter un ou plusieurs modules.

Je vous recommande de vérifier également the afterburner fx. Dans cet exemple, vous pouvez voir en action comment les différents modules communiquent entre eux.

+0

pourriez-vous expliquer comment le lien que vous avez posté va aider à résoudre le problème. – Blip

+0

J'ai posté le lien comme une recommandation pour comprendre le MVC en termes javaFX. Ok le afterburner va plus loin et utilise DI mais je trouve l'exemple vraiment utile. Au moins, cela m'a aidé à comprendre. De mon point de vue, le problème commence quand on passe un contrôleur à un autre contrôleur. Que se passerait-il si l'application augmentait? –

+0

@Blip C'est une évolution courante dans l'écriture de ces types d'applications: vous devez d'abord communiquer entre les contrôleurs, puis (après un certain temps) vous découvrez que la meilleure façon de le faire est de partager une instance de modèle dont vous observez les données. mettre à jour. Ensuite, vous trouvez que la mécanique de partage de cette instance de modèle devient lourde, et un cadre de DI soulage considérablement la douleur. –