如何集中JavaFX控件

更具体地说,为什么我的JavaFX控件没有居中? 这是两个截图,第一个刚开始后(我将窗口移动到一个更明显的位置,但尚未resize),第二个是在调整它以显示我的问题之后。 如果你帮我确认它的大小(在所有DPI上),当它第一次显示时,奖励积分:

一个标题为“正在检查”的小窗口,只有一小段内容,位于自己的代码之上同一场景,但窗口现在显示标题“正在检查更新...”,其内容更明显,组件在哪里居中,但不是他们的内容。

方便地,相关代码包含在那些屏幕截图中。 如果您仍然需要它作为文本,请转到:

private void initJFXPanel(JFXPanel holder) { { { rootGrid = new GridPane(); rootGrid.setAlignment(Pos.CENTER); rootGrid.setPadding(new Insets(16)); rootGrid.setHgap(16); rootGrid.setVgap(8); } interior = holder.getScene(); if (interior == null) holder.setScene(interior = new Scene(rootGrid)); interior.setRoot(rootGrid); } { statusLabel = new Label("Checking for Updates..."); statusLabel.setAlignment(Pos.CENTER); statusLabel.setTextAlignment(TextAlignment.CENTER); rootGrid.add(statusLabel, 0, 0); } { progressBar = new ProgressBar(); progressBar.setProgress(-1); progressBar.setPrefWidth(Constants.MAX_WIN_BOUNDS.width / 5d); // 1/5 the width of the screen rootGrid.add(progressBar, 0, 1); } { downloadButton = new Button("Get it!"); downloadButton.setAlignment(Pos.CENTER); rootGrid.add(downloadButton, 0, 2); } holder.setMinimumSize(new Dimension((int)(rootGrid.getPrefWidth() + .5), (int)(rootGrid.getPrefHeight() + .5))); setMinimumSize(holder.getMinimumSize()); } 

将控件放在VBox(或其他类似的根布局窗格)中, 并将VBox对齐设置为居中。

布局建议

这是我在JavaFX中开始布局时的个人建议(这只是建议,并不适用于所有人,你可以接受或保留):

  • 您的窗口以及所有控件和布局将自动调整为首选大小。
  • 让内置布局管理器和布局系统尽可能多地为您进行计算,只需提供获得结果所需的最小布局提示即可。
  • 坚持只使用JavaFX或仅使用Swing代码,直到您熟悉这两种代码开发风格并真正需要混合它们。
  • 使用SceneBuilder工具来使用不同的布局并熟悉JavaFX布局机制。
  • 研究JavaFX布局教程 。
  • 查看有关JavaFX布局的演示文稿 。
  • 屏幕调用stage.centerOnScreen()使舞台居中 。
  • 考虑使用Java 8u40的内置对话支持(当它发布时)。

Hi-dpi支持

看到答案:

  • JavaFX 8 HiDPI支持

基于FXML的对话框示例代码

更新检查

您可以在SceneBuilder中加载以下内容以轻松显示它:

                

调整问题大小

确保为JFrame添加大小

 frame.setSize(500, 300); 

中心问题

我不确定你是否正在将框架或GridPane的JavaFX控件集中GridPane ,所以我要为它们添加答案

帧屏幕居中

 Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); frame.setLocation(dim.width/2-frame.getSize().width/2, dim.height/2-frame.getSize().height/2); 

截图

GridPane儿童居中

你需要添加

 GridPane.setHalignment(child, HPos.CENTER); 

对你的代码,删除其余不必要的代码

我编辑了你的代码:

 { Label statusLabel = new Label("Checking for Updates..."); //statusLabel.setAlignment(Pos.CENTER); //statusLabel.setTextAlignment(TextAlignment.CENTER); rootGrid.add(statusLabel, 0, 0); GridPane.setHalignment(statusLabel, HPos.CENTER); } { ProgressBar progressBar = new ProgressBar(); progressBar.setProgress(-1); progressBar.setPrefWidth(400); // 1/5 the width of the screen rootGrid.add(progressBar, 0, 1); } { Button downloadButton = new Button("Get it!"); //downloadButton.setAlignment(Pos.CENTER); rootGrid.add(downloadButton, 0, 2); GridPane.setHalignment(downloadButton, HPos.CENTER); } 

结果是

在此处输入图像描述