JavaFX,在选项卡控制器之间传递参数

V_Martusciello

在问这个问题之前,我曾在任何地方寻找解决方案,如果已经存在,请报告。

实际上,我有这种情况:

点击查看图像

TabLayout.fxml

<JFXTabPane fx:id="tabbedPane" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" minHeight="-Infinity" minWidth="-Infinity" prefWidth="500.0" tabClosingPolicy="UNAVAILABLE" tabMinWidth="100.0" xmlns="http://javafx.com/javafx/8.0.60" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.TAB.TabController" stylesheets="@tab.css">
<tabs>
  <Tab id="anagrafeTab" closable="false" text="Anagrafe">
    <content>
      <fx:include fx:id="anagrafeL" source="/application/Anagrafe/AnagrafeLayout.fxml"/>
     </content>
  </Tab>
  <Tab id="visiteTab" closable="false" text="Visite">
     <content>
        <fx:include fx:id="visiteL" source="/application/Visite/VisiteLayout.fxml"/>
     </content></Tab>
  <Tab id="latteTab" closable="false" text="Produzione Latte"> 
     <content>
        <fx:include fx:id="latteL" source="/application/Latte/LatteLayout.fxml"/>
     </content>
  </Tab>
  <Tab id="partiTab" closable="false" text="Parti" >
     <content>
         <fx:include fx:id="partiL" source="/application/Parti/PartiLayout.fxml"/>
     </content>
  </Tab>
</tabs>
</JFXTabPane>

每个“包含”的布局:

  • AnagrafeLayout.fxml
  • VisiteLayout.fxml
  • LatteLayout.fxml
  • PartiLayout.fxml

比起每个布局,我都有一个模型和一个控制器,但有一个唯一的调用者。

public class Tab {

public Tab() {
    inizializza();
}

private void inizializza() {
    try {
        Stage stage = new Stage();
        stage.setTitle("Dati");
        stage.getIcons().add(new Image(getClass().getResourceAsStream("insert.png")));

        FXMLLoader loader = new FXMLLoader();
        loader.setLocation(getClass().getResource("TabLayout.fxml"));
        JFXTabPane root = (JFXTabPane) loader.load();

        Scene scene = new Scene(root,660,430);
        stage.setScene(scene);

        stage.show();
        //ScenicView.show(scene);

    } catch(Exception e) {
        e.printStackTrace();
    }

   }
}

我需要将传递ObservableList<Visite> data = FXCollections.observableArrayList();给每个控制器。

我真的不知道该怎么做,我不会使用单个控制器,因为它们是很长的类。

编辑:

TABController.java

public class TabController implements Initializable {

@FXML
private TabPane tabbedPane;

@Override
public void initialize(URL arg0, ResourceBundle arg1) {
    assert tabbedPane != null : "fx:tabbedPane=\"in\" was not injected: check your FXML file 'TabLayout.fxml'.";

    tabbedPane.getSelectionModel().selectedItemProperty().addListener((ov, oldTab, newTab) -> {

        if(tabbedPane.getSelectionModel().getSelectedIndex() != 0) {
            tabbedPane.getScene().getWindow().setWidth(1171);
            tabbedPane.getScene().getWindow().setHeight(700);
        } else {
            tabbedPane.getScene().getWindow().sizeToScene();
        }           
    });
  }
}

编辑2

如上所述,这四个选项卡都有自己的模型类。所以我有4个不同的列表,这些列表最初是空的,因为每个选项卡都有一个表,因此它们是动态填充的。当tabPane由其他实习生调用时,将创建列表。我需要这些列表,因为这可能是先前加载的可能性,然后我必须将此信息传递给控制器​​。

在实践中,会发生以下情况:

1)

调用函数插入,该插入创建从选项卡中的表加载的空列表。然后,数据将在关闭时存储在数据库中。

2)

调用函数显示将调用带有特定标志的函数插入,该标志创建列表并从数据库中获取数据并将其发送到可以修改的表中。

我希望我很清楚,对于前面问题的含糊之处,我深表歉意。

现在我以这种方式解决

public class TabController implements Initializable {

@FXML
private TabPane tabbedPane;

@FXML
private VisiteController visiteLController;
private ObservableList<Visite> dataVisite = FXCollections.observableArrayList();
private ObservableList<Visite> dataDelVisite = FXCollections.observableArrayList();

@FXML
private LatteController latteLController;
private ObservableList<Latte> dataLatte = FXCollections.observableArrayList();
private ObservableList<Latte> dataDelLatte = FXCollections.observableArrayList();

@FXML
private PartiController partiLController;
private ObservableList<Parti> dataParti = FXCollections.observableArrayList();
private ObservableList<Parti> dataDelParti = FXCollections.observableArrayList();


@Override
public void initialize(URL arg0, ResourceBundle arg1) {
    assert tabbedPane != null : "fx:tabbedPane=\"in\" was not injected: check your FXML file 'TabLayout.fxml'.";

    tabbedPane.getSelectionModel().selectedItemProperty().addListener((ov, oldTab, newTab) -> {

        if(tabbedPane.getSelectionModel().getSelectedIndex() != 0) {
            tabbedPane.getScene().getWindow().setWidth(1171);
            tabbedPane.getScene().getWindow().setHeight(700);
        } else {
            tabbedPane.getScene().getWindow().sizeToScene();
        }           
    });     

    visiteLController.setData(dataVisite, dataDelVisite);
    latteLController.setData(dataLatte, dataDelLatte);
    partiLController.setData(dataParti, dataDelParti);
 }
}

显然每个控制器的设置方法都发生了变化

    public void setData(ObservableList<Visite> data, ObservableList<Visite> dataDel) {
    this.data = data;
    this.dataDel = dataDel;
    liveSearh();
}
詹姆斯_D

最好的选择是使用控制器工厂,以便在由控制器创建控制器时将列表传递给控制器FXMLLoader

因此,首先,定义所有控制器,使其具有可观察列表的构造函数:

public class TabController implements Initializable {

    private final ObservableList<Visite> data ;

    public TabController(ObservableList<Visite> data) {
        this.data = data ;
    }

    // existing code...
}

例如

public class AnagrafeController implements Initializable {

    private final ObservableList<Visite> data ;

    public AnagrafeController(ObservableList<Visite> data) {
        this.data = data ;
    }

    // existing code...
}

现在,您需要一个控制器工厂,该工厂本质上是一个函数,该函数采用aClass并返回该类的控制器。这只需要一点思考:

FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("TabLayout.fxml"));

ObservableList<Visite> data = FXCollections.observableArrayList();

loader.setControllerFactory((Class<?> controllerType) -> {
    try {
        Constructor<?>[] constructors = controllerType.getConstructors();
        for (Constructor<?>[] constructor : constructors) {
            if (constructor.getParameterCount() == 1 &&
                constructor.getParameterTypes()[0] == ObservableList.class)

                return constructor.newInstance(data);
            }
        }

        // no suitable constructor found, just use default:
        return controllerType.newInstance();

    } catch (Exception exc) {
        System.out.println("Could not create controller:");
        exc.printStackTrace();
        return null ;
    }
});

JFXTabPane root = loader.load();

// ...

这将创建一个可观察列表(data),并且控制器工厂将确保,如果控制器类具有将可观察列表作为参数的构造函数,则将其作为该参数data传入。

当使用<fx:include>相同的控制器工厂时,将为包含的FXML文件创建控制器,因此,假设您定义了适当的构造函数,则相同的列表也将传递给这些控制器。

您还可以考虑为此使用依赖项注入框架,该框架基本上可以自动将对象注入到控制器中。Afterburner.fx是一个非常不错的JavaFX依赖项注入框架。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在选项卡栏中的2个视图控制器之间传递字符串

来自分类Dev

在选项卡控制器中的两个视图控制器之间传递数据

来自分类Dev

在两个JavaFX控制器之间传递参数

来自分类Dev

JavaFX TabPane-每个选项卡一个控制器

来自分类Dev

在另一个控制器中关闭选项卡 - JavaFX

来自分类Dev

JavaFX 8-选项卡和选项卡,每个选项卡具有单独的FXML和控制器

来自分类Dev

不同选项卡中的控制器之间的AngularJS通信

来自分类Dev

如何在不同选项卡下的导航控制器之间切换?

来自分类Dev

在选项卡式视图控制器之间在Swift中传递简单的变量数据(更新标签)

来自分类Dev

如何在选项卡式应用程序的视图控制器之间传递数据?

来自分类Dev

具有不同控制器的选项卡

来自分类Dev

SWRevealViewController和选项卡栏控制器

来自分类Dev

在选项卡栏控制器之前显示视图

来自分类Dev

uinavigationcontroller中的选项卡栏控制器

来自分类Dev

带选项卡控件的页面控制器

来自分类Dev

SWRevealViewController和选项卡栏控制器

来自分类Dev

在选项卡栏控制器之前显示视图

来自分类Dev

带选项卡控件的页面控制器

来自分类Dev

Rails 4从控制器关闭当前选项卡

来自分类Dev

选项卡栏控制器未显示更新Xcode后的选项卡按钮

来自分类Dev

选项卡栏控制器将不显示选项卡Xcode 7

来自分类Dev

AngularJS:在控制器之间传递参数

来自分类Dev

在其他选项卡中显示选项卡栏控制器中的视图控制器而无需切换选项卡

来自分类Dev

故事板导航控制器和选项卡栏控制器

来自分类Dev

从导航栏视图控制器导航到选项卡栏视图控制器

来自分类Dev

在选项卡视图控制器中跨视图控制器访问NSCache

来自分类Dev

删除选项卡控制器中的后退按钮文本更多导航控制器

来自分类Dev

从导航栏视图控制器导航到选项卡栏视图控制器

来自分类Dev

快速将数据从一个选项卡控制器传递到另一个

Related 相关文章

  1. 1

    在选项卡栏中的2个视图控制器之间传递字符串

  2. 2

    在选项卡控制器中的两个视图控制器之间传递数据

  3. 3

    在两个JavaFX控制器之间传递参数

  4. 4

    JavaFX TabPane-每个选项卡一个控制器

  5. 5

    在另一个控制器中关闭选项卡 - JavaFX

  6. 6

    JavaFX 8-选项卡和选项卡,每个选项卡具有单独的FXML和控制器

  7. 7

    不同选项卡中的控制器之间的AngularJS通信

  8. 8

    如何在不同选项卡下的导航控制器之间切换?

  9. 9

    在选项卡式视图控制器之间在Swift中传递简单的变量数据(更新标签)

  10. 10

    如何在选项卡式应用程序的视图控制器之间传递数据?

  11. 11

    具有不同控制器的选项卡

  12. 12

    SWRevealViewController和选项卡栏控制器

  13. 13

    在选项卡栏控制器之前显示视图

  14. 14

    uinavigationcontroller中的选项卡栏控制器

  15. 15

    带选项卡控件的页面控制器

  16. 16

    SWRevealViewController和选项卡栏控制器

  17. 17

    在选项卡栏控制器之前显示视图

  18. 18

    带选项卡控件的页面控制器

  19. 19

    Rails 4从控制器关闭当前选项卡

  20. 20

    选项卡栏控制器未显示更新Xcode后的选项卡按钮

  21. 21

    选项卡栏控制器将不显示选项卡Xcode 7

  22. 22

    AngularJS:在控制器之间传递参数

  23. 23

    在其他选项卡中显示选项卡栏控制器中的视图控制器而无需切换选项卡

  24. 24

    故事板导航控制器和选项卡栏控制器

  25. 25

    从导航栏视图控制器导航到选项卡栏视图控制器

  26. 26

    在选项卡视图控制器中跨视图控制器访问NSCache

  27. 27

    删除选项卡控制器中的后退按钮文本更多导航控制器

  28. 28

    从导航栏视图控制器导航到选项卡栏视图控制器

  29. 29

    快速将数据从一个选项卡控制器传递到另一个

热门标签

归档