如何使"正确" (第二个)此窗口上的按钮是否右对齐?
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()
}
}
由于
答案 0 :(得分:10)
示例解决方案
这是一个提供左对齐和右对齐按钮的示例:
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);