2016-10-26 14 views
1

Я новичок в JavaFX, поэтому мне нужна помощь в обмене данными между двумя контроллерами.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); 


     } 
    }); 


} 

Когда я нажимаю на MENUITEM visluga_vid.setOnAction новый mdi windows открывается. Затем я хочу открыть другое окно от 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); 



       } 

     }); 

    } 


} 

Как я могу поделиться AnchorPane и MDICanvas от MainController к MDIWindowController, чтобы открыть новый MDIWindow?

+1

Создайте модель для сохранения ваших данных, а затем разделите модель на разные контроллеры. Его важная часть, которой не хватает в вашей логике MVC. – Blip

+0

Вы можете добавить метод 'getter' к контроллерам и вызвать их в экземплярах контроллеров. Хотя вы должны изучить« Model Control Controller Pattern »(MVC), который поможет вам создавать отличные приложения. – GOXR3PLUS

+0

Для простого примера использования MVC в JavaFX для обмена данными между контроллерами, поскольку @Blip предлагает увидеть ответ на http://stackoverflow.com/questions/32342864/applying-mvc-with-javafx. Структура [afterburner.fx] (http://afterburner.adam-bien.com/), связанная с ответом Эйрини, обеспечивает упрощенный механизм передачи того же экземпляра модели контроллерам. –

ответ

0

Обычно ответ на вопрос «как я могу разделить что-либо между двумя контроллерами» является «использовать услугу». Если вы думаете об этом, вам нужно только передать данные, которые каким-то образом сохраняются между вашими контроллерами. В мире javaFx, который должен быть моделью.

Каждый созданный вами файл .fxml должен обрабатываться только одним контроллером или ведущим. Подумайте о своих представлениях .fxml в сочетании с вашими контроллерами в качестве модулей вашего приложения. Это обеспечивает повторное использование. Ваша заявка должна состоять из одного или нескольких модулей.

Я бы рекомендовал вам также проверить the afterburner fx. В этом примере вы можете увидеть в действии, как разные модули взаимодействуют друг с другом.

+0

не могли бы вы объяснить, как ссылка, которую вы опубликовали, поможет решить проблему. – Blip

+0

Я разместил ссылку как рекомендацию для понимания MVC в терминах javaFX. Хорошо, что форсажер идет дальше и использует DI, но я считаю, что этот пример действительно полезен. По крайней мере, это помогло мне понять. С моей точки зрения, проблема начинается, когда вы передаете контроллер другому контроллеру. Что произойдет, если приложение будет расти? –

+0

@Blip Это обычная эволюция при написании этих типов приложений: сначала вы обнаружите, что вам нужно общаться между контроллерами, тогда (через некоторое время) вы обнаружите, что лучший способ сделать это - обмен экземпляром модели, данные которого вы наблюдаете, и Обновить. Затем вы обнаружите, что механики фактического обмена экземпляром модели громоздки, а основа DI значительно облегчает боль. –