显示TableView TabPane

时间:2016-05-31 11:20:12

标签: java javafx scenebuilder

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

我有一个名为initialize()的函数来创建我的TableView并填充它并将它与我使用SceneBuilder创建的TableView相关联(我当然在我的控制器中为TableView指定了相同的Fx:id),该函数创建Tabs和TabPane并最终返回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();
    }

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

1 个答案:

答案 0 :(得分:1)

问题是:您使用的是BorderPane。但是,BorderPane仅显示使用相应属性添加的topcenterbottomrightleft Node / setter方法。任何其他孩子都被忽略了。您正在将TabPane直接添加到子列表中,因此会将其忽略:

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

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

root.setCenter(initialize());

但在这种情况下将TabPane包裹在BorderPane中没有任何好处,因为它是BorderPane的唯一子项。您也可以直接将其设置为Scene的根目录:

Scene scene = new Scene(initialize());

此外,我建议重命名initialize方法,因为FXMLLoader会调用public void public void initialize();方法。这可能有点令人困惑,因为只有你的返回类型才能阻止它被调用,而其他人阅读你的代码(或者你在几周内)很容易被这个事实搞糊涂。此外,我非常确定不需要使用@FXML注释该方法。