Tabs 每次调用包含的tabcontent时,JavaFX启动方法
如何在每次调用选项卡时启动方法?我有一个Tabs 每次调用包含的tabcontent时,JavaFX启动方法,tabs,javafx-8,fxml,subcontroller,Tabs,Javafx 8,Fxml,Subcontroller,如何在每次调用选项卡时启动方法?我有一个Main.fxml和一个tabpane和两个选项卡,我为每个选项卡包括了一个单独的fxml(tab1.fxml,tab2.fxml) Main.fxml <?xml version="1.0" encoding="UTF-8"?> <?import javafx.scene.control.*?> <?import java.lang.*?> <?import javafx.scene.layout
Main.fxml
和一个tabpane
和两个选项卡
,我为每个选项卡包括了一个单独的fxml(tab1.fxml
,tab2.fxml
)
Main.fxml
<?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="434.0" prefWidth="428.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="controller.MainController">
<children>
<TabPane prefHeight="434.0" prefWidth="428.0" tabClosingPolicy="UNAVAILABLE" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<tabs>
<Tab fx:id="tab1" text="Tab 1">
<content>
<fx:include source="tab1.fxml" />
</content>
</Tab>
<Tab fx:id="tab2" onSelectionChanged="#addView" text="Tab 2">
<content>
<fx:include source="tab2.fxml" />
</content>
</Tab>
</tabs>
</TabPane>
</children>
</AnchorPane>
每个FXML都有一个标签
,该标签应显示调用选项卡(内容)的频率。因此,如果我单击tab(“tab2”),计数器标签应显示“1”,并在每次我再次调用此选项卡时递增+1。这应该通过使用选项卡控制器中的方法来实现
tab1.fxml
<?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="249.0" prefWidth="257.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="controller.tab1Controller">
<children>
<Label fx:id="lbl_1" layoutX="92.0" layoutY="53.0" text="not clicked" />
</children>
</AnchorPane>
Tab2.fxml
<?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="249.0" prefWidth="257.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="controller.tab2Controller">
<children>
<Label fx:id="lbl_2" layoutX="92.0" layoutY="53.0" text="not clicked" />
</children>
</AnchorPane>
我已经尝试通过使用静态方法和标签来解决这个问题,但是我得到了NullPointerExceptions
,似乎这在Java8中不再起作用。
此外,我还尝试使用fxmloader
获取控制器。。。这样我还得到了一个NullPointerExceptions
对于包含的fmxl或anchorpane,是否有onCall
方法?或者是让控制器再次初始化的东西
任何其他解决方案或想法?首先,您的
计数器不应是静态的。它们属于控制器实例,而不是控制器类
你需要三件事:
对主控制器中选项卡窗格的引用
对主控制器中每个选项卡控制器的引用
选项卡窗格所选选项卡上的侦听器,以便在所选选项卡更改时调用方法
首先,只需执行以下操作:
<TabPane fx:id="tabPane" prefHeight="434.0" ... >
在MainController.java中
第二,您可以使用
您需要为每个fx:include
s添加一个fx:id
属性,然后只需在MainController.java中为控制器添加引用即可。规则是,如果您的fx:include
具有fx:id=“x”
,则可以将相应FXML文件中的控制器注入名为xController
的变量中。在这里,我将控制器的类名更改为Tab1Controller
和Tab2Controller
,以遵循标准约定(避免混淆)
在Main.fxml中,将fx:include
s更改为包含fx:id
:
<fx:include fx:id="tab1Content" source="tab1.fxml" />
<fx:include fx:id="tab2Content" source="tab2.fxml" />
现在在MainController
的initialize()
方法中,只需设置侦听器:
public void initialize() {
tabPane.getSelectionModel().selectedItemProperty()
.addListener((obs, oldTab, newTab) -> {
if (newTab == tab1) {
tab1ContentController.addViewCounter();
} else if (newTab == tab2) {
tab2ContentController.addViewCounter();
}
});
}
哇,非常感谢。我已经尝试过这种方法,但是我没有在fx:id名称后添加“Controller”,所以我一直都收到错误消息。
<TabPane fx:id="tabPane" prefHeight="434.0" ... >
@FXML private TabPane tabPane ;
<fx:include fx:id="tab1Content" source="tab1.fxml" />
<fx:include fx:id="tab2Content" source="tab2.fxml" />
@FXML private Tab1Controller tab1ContentController ;
@FXML private Tab2Controller tab2ContentController ;
public void initialize() {
tabPane.getSelectionModel().selectedItemProperty()
.addListener((obs, oldTab, newTab) -> {
if (newTab == tab1) {
tab1ContentController.addViewCounter();
} else if (newTab == tab2) {
tab2ContentController.addViewCounter();
}
});
}