如何使此窗口上的“右”(第二个)按钮右对齐?

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()
  }
}

谢谢

最佳答案

sample 溶液

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

java - 如何在JavaFX中右对齐按钮?-LMLPHP

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完成右对齐,我在左对齐节点和右对齐节点之间插入了一个可变宽度的间距 Pane ,该 Pane 将所有右对齐节点推到右侧。我在最小大小上添加了各种其他限制,以便使完整按钮文本始终可见,并且在使窗口变小时,左右对齐的节点之间始终存在很小的间隙。

在setAlignment()上

button.setAlignment() 方法对您似乎不起作用的原因是,它没有按照您认为的那样做。 setAlignment用于在按钮超过其首选宽度时对齐按钮内的文本。请参见setAlignment javadoc:



按钮的默认最大宽度是其首选宽度,因此,除非您使用button.setMaxWidth(Double.MAX_VALUE)显式设置按钮的最大宽度,否则按钮的大小不会增加。这意味着,默认情况下,setAlignment方法将什么也不做,因为在按钮内没有可用的额外空间可用于内部对齐按钮的内部内容。

为了进一步了解这一点,请阅读:Tips for Sizing and Aligning Nodes(强烈建议)。

关于其他 Pane 类型的对齐

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

如果要控制布局 Pane 中的对齐方式,则必须使用如上所示的垫片,或在节点上设置其他 Pane 级别约束。以下是一些对各种布局类型设置约束的方法(其中一些是静态的):
  • hBox.setAlignment(Pos)(对齐VBox中的所有节点)
  • AnchorPane.setRightAnchor(Node, Double)(在AnchorPane中 anchor 定给定节点)。
  • stackPane.setAlignment(Pos)(对齐StackPane中的所有节点)
  • StackPane.setAlignment(Node, Pos)(对齐StackPane中的特定节点)

  • 以上仅是示例,还有许多对齐节点的方法,例如,通过设置BorderPane的top,center或right属性。

    为什么FlowPane对您要完成的工作并不真正有效

    您可以通过将FlowPane's Orientation设置为vertical并调用flowPane.setColumnHalignment(Pos.CENTER_RIGHT)来在FlowPane中使节点右对齐。但是,该右侧将FlowPane中的所有内容对齐,而不是将左侧对齐,而将右侧对齐,这就是您要执行的操作。

    关于java - 如何在JavaFX中右对齐按钮?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39214586/

    10-12 00:20
    查看更多