簡體   English   中英

如何在JavaFX中對齊按鈕?

[英]How to align a button right in JavaFX?

如何使此窗口上的“右”(第二個)按鈕右對齊?

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

謝謝

樣品溶液

這是一個提供左對齊和右對齊按鈕的示例:

對准

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方法根本不執行任何操作,因為按鈕內沒有可用的額外空間,以便按鈕的內部內容在內部對齊。

要進一步理解這一點,請閱讀: 調整和對齊節點的提示 (強烈推薦)。

在對齊其他窗格類型時

還有許多其他布局窗格 (例如AnchorPane,GridPane等),可用於完成類似的布局。 不同的布局窗格具有不同的功能和API。 這意味着您處理常見布局問題(如對齊)的方式因它們而異(您需要查閱其API以了解如何為每種布局窗格類型執行此操作)。

如果要控制布局窗格中的對齊,則必須使用上面演示的spacer,或者在節點上設置其他窗格級別約束。 在各種布局類型上設置約束的示例是以下方法(其中一些是靜態的):

以上只是示例,有許多方法可以對齊節點,例如通過設置BorderPane的頂部,中心或右側屬性。

為什么FlowPane對你想要完成的事情並不是很好

您可以通過將FlowPane的Orientation設置為vertical並調用flowPane.setColumnHalignment(Pos.CENTER_RIGHT)來右鍵對齊FlowPane中的節點。 但是,右邊對齊FlowPane中的所有內容,而不是左邊的一個內容,右邊的另一個內容,這就是你要做的事情。

我不確定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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM