如何在JavaFX中对齐按钮?

时间:2016-08-29 20:22:43

标签: java javafx javafx-8

如何使"正确" (第二个)此窗口上的按钮是否右对齐?

class HelloApp extends Application {
  override def start(primaryStage: Stage): Unit = {
    val root = new FlowPane(Orientation.VERTICAL) {
      setPadding(new Insets(10, 10, 10, 10))
      setVgap(10)
      getChildren.add(new Button("Left"))
      getChildren.add(new Button("Right") { setAlignment(Pos.CENTER_RIGHT) }) // this doesn't seem to be working
    }

    primaryStage.setScene(new Scene(root, 400, 400))
    primaryStage.show()
  }
}

由于

2 个答案:

答案 0 :(得分:10)

示例解决方案

这是一个提供左对齐和右对齐按钮的示例:

alignment

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.*;
import javafx.stage.Stage;

public class HelloApp extends Application {
  public static void main(String[] args) {
    launch(args);
  }

  @Override
  public void start(Stage primaryStage) throws Exception {
    HBox root = new HBox();
    root.setPadding(new Insets(10, 10, 10, 10));

    final Button left = new Button("Left");
    left.setMinSize(Button.USE_PREF_SIZE, Button.USE_PREF_SIZE);
    final Pane spacer = new Pane();
    HBox.setHgrow(spacer, Priority.ALWAYS);
    spacer.setMinSize(10, 1);
    final Button right = new Button("Right");
    right.setMinSize(Button.USE_PREF_SIZE, Button.USE_PREF_SIZE);

    root.getChildren().addAll(left, spacer, right);

    primaryStage.setScene(new Scene(root, 400, 400));
    primaryStage.show();
  }
}

此解决方案是用Java代码而不是Scala提供的,因为我没有在Scala中编程。但它应该很容易翻译成等效的Scala代码。

说明

我选择了HBox,因为对我来说,这是最常见的希望左右对齐的例子。但是这里没有真正的对与错,并且使用其他布局类型(如AnchorPane)来实现所需的结果也可以为您提供一个很好的解决方案。

要完成与HBox的正确对齐,我在左对齐节点和右对齐节点之间插入一个可变宽度间隔窗格,将所有右对齐节点向右推。我在最小尺寸上添加了各种附加约束,以便完整按钮文本始终可见,因此当您使窗口变小时,左右对齐节点之间始终存在小间隙。

在setAlignment()

button.setAlignment()方法似乎不适合你的原因是它没有按你认为的那样做。 setAlignment用于在按钮增长超过其首选宽度时对齐按钮内的文本。请参阅setAlignment javadoc:

  

指定当Labeled中有空格时,如何对齐Labeled中的文本和图形。

按钮的默认最大宽度是其首选宽度,因此除非使用button.setMaxWidth(Double.MAX_VALUE)显式设置其最大宽度,否则按钮的大小不会增大。这意味着,默认情况下,setAlignment方法根本不执行任何操作,因为按钮内没有可用的额外空间,以便按钮的内部内容在内部对齐。

要进一步理解这一点,请阅读:Tips for Sizing and Aligning Nodes(强烈推荐)。

对齐其他窗格类型

还有许多其他layout panes(例如AnchorPane,GridPane等),可用于完成类似的布局。不同的布局窗格具有不同的功能和API。这意味着您处理常见布局问题(如对齐)的方式因它们而异(您需要查阅其API以了解如何为每种布局窗格类型执行此操作)。

如果要控制布局窗格中的对齐,则必须使用上面演示的spacer,或者在节点上设置其他窗格级别约束。在各种布局类型上设置约束的示例包括以下方法(其中一些是静态的):

以上只是示例,有许多方法可以对齐节点,例如通过设置BorderPane的顶部,中间或右侧属性。

为什么FlowPane对你想要完成的事情不是很好

您可以通过将FlowPane's Orientation设置为垂直并调用flowPane.setColumnHalignment(Pos.CENTER_RIGHT)来右对齐FlowPane中的节点。然而,这个权利对齐FlowPane中的所有内容,而不是左边的一个东西,右边的另一个东西,这是你想要做的。

答案 1 :(得分:1)

我不确定FlowPane是否真的支持这一点。使用GridPane可以创建两列,并使用第一列消耗所有空间。像这样:

    GridPane pneButtons = new GridPane();

    ColumnConstraints col1 = new ColumnConstraints();
    col1.setHgrow(Priority.ALWAYS);
    pneButtons.getColumnConstraints().add(col1);

    Button btnRight = new Button("RIGHT");
    pneButtons.getChildren().add(btnRight);

    GridPane.setColumnIndex(btnRight, 1);