如何使此窗口上的“右”(第二个)按钮右对齐?
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()
}
}
谢谢
原文由 devoured elysium 发布,翻译遵循 CC BY-SA 4.0 许可协议
样品溶液
这是一个提供左对齐和右对齐按钮的示例:
这个解决方案是用 Java 代码而不是 Scala 提供的,因为我不使用 Scala 编程。但它应该很容易翻译成等效的 Scala 代码。
解释
我选择了一个 HBox,因为对我来说,这是最常见的希望左右对齐的例子。但是这里没有真正的对错,使用其他布局类型(例如 AnchorPane)来达到预期的结果也可以为您提供一个很好的解决方案。
为了使用 HBox 实现右对齐,我在左对齐节点和右对齐节点之间插入了一个可变宽度的间距窗格,这会将所有右对齐节点推向右侧。我在最小尺寸上添加了各种额外的限制,以便完整的按钮文本始终可见,并且当您缩小窗口时,左右对齐的节点之间始终存在一个小间隙。
关于 setAlignment()
button.setAlignment()
方法似乎对您不起作用的原因是它没有按照您的预期进行。 setAlignment 用于在按钮超过其首选宽度时对齐按钮内的文本。请参阅 setAlignment javadoc:按钮的默认最大宽度是其首选宽度,因此除非您使用
button.setMaxWidth(Double.MAX_VALUE)
明确设置其最大宽度,否则按钮的尺寸不会增加。这意味着,默认情况下,setAlignment 方法什么都不做,因为按钮内没有额外的可用空间来对齐按钮的内部内容。要进一步了解这一点,请阅读: Tips for Sizing and Aligning Nodes (强烈推荐)。
对齐其他窗格类型
还有许多其他 布局窗格(例如 AnchorPane、GridPane 等)可用于完成类似的布局。不同的布局窗格具有不同的功能和 API。这意味着您处理常见布局问题(例如对齐)的方式在它们之间是不同的(您需要查阅它们的 API 以了解如何针对每种布局窗格类型执行此操作)。
如果你想控制布局窗格内的对齐方式,你必须使用我上面演示的间隔器,或者在节点上设置额外的窗格级别约束。对各种布局类型设置约束的例子有以下方法(其中一些是静态的):
以上只是示例,还有更多对齐节点的方法,例如通过设置 BorderPane 的 top、center 或 right 属性。
为什么 FlowPane 对你想要完成的事情不是很好
您可以通过将 FlowPane 的方向 设置为垂直并调用 flowPane.setColumnHalignment(Pos.CENTER_RIGHT) 来右对齐 FlowPane 中的节点。但是,右对齐 FlowPane 中的所有内容,而不是一个东西向左对齐,另一个东西向右对齐,这正是您想要做的。