web-dev-qa-db-ja.com

JavaFXでのボタンの配置

[閉じる]ボタンを使用してこのJavaFXダイアログを作成しました。

_final int xSize = 300;
final int ySize = 280;
final Color backgroundColor = Color.WHITE;
final String text = "SQL Browser Version 1.0";

final Stage aboutDialog = new Stage();
aboutDialog.initModality(Modality.WINDOW_MODAL);

Button closeButton = new Button("Close");
closeButton.setAlignment(Pos.BOTTOM_CENTER);

closeButton.setOnAction(new EventHandler<ActionEvent>() {
    @Override
    public void handle(ActionEvent arg0) {
        aboutDialog.close();
    }
});

Scene aboutDialogScene = new Scene(VBoxBuilder.create()
    .children(new Text(text), closeButton)
    .alignment(Pos.CENTER)
    .padding(new Insets(10))
    .build(), xSize, ySize, backgroundColor);

aboutDialog.setScene(aboutDialogScene);
aboutDialog.show();
_

ダイアログの下部にボタンを表示したい。これを使用して配置を設定しました:closeButton.setAlignment(Pos.BOTTOM_CENTER);しかし、何らかの理由でボタンがダイアログの中央に表示されます。これを修正する方法を教えてください。

7
Peter Penzov

これにVBoxを使用する場合、探しているメソッドは次のとおりです。

VBox.setVgrow(node, Priority.ALWAYS);


デフォルトでは、VBoxは、配置した場所の左上から子を上下に配置するだけです。最大高さが制限されていない子にVgrow制約を設定しない限り、子は使用可能な垂直領域のすべてを埋めるために拡張されません。

探しているレイアウトを取得するためのいくつかの異なる方法(他にもあります):

  1. StackPaneの代わりにVBoxを使用し、ボタンをStackPane.setAlignment(closeButton, Pos.BOTTOM_CENTER);に合わせます。
  2. AnchorPaneの代わりにVBoxを使用し、AnchorPaneに制約を適切に設定します。
  3. 春の領域 を使用します。これは、空のスペースを埋めるために展開される空の領域です。

サンプルの春の地域:

_Region topSpring    = new Region();
Region bottomSpring = new Region();
Scene aboutDialogScene = new Scene(VBoxBuilder.create()
        .children(topSpring, new Text(text), bottomSpring, closeButton)
        .alignment(Pos.CENTER)
        .padding(new Insets(10))
        .build(), xSize, ySize, backgroundColor);
VBox.setVgrow(topSpring, Priority.ALWAYS);
VBox.setVgrow(bottomSpring, Priority.ALWAYS);
_

closeButton.setAlignment(Pos.BOTTOM_CENTER);を呼び出すと、親内のcloseButtonの配置ではなく、closeButton内の物(テキストとグラフィック)の配置が設定されます(これは本当に必要なことです)。


レイアウト制約がどのように機能するかを理解するには、 SceneBuilder を試してみるのに適したツールであり、 ScenicView は既存のコードのレイアウトの問題をデバッグするのに役立ちます。


さまざまなレイアウトオプションがどのように機能するかを確認するためにSceneBuilderにロードできるレイアウトのFXMLサンプルをいくつか示します。

以下のサンプルはすべて、必要に応じてJavaFXAPIを使用してプレーンJavaで簡単に記述できます。SceneBuilderでレイアウトを簡単にプレビューできるようにするため、fxmlで記述しました。

StackPaneを使用したFXMLサンプル:

_<?xml version="1.0" encoding="UTF-8"?>

<?import Java.lang.*?>
<?import Java.util.*?>
<?import javafx.geometry.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.Paint.*?>

<StackPane id="StackPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="280.0" prefWidth="300.0" xmlns:fx="http://javafx.com/fxml">
  <children>
    <Label text="SQL Browser Version 1.0" />
    <Button mnemonicParsing="false" text="Button" StackPane.alignment="BOTTOM_CENTER" />
  </children>
  <padding>
    <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
  </padding>
</StackPane>
_

snapshot of fxml

そして、いくつかの春の地域でも同じことが言えます。

_<?xml version="1.0" encoding="UTF-8"?>

<?import Java.lang.*?>
<?import Java.util.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.Paint.*?>

<VBox alignment="CENTER" prefHeight="280.0" prefWidth="300.0" xmlns:fx="http://javafx.com/fxml">
  <children>
    <Region prefHeight="-1.0" prefWidth="-1.0" VBox.vgrow="ALWAYS" />
    <Label text="SQL Browser Version 1.0" />
    <Region prefHeight="-1.0" prefWidth="-1.0" VBox.vgrow="ALWAYS" />
    <Button mnemonicParsing="false" text="Close" />
  </children>
</VBox>
_

そして、VBoxの空のスペースを埋めるために展開するように設定されたラベル自体と同じこと:

_<?xml version="1.0" encoding="UTF-8"?>

<?import Java.lang.*?>
<?import Java.util.*?>
<?import javafx.geometry.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.Paint.*?>

<VBox alignment="CENTER" prefHeight="280.0" prefWidth="300.0" xmlns:fx="http://javafx.com/fxml">
  <children>
    <Label maxHeight="1.7976931348623157E308" text="SQL Browser Version 1.0" VBox.vgrow="ALWAYS" />
    <Button mnemonicParsing="false" text="Close" />
  </children>
  <padding>
    <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
  </padding>
</VBox>
_
18
jewelsea