如何使用 JavaFx 中的控制器类将绑定到舞台大小的控件定位?



>我在这个链接中发现了一些类似的东西如何在 JavaFX 的控制器文件中调用舞台上的函数

这是我在其中一个答案中找到的

阶段跟踪示例.java

public class StageTrackingSample extends Application {
  @Override public void start(final Stage stage) throws Exception {
final FXMLLoader loader = new FXMLLoader(
  getClass().getResource(
    "stagetracking.fxml"
  )
);
final Parent root = (Parent) loader.load();
final StageTrackingController controller = loader.getController();
controller.initData(stage);
stage.setScene(new Scene(root));
stage.show();
  }
  public static void main(String[] args) { launch(args); }
} 

舞台跟踪控制器.java

public class StageTrackingController {
@FXML private Label stageX;
public void initialize() {}  
public void initData(final Stage stage) {
 stageX.textProperty().bind(
  Bindings.format(
    "(%1$.2f, %2$.2f)", 
    stage.xProperty(), 
    stage.yProperty()
    )
   );
 }
}

我想将进度指示器放置在窗口中间,所以我在我的控制器类中尝试了这个控制器.java

 public void initInterface(Stage stage) {
       progressIndicator.layoutXProperty().bind(stage.widthProperty().divide(2));
       progressIndicator.layoutYProperty().bind(stage.heightProperty().divide(2));
 }

这在美因河中.java

public class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception{
    final FXMLLoader loader = new FXMLLoader(getClass().getResource("sample.fxml"));
    primaryStage.setTitle("Hello World");
    final Parent root = loader.load();
    final Controller controller = loader.getController();
    final Scene scene = new Scene(root);
    controller.initInterface(primaryStage);
    primaryStage.setScene(scene);
    primaryStage.show();
 }

public static void main(String[] args) {
    launch(args);
 }
}

即使我尝试将场景或锚窗格(在 fxml 文件中定义)作为参数传递到 initInterface 方法中,它也无法正常工作,似乎它在绑定进度指示器属性方面存在问题

通过使用 layoutXProperty 和 layoutYProperty 并将它们绑定到舞台的宽度和高度,您必须尝试将其放在舞台的右下角。 您可以更轻松地实现这一点,JavaFX 坚持要求您这样做,方法是在场景中使用布局并使场景填充整个相关区域。

"来自 layoutX 属性的 Javadocs:如果节点是托管的,并且将区域作为其父节点,则布局区域将根据其自己的布局策略设置 layoutX。如果节点不受组管理或父级,则应用程序可以直接设置 layoutX 来定位它。这意味着 LayoutX/Y 属性由父属性控制(因此它应该能够"设置"它们)。但是,当您绑定它们时,无法再设置它们,从而导致"无法设置绑定值"异常。

这里有一个关于区域以及如何在SceneBuilder中随意布局的好教程。 如果你没有使用SceneBuilder,我推荐它。 https://www.youtube.com/watch?v=zvgWgpGZVKc&list=PL6gx4Cwl9DGBzfXLWLSYVy8EbTdpGbUIG&index=35

最新更新