Сообщение об ошибке:
Caused by: java.lang.IllegalArgumentException:
Can not set javafx.scene.control.Tab field controller.MainController.tab1 to javafx.scene.layout.AnchorPane
объясняет, в чем проблема. <fx:include>
генерирует AnchorPane
(предположительно, это элемент root из Tab1.fxml
), и вы пытаетесь использовать поле типа Tab
для ссылки на него.
Если вы только требуется доступ к содержимому вкладки, просто измените тип поля соответствующим образом:
public class MainController {
@FXML Tab1Controller tab1Controller;
@FXML Tab2Controller tab2Controller;
@FXML AnchorPane tab1;
@FXML AnchorPane tab2;
@FXML public void initialize() {
System.out.println("Application started");
tab1Controller.init(this);
tab2Controller.init(this);
}
public String loadLblTextFromTab1() {
return tab1Controller.lbl1.getText();
}
public void setTab2LabelText(String text) {
tab2Controller.lbl2.setText(text);
}
}
Если вам специально нужен доступ к самим вкладкам, вам понадобится fx:id
s на Tab
. Как и раньше, чтобы получить ссылку на контроллер, вам понадобится fx:id
на <fx:include>
. Поэтому, если вам нужна фактическая ссылка на Tab
, а также на контроллер, вам понадобятся (разные) fx:id
s как на Tab
, так и на <fx:include>
:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.AnchorPane?>
<AnchorPane prefHeight="299.0" prefWidth="309.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="controller.MainController">
<children>
<TabPane prefHeight="299.0" prefWidth="309.0" tabClosingPolicy="UNAVAILABLE" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<tabs>
<Tab fx:id="tab1" closable="false" text="Tab 1">
<content>
<fx:include fx:id="tab1Content" source="tab/Tab1.fxml" />
</content></Tab>
<Tab fx:id="tab2" closable="false" text="Tab 2">
<content>
<fx:include fx:id="tab2Content" source="tab/Tab2.fxml" />
</content></Tab>
</tabs>
</TabPane>
</children>
</AnchorPane>
и
public class MainController {
@FXML Tab1Controller tab1ContentController;
@FXML Tab2Controller tab2ContentController;
@FXML Tab tab1;
@FXML Tab tab2;
@FXML public void initialize() {
System.out.println("Application started");
tab1Controller.init(this);
tab2Controller.init(this);
}
public String loadLblTextFromTab1() {
return tab1ContentController.lbl1.getText();
}
public void setTab2LabelText(String text) {
tab2ContentController.lbl2.setText(text);
}
}