如何集中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); }
结果是