2013-11-10 3 views
25

Я новичок в Fx. У меня есть TabPanel с 10 вкладками. Каждая вкладка имеет множество элементов управления (диаграммы, кнопки и т. Д.), И я хочу назначить контроллер для каждой вкладки. SceneBuilder позволяет мне назначать контроллер для всего представления, я имею в виду, что только верхняя панель (корневая) имеет параметр «Контроллер-класс», поэтому мне нужно написать код для всех вкладок в одном классе, и это, как влекут за собой очень большой класс, который трудно понять и сохранить. Возможно, решение очень простое, но, как я уже сказал, у меня очень мало опыта работы с FX, и я не смог найти что-то подобное в Интернете.JavaFX TabPane - Один контроллер для каждой вкладки

Любая идея? Спасибо.

ответ

65

Один из подходов состоит в том, чтобы инкапсулировать каждую из ваших страниц вкладок в отдельный файл FXML со своим собственным классом контроллера.

Затем в файле FXML для главного управления вкладки вы можете сделать что-то вроде этого:

<TabPane > 
    <tabs> 
     <Tab text="Untitled Tab 1"> 
      <content> 
       <fx:include fx:id="fooTabPage" source="fooTabPage.fxml"/> 
      </content> 
     </Tab> 
     <Tab text="Untitled Tab 2"> 
      <content> 
       <fx:include fx:id="barTabPage" source="barTabPage.fxml"/> 
      </content> 
     </Tab> 
    </tabs> 
</TabPane> 

Обратите внимание, что вместо того, чтобы встроить контент напрямую, я использую fx:include директиву, которая говорит о FXMLLoader для загрузки FXML-файл, на который ссылаются. Отдельные файлы FXML, используемые для содержимого страницы, будут иметь свой собственный контроллер, чтобы логика была приятно разделена.

Если вам нужно взаимодействовать с подстраницами или субконтроллерами от основного контроллера, вы можете ссылаться на них, как и на любой другой элемент управления FXML, чтобы их вставляли.

public class MainController { 
    // Inject tab content. 
    @FXML private FooTabPage fooTabPage; 
    // Inject controller 
    @FXML private FooTabController fooTabPageController; 

    // Inject tab content. 
    @FXML private BarTabPage barTabPage; 
    // Inject controller 
    @FXML private BarTabController barTabPageController; 
} 

Если у вас есть большое количество страниц (каждая с большим количеством своих собственных элементов управления) другой подход, чтобы оставить каждую вкладку пустыми, и после загрузки основного вида, загрузите соответствующую страницу в свой контроль ,

Вам нужно будет прослушать изменения вкладок, чтобы переключать контент и добавлять соответствующий код для загрузки/выгрузки видов, которые используются для содержимого страниц вкладок.

Я бы рекомендовал начать с первого подхода и рефакторинга, чтобы использовать второй подход, если обнаружите проблемы с производительностью.

+0

Благодарим вас за быстрый ответ. Я поработаю с вашим решением. – roneypc

+0

Нет проблем. Ознакомьтесь с [ссылкой FXML] (http://docs.oracle.com/javafx/2/api/javafx/fxml/doc-files/introduction_to_fxml.html), если вам нужна дополнительная информация. –

+0

выберите это как ответ. Я думаю, что это очень хорошо объяснено и заслуживает внимания. – Ward

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