2016-01-14 2 views
1

У меня есть два макета fxml, один из которых включает в себя другой. Я пытаюсь обновить содержимое внутреннего элемента от контроллера родителя, т.е. е. когда нажата кнопка на родительском контроллере, измените изображение на изображении.Как получить конкретный экземпляр контроллера из родительского контроллера на JavaFX2?

Я использую подход, предложенный here. Проблема в том, что когда я вызываю метод, который предполагает изменить изображение внутри imageView (questionController.setPdfPageImage(++currentPage);), ничего не происходит. Я попробовал отладку, и я считаю, что это потому, что есть два совершенно разных экземпляра контроллера: один из которых вызывается из среды выполнения, а другой - из fxml по умолчанию. Пожалуйста, укажите мне правильное решение.

часть main.fxml

<BorderPane 
    fx:id="mainContainer" 
    xmlns="http://javafx.com/javafx/8" 
    xmlns:fx="http://javafx.com/fxml/1" 
    fx:controller="com.package.name.MainController"> 
    <center> 
     <Pane fx:id="center"> 
      <fx:include source="question.fxml"/> 
     </Pane> 
    </center> 
    <bottom> 
     <VBox fx:id="bottom" 
       BorderPane.alignment="CENTER"> 
      <children> 
       <Button fx:id="next" text="Next"/> 
      </children> 
     </VBox> 
    </bottom> 
</BorderPane> 

часть question.fxml

<SplitPane fx:id="content" 
    dividerPositions="0.5" 
    xmlns="http://javafx.com/javafx/8" 
    xmlns:fx="http://javafx.com/fxml/1" 
    fx:controller="com.package.name.QuestionController"> 
    <items> 
     <AnchorPane fx:id="questionContainer"> 
      <children> 
       <ImageView fx:id="questionView" pickOnBounds="true" preserveRatio="true"/> 
      </children> 
     </AnchorPane> 
    </items> 
</SplitPane> 

часть QuestionController.java

public void setPdfPageImage(int pageNum) { 
//  InputStream is = QuestionController.class.getResourceAsStream(currentPdf); 
     InputStream is = this.getClass().getResourceAsStream(currentPdf); 
     Image convertedImage; 
     try { 
      PDDocument document = PDDocument.load(is); 
      List<PDPage> list = document.getDocumentCatalog().getAllPages(); 
      PDPage page = list.get(pageNum); 
      BufferedImage image = page.convertToImage(BufferedImage.TYPE_INT_RGB, 128); 
      convertedImage = SwingFXUtils.toFXImage(image, null); 
      document.close(); 
      questionView.setImage(convertedImage);  
     } catch (Exception e) { 
      throw new RuntimeException(e); 
     } 
    } 

части MainController.java

public class MainController implements Initializable { 
    QuestionController questionController; 
    @FXML // fx:id="next" 
    private Button next; // Value injected by FXMLLoader 
    @Override 
    public void initialize(URL location, ResourceBundle resources) { 
     FXMLLoader loader = new FXMLLoader(getClass().getResource("/question.fxml")); 
     try { 
      loader.load(); 
     } catch (IOException e1) { 
      e1.printStackTrace(); 
     } 
     questionController = (QuestionController) loader.getController(); 
     next.setOnAction(event -> { 
      //TODO remove hardcoded value 49 
      if (currentPage < 49) 
       questionController.setPdfPageImage(++currentPage); 
      else { 
       Alert alert = new Alert(Alert.AlertType.INFORMATION); 
       alert.setTitle("Quiz finished"); 
       alert.setHeaderText(null); 
       alert.setContentText("This was the last question. Thank you!"); 
       alert.showAndWait(); 
      } 
     }); 
    } 
} 

ответ

2

Чтобы придать контроллер включаемого FXML, добавьте атрибут fx:id к fx:include тегу:

<fx:include fx:id="question" source="question.fxml"/> 

Это будет вводить контроллер в поле с имя <fx:id>Controller, то есть questionController в этом случае (если такое поле отображается загрузчику).

(Также удалить часть погрузчика из метода initialize).

+0

Большое спасибо, Фабиан! – Polyakoff

Смежные вопросы