显示 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
仅显示使用适当 top
、center
、bottom
、right
和 left
=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
.
注释该方法
他是我第一次在我的最终项目中使用 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
仅显示使用适当 top
、center
、bottom
、right
和 left
=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
.