JavaFX TabPane - один контроллер для каждой вкладки
Я новичок в Fx. У меня есть TabPanel с 10 вкладками. Каждая вкладка имеет множество элементов управления (диаграммы, кнопки и т. д.), и я хочу назначить контроллер для каждой вкладки. SceneBuilder позволяет мне назначить контроллер только для всего представления, я имею в виду, что только верхняя панель (корень) имеет опцию "класс контроллера", поэтому я должен написать код для всех вкладок в одном классе, и это, как влечет за собой, приводит к очень большому классу и трудно понять и поддерживать. Возможно, решение очень простое, но, как я уже сказал, У меня очень мало опыта работы с FX, и я не смог найти что-то подобное в интернете.
есть идеи? Спасибо.
1 ответов
один из подходов заключается в инкапсуляции каждой из ваших вкладок в отдельный файл FXML с собственным связанным классом контроллера.
затем в вашем FXML-файле для управления Главной вкладкой вы можете сделать что-то вроде этого:
<TabPane fx:controller="com.foo.MainController">
<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;
}
если у вас есть большое количество страниц (каждая с большим количеством собственных элементов управления), другой подход-оставить каждую вкладку пустой, и после загрузки основного представления загрузите соответствующую страницу в свой элемент управления.
вам нужно будет прослушать изменения вкладки, чтобы переключить содержимое и добавить соответствующий код для загрузки / выгрузки представлений, которые используются для содержимого страниц вкладок.
Я бы рекомендовал начать с первого подхода и рефакторинга, чтобы использовать второй подход, если вы обнаружите проблемы с производительностью.