第一次在我的最终项目中使用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();
}
你能告诉我我的代码有什么问题吗? 谢谢
答案 0 :(得分:1)
问题是:您使用的是BorderPane
。但是,BorderPane
仅显示使用相应属性添加的top
,center
,bottom
,right
和left
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
注释该方法。