显示 TableView TabPane

Displaying a TableView TabPane

他是我第一次在我的最终项目中使用 Javafx,我在 TabPane 中显示我的 TableView 时遇到问题。

我有一个名为 initialize() 的函数来创建我的 TableView 并填充它,并将它与我使用 SceneBuilder 创建的 TableView 相关联(我当然在我的控制器中为 TableView 指定了相同的 Fx:id ),该函数还创建了 Tabs 和 TabPane,return 最后创建了 TabPane。 我在我的主控制器中调用了这个函数,但它没有显示任何东西。

@FXML public TabPane initialize()
{
    //Stage stage = new Stage();
    //BorderPane root = new BorderPane();
    TabPane tp = new TabPane();
    Tab ose = new Tab("Liste OS&E");
    ose.setClosable(false);
    TableView  <ose> osetable = new TableView<ose>();
    TableColumn<ose, String> descolumn = new TableColumn<ose, String>("Designation");
    TableColumn<ose, String> articlecolumn = new TableColumn<ose, String>("Article");
    TableColumn<ose, String> fourcolumn = new TableColumn<ose, String>("Fournisseur");
    descolumn.setCellValueFactory(
            new PropertyValueFactory<ose, String>("designation"));
    articlecolumn.setCellValueFactory(
            new PropertyValueFactory<ose, String>("article"));
    fourcolumn.setCellValueFactory(
            new PropertyValueFactory<ose, String>("fournisseur"));
    osetable.setItems(getOSE());
    osetable.getColumns().addAll(descolumn,articlecolumn,fourcolumn);

    ose.setContent(osetable);
    tp.getTabs().add(ose);
    return tp ;
    }

这就是我如何调用它来创建我的页面:

else if (e.getSource()== gestionprojet)
    {
            FXMLLoader loader = new FXMLLoader(getClass().getResource("../V/Gestionprjt.fxml"));
            loader.setController(this);
            stage.setResizable(false);
            stage.setTitle("Gestion de projet - Sofitel Tamuda Bay Beach & Resort");
            Image icon = new Image(getClass().getResourceAsStream("../V/logo-Sofitel.png"));
            stage.getIcons().add(icon);
            BorderPane root = new BorderPane ();
            root.getChildren().add(initialize());
            Scene scene = new Scene(root);
            stage.setScene(scene);
            stage.show();
    }

你们能告诉我我的代码有什么问题吗? 谢谢

问题是:您使用的是 BorderPane。但是 BorderPane 仅显示使用适当 topcenterbottomrightleft =41=]。任何其他 children 都将被忽略。您正在将 TabPane 直接添加到 child 列表,因此它被忽略了:

root.getChildren().add(initialize());

添加它,例如因为 center 会解决这个问题:

root.setCenter(initialize());

但是在这种情况下将 TabPane 包装在 BorderPane 中没有任何好处,因为它是 BorderPane 中唯一的 child。也可以直接设置为Scene的root:

Scene scene = new Scene(initialize());

此外,我建议重命名 initialize 方法,因为 FXMLLoader 会调用 public void public void initialize(); 方法。这可能有点令人困惑,因为只有你的 return 类型会阻止它被调用,而阅读你的代码的其他人(或几周后的你)很容易被这个事实搞糊涂。此外,我很确定没有必要用 @FXML.

注释该方法