java - 如何在 JavaFX 中正确对齐按钮?

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

谢谢

最佳答案

示例解决方案

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

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 实现右对齐,我在左对齐节点和右对齐节点之间插入了一个可变宽度的间距 Pane ,这会将所有右对齐节点推向右侧。我在最小尺寸上添加了各种额外的限制,以便完整的按钮文本始终可见,并且当您缩小窗口时,左右对齐的节点之间始终存在一个小间隙。

在 setAlignment() 上

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

Specifies how the text and graphic within the Labeled should be aligned when there is empty space within the Labeled.

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

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

关于对齐其他 Pane 类型

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

如果你想控制布局 Pane 内的对齐方式,你必须使用我上面演示的间隔器,或者在节点上设置额外的 Pane 级别约束。对各种布局类型设置约束的例子有以下方法(其中一些是静态的):

以上只是示例,还有很多方法可以对齐节点,例如设置 BorderPane 的 top、center 或 right 属性。 .

为什么 FlowPane 对您要实现的目标不是很好

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

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

相关文章:

java - Spring默认页面不经过Controller类

java - jooq 配置调用 sp 时的输入参数

JavaFx 8 - 相对于鼠标位置缩放/缩放 ScrollPane

Javafx 和 wav 文件

javafx - JavaFX中 slider 拇指的值

java - 使用 CSS3 无法覆盖 JavaFX 8 上 SplitPane 分隔线的颜色和大小

java - 在处理 RecyclerView 列表项时使用继承是一种反模式吗?

java - 我应该使用哪个字符集来解码java中的这个字节数组?

validation - JideFX 验证器不起作用

java - 当鼠标悬停在JavaFX中的按钮上时如何创建节点(圆形)?