如果要對JavaFX 2.0中所有不同的布局窗格進行概述,或者想了解有關它們的一些基本知識,請參閱我以前的文章《 JavaFX 2.0中的布局窗格》 。
布局窗格
HBox
和VBox
絕對是JavaFX 2.0中最基本的布局容器。 如您所知,它們的用途是將所有子級布置在一個水平行( HBox
)或一個垂直列( VBox
)中。 因為它們非常容易使用,并且對于較小的布局問題非常有用,所以您可能會經常使用它們。 我將給出兩個有關如何使用它們的示例。 與其他示例一樣,首先是代碼,然后是解釋。 HBox和VBox –示例1
?
import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;/**** Created on: 20.03.2012* @author Sebastian Damm*/
public class HBoxandVBoxExample extends Application
{@Overridepublic void start(Stage primaryStage) throws Exception{ HBox hbox = new HBox(50);hbox.setAlignment(Pos.CENTER); // default TOP_LEFTVBox vbox1 = new VBox();vbox1.setAlignment(Pos.BOTTOM_CENTER);vbox1.setStyle("-fx-border-style: solid;"+ "-fx-border-width: 1;"+ "-fx-border-color: black");VBox vbox2 = new VBox(10);vbox2.setAlignment(Pos.CENTER);vbox2.setStyle("-fx-border-style: solid;"+ "-fx-border-width: 1;"+ "-fx-border-color: black");VBox vbox3 = new VBox(20);vbox3.setAlignment(Pos.TOP_CENTER);vbox3.setStyle("-fx-border-style: solid;"+ "-fx-border-width: 1;"+ "-fx-border-color: black");for (int i = 0; i < 5; i++){Button bt = new Button("Button " + (i+1));Button bt2 = new Button("Button " + (i+1)); // unfortunately there′s no "clone" or "copy" methodButton bt3 = new Button("Button " + (i+1));vbox1.getChildren().add(bt);vbox2.getChildren().add(bt2);vbox3.getChildren().add(bt3);}hbox.getChildren().addAll(vbox1, vbox2, vbox3);Scene scene = new Scene(hbox, 350, 250); // the hbox is the root nodeprimaryStage.setTitle("HBox and VBox Example");primaryStage.setScene(scene);primaryStage.show();}public static void main(String[] args){Application.launch(args);}
}
基本上,我們創建三個不同的VBox,并將它們放入一個HBox中。 在這兩個類中,您都可以直接在構造函數中或通過
setSpacing
方法定義間距值。 此值將用作窗格中各個子項之間的間隙。 行HBox hbox = new HBox(50);
因此創建一個HBox來容納三個VBox,每個VBox之間的間隔為50像素。 我們使用
setAlignment
方法來指定各個VBox如何安排和布局所有子級。 使用
setStyle
可以將自定義CSS樣式應用于任何Node
。 我不想進一步詳細介紹,因為我將在下一篇文章中介紹JavaFX 2.0中CSS樣式,但是如果您已經熟悉CSS,那么您可能已經注意到JavaFX 2.0團隊幸運的是,我決定非常嚴格地遵循W3C( http://www.w3.org )定義CSS標準。 如果您不熟悉CSS,則只需要知道CSS的這些行會在組件周圍創建1px寬的黑色邊框。 我在這里使用它們來顯示各個VBox的大小。 現在,接下來的幾行對于您來說應該已經很普通了:我們為每個VBox創建五個按鈕,將不同的VBox放入我們的HBox中,聲明一個
Scene
對象(以HBox
為根)并顯示我們的應用程序。 您的應用程序現在應如下所示:
您可以看到每個
VBox
以定義的間距值布置其子按鈕, HBox
布置三個VBox且間距為50像素。 因為我們為每個VBox
設置了不同的對齊方式,所以您可以看到它們以特定方式將按鈕排列在其邊界內。 注意:我們還為
HBox
指定了路線,否則三個VBox不會布置在中間! 如果您調整應用程序窗口的大小,則應如下所示:
您可以看到VBoxes不斷增長并填充了其父級提供的空間,并且它們仍根據其設置的對齊方式排列其子級。
HBox和VBox –示例2
下一個示例將顯示如何使用靜態
setMargin
和setHgrow
(分別為setVgrow
)方法: import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.stage.Stage;/**** Created on: 20.03.2012* @author Sebastian Damm*/
public class HBoxandVBoxExample2 extends Application
{@Overridepublic void start(Stage primaryStage) throws Exception{ StackPane root = new StackPane();HBox hbox = new HBox(30); // create a HBox to hold 2 vboxes // create a vbox with a textarea that grows verticallyVBox vbox = new VBox(10); Label lbName = new Label("I′m a label!");TextField textField = new TextField();TextArea textArea = new TextArea();textArea.setPrefWidth(100);VBox.setVgrow(textArea, Priority.ALWAYS); vbox.getChildren().addAll(lbName, textField, textArea);// create a vbox that grows horizontally inside the hboxVBox vbox2 = new VBox(10); Label lbName2 = new Label("I′m also a label!");TextField tf2 = new TextField();tf2.setPromptText("type here");TextArea textArea2 = new TextArea();textArea2.setPrefWidth(100);vbox2.getChildren().addAll(lbName2, tf2, textArea2);HBox.setHgrow(vbox2, Priority.ALWAYS);// the next two lines behave equally - try to comment the first line out and use the 2nd linehbox.setPadding(new Insets(20));
// StackPane.setMargin(hbox, new Insets(20));hbox.getChildren().addAll(vbox, vbox2);root.getChildren().add(hbox);Scene scene = new Scene(root, 500, 300); // the stack pane is the root nodeprimaryStage.setTitle("HBox and VBox Example 2");primaryStage.setScene(scene);primaryStage.show(); }public static void main(String[] args){Application.launch(args);}
}
在此示例中,我們創建了兩個VBox,它們是HBox的子級。 VBox內有一個標簽,一個文本字段和一個文本區域。
第一行是
VBox.setVgrow(textArea, Priority.ALWAYS)
。 我們定義的這行代碼是,如果TextArea
對象包含在VBox
則它應始終垂直增長(否則,將不會有任何效果)。 接下來,將重點放在HBox.setHgrow(vbox2, Priority.ALWAYS)
。 在這里,我們告訴第二個VBox
在HBox
內水平生長。 最后使用
hbox.setPadding(new Insets(20));
或StackPane.setMargin(hbox, new Insets(20))
我們給整個HBox
填充一些內容。 這兩行在這里表現相同,因為一方面我們為窗格本身指定了一個填充,窗格應該在其邊界內使用填充來布置其子級,而另一方面,我們告訴父級使用給定的布局對窗格進行布局它周圍的邊緣。 注意:邊距是外部距離/間隙,填充內部距離/間隙。
這是一張為您展示“ CSS Box Model”的圖片,它演示了內容,填充,邊框和元素邊距之間的關系。
資料來源:w3Schools.com
因為
setPadding
方法是在Region
類中定義的,所以每個布局窗格都可以使用此方法。 Insets
類通常用于這些目的,并提供了兩種不同的構造函數:一種采用一個double值并為每側定義相同的填充,而一個構造函數采用4個double值并從上至左順時針定義填充。 提示:如果將邊框應用于
HBox
并在兩行之間切換以設置填充/邊距,您會更清楚地看到差異。 您的應用程序應如下所示:
注意HBox
周圍的10px填充。 如果現在調整窗口大小,則其外觀應類似于以下內容: 如您所見,左側的
VBox
的TextArea
垂直增長,而整個右側的VBox
在HBox
水平增長。
參考: JavaFX 2.0布局窗格–來自我們JCG合作伙伴 Sebastian Damm的HBox和VBox在Java博客上的Just my 2 cents 。
翻譯自: https://www.javacodegeeks.com/2012/07/javafx-20-layout-panes-hbox-and-vbox.html