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();
                }
            });
    }