JavaFX幾種典型的布局策略
為了構造我們所需要的程序界面,我們會使用JavaFX提供的豐富的控件來實現這一目標。但是如何擺放這些控件的位置是一個重要的問題,JavaFX提供了一種特殊的控件,即面板Pane來解決這個問題,不同類型的面板采取不同的布局策略。我們可以根據實際的需要來選擇不同的面板,從而構造出我們所需要的界面。下面就介紹幾種常用的面板。
(一) FlowPane面板
它采用的布局策略是:按照控件的添加次序按個擺放,按照從上到下、從左到右的次序擺放。當舞台的大小發生變化后,場景的大小也自動跟着變化,面板的大小也跟着變化,並且會重新計算各個控件的位置,重新擺放各個控件的位置。
首先創建一個FlowPane對象,代碼如下:
FlowPane pane = new FlowPane();
pane.setPadding(new Insets(11, 12, 13, 14));
pane.setHgap(5);//設置控件之間的垂直間隔距離
pane.setVgap(5);//設置控件之間的水平間隔距離
創建兩個標簽對象、兩個文本輸入框和一個按鈕對象,代碼如下:
Label lbName = new Label("Please input a name:");
TextField tfName = new TextField();
Label lbPassword = new Label("Please input a password:");
TextField tfPassword = new TextField();
Button okbtn = new Button("OK");
將這幾個控件添加到面板中,代碼如下:
pane.getChildren().addAll(lbName,tfName,lbPassword,tfPassword,okbtn);
程序運行后界面如下所示:
當改變舞台大小時,界面如下:
(二) GridPane面板
它采用的布局策略是:將整個面板划分為若干個格子,每個格子的大小是一樣的,每個格子中可以放置一個控件,類似於表格的方式。
如下代碼創建了一個GridPane對象:
GridPane pane = new GridPane();
pane.setAlignment(Pos.CENTER);
pane.setPadding(new Insets(11.5, 12.5, 13.5, 14.5));
pane.setHgap(5.5);
pane.setVgap(5.5);
向面板中添加六個按鈕,代碼如下:
pane.add(new Button("1"), 0, 0);
pane.add(new Button("2"), 1, 0);
pane.add(new Button("3"), 0, 1);
pane.add(new Button("4"), 1, 1);
pane.add(new Button("5"), 0, 2);
pane.add(new Button("6"), 1, 2);
add方法的第二個和第三個參數是指定控件擺放的位置,分別表示所在的列和行,0是第一行和第一列。布局效果如下圖所示:
(三) BorderPane面板
它采用的布局策略是:將整個面板划分五個區域,分別是上、下、左、右、中,每個區域可以放置一個控件。
首先創建一個BorderPane對象,代碼如下:
BorderPane pane = new BorderPane();
然后在BorderPane對象的五個區域分別放置五個CustomPane對象,CustomPane是自定義面板,是為了方便放置標簽。代碼如下:
pane.setTop(new CustomPane("Top")); //放置在上面
pane.setRight(new CustomPane("Right"));//放置在右邊
pane.setBottom(new CustomPane("Bottom"));//放置在上面
pane.setLeft(new CustomPane("Left"));//放置在左邊
pane.setCenter(new CustomPane("Center"));//放置在中間
效果如下圖所示:
(四) HBox面板
HBox是將所有的控件放在同一行,無論有多少個控件都是放在同一行。
首先創建一個HBox對象,代碼如下:
HBox hBox = new HBox(15);
hBox.setPadding(new Insets(15, 15, 15, 15));
hBox.setStyle("-fx-background-color: gold");
然后,在面板上添加六個按鈕,代碼如下:
hBox.getChildren().add(new Button("one"));
hBox.getChildren().add(new Button("two"));
hBox.getChildren().add(new Button("three"));
hBox.getChildren().add(new Button("four"));
hBox.getChildren().add(new Button("five"));
hBox.getChildren().add(new Button("six"));
布局效果如下圖所示:
當舞台的大小改變時,所有的控件總是放在同一行,如下圖所示:
(五) VBox面板
VBox的布局策略與HBox類似,不過VBox是將所有的控件放在同一列。
首先創建一個VBox對象,代碼如下:
VBox vBox = new VBox(15);
vBox.setPadding(new Insets(15, 5, 5, 5));
然后,在VBox對象中添加六個按鈕,代碼如下:
vBox.getChildren().add(new Button("one"));
vBox.getChildren().add(new Button("two"));
vBox.getChildren().add(new Button("three"));
vBox.getChildren().add(new Button("four"));
vBox.getChildren().add(new Button("five"));
vBox.getChildren().add(new Button("six"));
布局效果如下圖所示:
以上五種面板的布局策略各有其特點,可以根據實際情況選取合適的面板進行布局。但很多時候如果只使用其中的一種面板,可能難以構造我們所需要的界面,這個時候可以將多種不同類型的面板結合起來使用,就可以達到我們所需要的效果。
當然,JavaFX提供的面板不止上面介紹的五種,其它的面板這里就不介紹了,有興趣的可以參考JDK文檔中的詳細介紹。
此外,為了方便我們構造界面,專門有一個配套的用於構造界面的工具軟件JavaFX Scene Builder,使用這個工具,我們就可以采用可視化的方式來構造界面,即所見即所得。