JavaFX 在关于组件的初始化之后设置 SplitPane 分隔符
JavaFX Setting SplitPane divider after init regarding components
我想将我的 SplitPane 分隔线设置为 "specific" 起始位置,这样,考虑到了 window.
的组成部分
有一个修复起始大小的 TableView,但 window 大小可能不同。所以我想在开始时设置分隔线位置,这样 table 就完全可见,分隔线就在它旁边。
到目前为止,我在 public void initialize()
:
中有以下代码
控制器:
@FXML
SplitPane splitPane;
@FXML
TreeTableView treeTable;
public void initialize() {
getStage().addEventHandler(WindowEvent.WINDOW_SHOWN, new EventHandler<WindowEvent>() {
@Override
public void handle(WindowEvent event) {
double tableWidth = treeTable.getWidth();
double stageWidth = getStage().getWidth();
splitPane.setDividerPositions(tableWidth / stageWidth);
}
});
}
FXML:
<SplitPane fx:id="splitPane">
<items>
<TreeTableView fx:id="treeTable" prefWidth="280">
<!-- table -->
</TreeTableView>
<AnchorPane fx:id="anchorPane">
<!-- anchor pane -->
</AnchorPane>
</items>
</SplitPane>
但它不起作用,因为此时 Stage 为空。
所以问题是还没有加载所有内容,因此要解决此问题,您可以在 Main 启动函数的末尾调用它,如下所示
主要:
public class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception{
FXMLLoader loader = new FXMLLoader(getClass().getResource("/Sample.fxml"));
Scene scene = new Scene(loader.load());
primaryStage.setScene(scene);
Controller controller = loader.getController();
controller.setStartingPosition(primaryStage);
primaryStage.show();
}
public static void main(String[] args) { launch(args); }
}
控制器:
public class Controller {
public SplitPane splitPane;
public TreeTableView treeTable;
public AnchorPane anchorPane;
public void setStartingPosition(Stage stage){
stage.addEventHandler(WindowEvent.WINDOW_SHOWN, new EventHandler<WindowEvent>() {
@Override
public void handle(WindowEvent event) {
double tableWidth = treeTable.getWidth();
double stageWidth = stage.getWidth();
splitPane.setDividerPositions(tableWidth / stageWidth);
}
});
}
}
我不知道这是否有效,因为我没有你所说的 "other components" 所以请告诉我这是否有效,对我来说两种方式看起来都一样
我想将我的 SplitPane 分隔线设置为 "specific" 起始位置,这样,考虑到了 window.
的组成部分
有一个修复起始大小的 TableView,但 window 大小可能不同。所以我想在开始时设置分隔线位置,这样 table 就完全可见,分隔线就在它旁边。
到目前为止,我在 public void initialize()
:
中有以下代码
控制器:
@FXML
SplitPane splitPane;
@FXML
TreeTableView treeTable;
public void initialize() {
getStage().addEventHandler(WindowEvent.WINDOW_SHOWN, new EventHandler<WindowEvent>() {
@Override
public void handle(WindowEvent event) {
double tableWidth = treeTable.getWidth();
double stageWidth = getStage().getWidth();
splitPane.setDividerPositions(tableWidth / stageWidth);
}
});
}
FXML:
<SplitPane fx:id="splitPane">
<items>
<TreeTableView fx:id="treeTable" prefWidth="280">
<!-- table -->
</TreeTableView>
<AnchorPane fx:id="anchorPane">
<!-- anchor pane -->
</AnchorPane>
</items>
</SplitPane>
但它不起作用,因为此时 Stage 为空。
所以问题是还没有加载所有内容,因此要解决此问题,您可以在 Main 启动函数的末尾调用它,如下所示
主要:
public class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception{
FXMLLoader loader = new FXMLLoader(getClass().getResource("/Sample.fxml"));
Scene scene = new Scene(loader.load());
primaryStage.setScene(scene);
Controller controller = loader.getController();
controller.setStartingPosition(primaryStage);
primaryStage.show();
}
public static void main(String[] args) { launch(args); }
}
控制器:
public class Controller {
public SplitPane splitPane;
public TreeTableView treeTable;
public AnchorPane anchorPane;
public void setStartingPosition(Stage stage){
stage.addEventHandler(WindowEvent.WINDOW_SHOWN, new EventHandler<WindowEvent>() {
@Override
public void handle(WindowEvent event) {
double tableWidth = treeTable.getWidth();
double stageWidth = stage.getWidth();
splitPane.setDividerPositions(tableWidth / stageWidth);
}
});
}
}
我不知道这是否有效,因为我没有你所说的 "other components" 所以请告诉我这是否有效,对我来说两种方式看起来都一样