JavaFX 2.0布局窗格– GridPane

毫無疑問, GridPane是JavaFX 2.0中功能最強大,最靈活的布局窗格。
它在由行和列組成的靈活網格中布置其子項,與Swing的GridBagLayout或HTML的表格模型非常相似。 這種方法使該窗格非常適合于任何形式的表單(例如網站上的聯系表單)。

您有能力...

  • 將任何Node應用于GridPane的單元格(由列和行指定)
  • Node跨越多個列/行
  • 使Node在其所應用于的單元格中對齊
  • Node設置水平或垂直增長
  • 并保留要保留在單元中Node周圍的邊距。

GridPane的靈活性也擴展到了非常靈活的API。 您可以使用諸如setColumnIndex(node, index)setRowSpan(node, value)類的靜態類方法,也可以使用諸如gridpane.add(node, column, row, columnSpan, rowSpan)類的便捷實例方法。

注意:

  • GridPane的最大列數或行數,因為它會自動增長。
  • 一列的大小由該列中最寬的Node自動確定,每行的高度由該行中的最高Node確定。

最后一點可能是有關GridPane的最重要的事實,因為必須考慮每個單個Node的列/行和列跨度/行跨度,才能獲得所需的布局。
對于更復雜的布局,最好在一張紙上繪制布局,并為列和行繪制所有線條。 這將簡化開發,因為您可以直接查看每個Node必須放置在哪個單元格中以及它們必須跨越多少行或列。

讓我們看一下第一個簡單的例子:

GridPane –示例1

import javafx.application.Application;
import javafx.geometry.HPos;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;/*** Created on: 23.06.2012* @author Sebastian Damm*/
public class GridPaneExample extends Application
{@Overridepublic void start(Stage primaryStage) throws Exception{GridPane gridPane = new GridPane();gridPane.setPadding(new Insets(40, 0, 0, 50));gridPane.setHgap(5); gridPane.setVgap(5);Scene scene = new Scene(gridPane, 300, 150);Label lbUser = new Label('Username:');GridPane.setHalignment(lbUser, HPos.RIGHT);TextField tfUser = new TextField();Label lbPass = new Label('Password:');GridPane.setHalignment(lbPass, HPos.RIGHT);PasswordField tfPass = new PasswordField();Button btLogin = new Button('Login');GridPane.setMargin(btLogin, new Insets(10, 0, 0, 0));gridPane.add(lbUser, 0, 0);gridPane.add(tfUser, 1, 0);gridPane.add(lbPass, 0, 1);gridPane.add(tfPass, 1, 1);gridPane.add(btLogin, 1, 2);primaryStage.setTitle('GridPaneExample 1');primaryStage.setScene(scene);primaryStage.show();}public static void main(String[] args){   Application.launch(args);   }
}

在這里,您可以看到一個小的登錄表單,其中包含兩個標簽和兩個用于用戶名和密碼的文本字段。 此外,還有一個“登錄”按鈕。
在第21-23行中,我們創建GridPane并應用一些填充。 此外,您可以指定每個Node之間要保留的水平和垂直間隙。 接下來,看一下第28行:可以使用靜態類方法GridPane.setHalignment(Node node, HPos pos)分別設置GridPane.setValignment(Node node, VPos pos) GridPane.setHalignment(Node node, HPos pos)來設置Node在其放入的單元格邊界內的對齊方式。 GridPane.setValignment(Node node, VPos pos) 。 在第36行中,您可以看到如何通過使用GridPane.setMargin(Node node, Insets insets)方法在單個Node周圍放置單個邊距。 最后,在線路38至42,我們每個添加NodeGridPane并指定列和排Node

您的應用程序現在應如下所示:

在下一個示例中,您將看到為什么我們需要在更復雜的布局中設置每個Node的列跨度和行跨度。 看一下這段代碼:

GridPane –示例2:用戶表單

import javafx.application.Application;
import javafx.geometry.HPos;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.GridPane;
import javafx.scene.paint.Color;
import javafx.scene.paint.Paint;
import javafx.scene.paint.RadialGradientBuilder;
import javafx.scene.paint.Stop;
import javafx.stage.Stage;/*** Created on: 23.06.2012* @author Sebastian Damm*/
public class GridPaneExample2 extends Application
{private final Paint background = RadialGradientBuilder.create().stops(new Stop(0d, Color.TURQUOISE), new Stop(1, Color.web('3A5998'))).centerX(0.5d).centerY(0.5d).build();private final String LABEL_STYLE = '-fx-text-fill: white; -fx-font-size: 14;'+ '-fx-effect: dropshadow(one-pass-box, black, 5, 0, 1, 1);';@Overridepublic void start(Stage primaryStage) throws Exception{Scene scene = new Scene(createGridPane(), 370, 250, background);primaryStage.setTitle('GridPaneExample 2 - User form');primaryStage.setScene(scene);primaryStage.show();}private GridPane createGridPane(){GridPane gridPane = new GridPane();gridPane.setPadding(new Insets(20, 0, 20, 20));gridPane.setHgap(7); gridPane.setVgap(7);Label lbFirstName = new Label('First Name:');lbFirstName.setStyle(LABEL_STYLE);GridPane.setHalignment(lbFirstName, HPos.RIGHT);TextField tfFirstName = new TextField();Label lbLastName = new Label('Last Name:');lbLastName.setStyle(LABEL_STYLE);GridPane.setHalignment(lbLastName, HPos.RIGHT);TextField tfLastName = new TextField();Label lbCity = new Label('City:');lbCity.setStyle(LABEL_STYLE);GridPane.setHalignment(lbCity, HPos.RIGHT);TextField tfCity = new TextField();Label lbStreetNr = new Label('Street/Nr.:');lbStreetNr.setStyle(LABEL_STYLE);GridPane.setHalignment(lbStreetNr, HPos.RIGHT);TextField tfStreet = new TextField();tfStreet.setPrefColumnCount(14);GridPane.setColumnSpan(tfStreet, 2);TextField tfNumber = new TextField();tfNumber.setPrefColumnCount(3);Label lbNotes = new Label('Notes:');lbNotes.setStyle(LABEL_STYLE);GridPane.setHalignment(lbNotes, HPos.RIGHT);TextArea taNotes = new TextArea();taNotes.setPrefColumnCount(5);taNotes.setPrefRowCount(5);GridPane.setColumnSpan(taNotes, 3);GridPane.setRowSpan(taNotes, 2);    ImageView imageView = new ImageView(new Image(getClass().getResourceAsStream('person.png'), 0, 65, true, true));GridPane.setHalignment(imageView, HPos.LEFT);GridPane.setColumnSpan(imageView, 2);GridPane.setRowSpan(imageView, 3);//        gridPane.setGridLinesVisible(true);gridPane.add(lbFirstName, 0, 0); gridPane.add(tfFirstName, 1, 0);gridPane.add(imageView, 2, 0); gridPane.add(lbLastName, 0, 1);gridPane.add(tfLastName, 1, 1); gridPane.add(lbCity, 0, 2);gridPane.add(tfCity, 1, 2); gridPane.add(lbStreetNr, 0, 3);gridPane.add(tfStreet, 1, 3); gridPane.add(tfNumber, 3, 3);gridPane.add(lbNotes, 0, 4); gridPane.add(taNotes, 1, 4);return gridPane;}public static void main(String[] args){   Application.launch(args);   }
}

在此示例中,我們創建具有不同輸入和圖像的用戶表單。 為了使應用程序看起來更好,我為Scene的背景創建了RadialGradient ,并為每個標簽應用了白色字體顏色和一些陰影。

該應用程序應如下所示:

與前面的示例相比,第一個差異發生在第64行。
使用GridPane.setColumnSpan(tfStreet, 2); 我告訴這個TextField占據兩列。 這是必需的,因為我希望此文本字段比其他文本字段寬一點(請參見第63行)。 否則,第二列將與該文本字段一樣寬,因此將較小的文本字段拉伸。 TextArea (從第71行開始)和ImageView (從77行開始)跨越多個列和行。 接下來,看一下第83行。如果刪除注釋行并啟動應用程序,則它應如下所示:

如您所見,此方法使所有網格線(包括每個Node之間的水平和垂直間隙)可見,如果您的Nodes沒有按照您希望的方式對齊,這將是一個很大的幫助。
我不知道在學習Swing和GridBagLayout過程中我希望有多少次這樣的方法,我敢打賭我不是唯一的一個;)

最后,請刪除所有指定了列跨度或行跨度的行(第64、74、75、80、81行)。 這將幫助您了解列跨度和行跨度的必要性。

您會看到,每個Node占用一個單元格,并且布局非常混亂,因為每列/行的寬度/高度取決于最寬/最高的子Node

GridPane –示例3:setConstraints方法

實例方法add '提供了兩種版本,一種具有Node ,列和行,一種具有附加的列跨度和行跨度。 如前兩個示例中一樣,必須使用專用的類方法(例如GridPane.setHalignment來設置其他屬性(如對齊或增長)。

但是還有另一種不錯的方法: GridPane.setConstraints(...)方法。 目前(JavaFX 2.2) setConstraints(Node child, int columnIndex, int rowIndex)有五個此方法的重載版本setConstraints(Node child, int columnIndex, int rowIndex)

設置setConstraints(Node child, int columnIndex, int rowIndex, int columnspan, int rowspan, HPos halignment, VPos valignment, Priority hgrow, Priority vgrow, Insets margin)

這與Swing的GridBagConstraints非常相似,但是在這里您不必創建專用對象并將其重用于多個圖形對象。

如果將約束應用于這樣的每個Node ,則只需將Nodes添加到GridPane′s的子GridPane′s集合中即可。

使用這種方法,第二個示例的代碼如下所示:

private GridPane createGrid(){GridPane gridPane = new GridPane();gridPane.setPadding(new Insets(20, 0, 20, 20));gridPane.setHgap(7); gridPane.setVgap(7);Label lbFirstName = new Label('First Name:');lbFirstName.setStyle(LABEL_STYLE);GridPane.setConstraints(lbFirstName, 0, 0, 1, 1, HPos.RIGHT, VPos.CENTER);TextField tfFirstName = new TextField();GridPane.setConstraints(tfFirstName, 1, 0);Label lbLastName = new Label('Last Name:');lbLastName.setStyle(LABEL_STYLE);GridPane.setConstraints(lbLastName, 0, 1, 1, 1, HPos.RIGHT, VPos.CENTER);TextField tfLastName = new TextField();GridPane.setConstraints(tfLastName, 1, 1);Label lbCity = new Label('City:');lbCity.setStyle(LABEL_STYLE);GridPane.setConstraints(lbCity, 0, 2, 1, 1, HPos.RIGHT, VPos.CENTER);TextField tfCity = new TextField();GridPane.setConstraints(tfCity, 1, 2);Label lbStreetNr = new Label('Street/Nr.:');lbStreetNr.setStyle(LABEL_STYLE);GridPane.setConstraints(lbStreetNr, 0, 3, 1, 1, HPos.RIGHT, VPos.CENTER);TextField tfStreet = new TextField();tfStreet.setPrefColumnCount(14);GridPane.setConstraints(tfStreet, 1, 3, 2, 1);TextField tfNumber = new TextField();tfNumber.setPrefColumnCount(3);GridPane.setConstraints(tfNumber, 3, 3);Label lbNotes = new Label('Notes:');lbNotes.setStyle(LABEL_STYLE);GridPane.setConstraints(lbNotes, 0, 4, 1, 1, HPos.RIGHT, VPos.CENTER);TextArea taNotes = new TextArea();taNotes.setPrefColumnCount(5);taNotes.setPrefRowCount(5);GridPane.setConstraints(taNotes, 1, 4, 3, 2);ImageView imageView = new ImageView(new Image(getClass().getResourceAsStream('person.png'), 0, 65, true, true));GridPane.setConstraints(imageView, 2, 0, 3, 3, HPos.LEFT, VPos.CENTER);gridPane.getChildren().addAll(lbFirstName, tfFirstName, imageView, lbLastName, tfLastName, lbCity, tfCity, lbStreetNr, tfStreet, tfNumber, lbNotes, taNotes);return gridPane;}

您可以在第51-53行看到重載的setConstraints(...)方法的用法,以及如何將Nodes簡單地添加到GridPane

我希望我能對JavaFX 2.0中的GridPane進行很好的介紹。 隨時添加評論和發表問題。

參考: JavaFX 2.0布局窗格–來自我們JCG合作伙伴 Sebastian Damm的GridPane ,在Java博客上的Just my 2 cents上。


翻譯自: https://www.javacodegeeks.com/2012/07/javafx-20-layout-panes-gridpane.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/372172.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372172.shtml
英文地址,請注明出處:http://en.pswp.cn/news/372172.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

leecode 題解 || Merge k Sorted Lists 問題

problem: Merge k sorted linked lists and return it as one sorted list.Analyze and describe its complexity.Tags Divide and Conquer Linked List Heap合并K個已序單鏈表 thinking: (1)題目沒有要求不能夠新開ListNode,所以…

PHP在瀏覽器中被拒絕請求,php控制請求頁面瀏覽器緩

緩存的主要作用是防止用戶頻繁刷新網站頁面,導致服務器數據庫負擔,既要保證信息更新的及時性,也要保證緩存能被充分利用。http協議里控制瀏覽器緩存的頭有三個Cache-Control,Expires,Last-Modified,在PHP下…

js -03課 -03 js中的真假判斷

真假的問題:數據類型-數字(NaN)、字符串、布爾、函數、對象(elem、[]、{}、null)、未定義真:非0的數字、非空字符串、true、函數、能找到的元素、[]、{}假:0、NaN、空字符串、false、不能找到的…

HBASE啟動失敗,Failed construction of Master: class org.apache.hadoop.hbase.master.HMaster

Master日志錯誤:2015-12-02 06:34:32,394 ERROR [main] master.HMasterCommandLine: Master exitingjava.lang.RuntimeException: Failed construction of Master: class org.apache.hadoop.hbase.master.HMasterat org.apache.hadoop.hbase.master.HMaster.constru…

Java線程:我應該創建幾個

介紹 “我應該創建多少個線程?”。 許多年前,我的一個朋友問我這個問題,然后我按照“ CPU核心數 1”的指示給了他答案。 當您在這里閱讀時,大多數人都在點頭。 不幸的是,我們所有人當時都錯了。 現在,如果您…

java ui自動化測試腳本,如何用Airtest編寫UI自動化腳本(示例代碼)

前言游戲并不像app一樣直接把渲染樹節點暴露出來,這就造成游戲UI自動化在元素定位上的不方便性,不過依賴airtest的圖片識別,我們可以直接跳過元素檢查,以圖片對比的形式進行自動化,雖然效率可能會低一些,但…

Spring JDBC數據庫連接池設置

對于任何Java應用程序而言, 在Spring框架中設置JDBC數據庫連接池都是很容易的,僅需更改spring配置文件中的一些配置即可。使用Apache Commons DBCP和Commons Pool以及Spring框架的連接池是不錯的選擇,但是如果您擁有Web服務器和托管的J2EE容器…

BZOJ 3505 [Cqoi2014]數三角形(組合數學)

【題目鏈接】 http://www.lydsy.com/JudgeOnline/problem.php?id3505 【題目大意】 給定一個nxm的網格,請計算三點都在格點上的三角形共有多少個。   注意三角形的三點不能共線。 【題解】 我們計算三個點組合的情況,去除橫豎三共線,以及斜…

matlab多項式加法運算,matlab多項式運算與代數方程求解解析.ppt

* 多項式運算與代數方程求解 數學軟件 Matlab Matlab基礎及應用 * 多項式轉化為符號表達式:poly2sym 四則運算:conv、deconv 導數與積分:ployder、polyint 求值與零點:polyval、polyvalm、roots、poly 多項式運算 主要內容 代數方…

java.lang.NoClassDefFoundError:如何解決–第3部分

本文是我們的NoClassDefFoundError故障排除系列的第3部分。 正如我在第一篇文章中提到的那樣,有許多可能導致NoClassDefFoundError的問題。 本文將重點介紹該問題的最常見原因之一:Java類靜態初始化程序塊或變量的失敗。 將提供一個示例Java程序&#xf…

django實現瀑布流、組合搜索、階梯評論、驗證碼

django實現圖片瀑布流布局 我們在一些圖片網站上經常會看到,滿屏都是圖片,而且圖片都大小不一,卻可以按空間排列。默認一個div是占用一行,當想把div里的圖片并排顯示的時候,只能使用float屬性,但是&#xf…

通過ifrmae異步下載文檔

//通過ifrmae異步下載文檔 function iframeGetFile(opts) {var defaultOpts {filePath: ,onload: function (e) { }}, iframeFile;$.extend(defaultOpts, opts);iframeFile document.createElement("iframe");iframeFile.onload function (e) {defaultOpts.onload…

IO與NIO –中斷,超時和緩沖區

假設有一個系統有時需要將文件復制到幾個位置,但是這種方式在響應速度至關重要的情況下。 換句話說,如果由于某種原因文件系統過載,并且我們無法在不到一秒鐘的時間內寫入文件,則應該放棄。 ExecutorService是一項非常方便的工作工…

實驗5 matlab程序設計2,實驗5 Matlab程序設計2

實驗5 Matlab程序設計21. 實驗目的:2. 掌握建立和執行M文件的方法; 3. 掌握實現選擇結構的方法; 4. 掌握實現循環結構的方法。5. 熟悉利用向量運算來代替循環操作的方法。 6. 實驗內容:27. 根據61111 122232n2,求π的近…

【poj1041】 John's trip

http://poj.org/problem?id1041 (題目鏈接) 題意 給出一張無向圖,求字典序最小歐拉回路。 Solution 這鬼畜的輸入是什么心態啊mdzz,這里用vector儲存邊,便于邊的排序。瞬間變成STL常數boy →_→。 細節 數組大小把握好。 代碼 // poj1041 #i…

記一次ora-1652錯誤的解決過程

報錯現象: 通過v$RMAN_BACKUP_JOB_DETAILS查看備份狀態,一直卡著不出結果,很長一段時間之后拋出ORA-1652: unable to extend temp segment by 128 in tablespace ,此時查看臨時表空間使用情況,發現占用很少&#xff0c…

帶有docx4j的Java Word(.docx)文檔

幾個月前,我需要創建一個包含許多表和段落的動態Word文檔。 過去,我曾使用POI來實現此目的,但是我發現它很難使用,并且在創建更復雜的文檔時對我來說效果不佳。 因此,對于這個項目,經過一番搜索&#xff0c…

mysql中distinct關鍵字,MySQL關鍵字Distinct的詳細介紹

DDLPrepare SQL:?Prepare Data:?查詢數據如下圖所示:第一種情況,使用Distinct關鍵字,查詢單列數據,如下圖所示:結果:對 name 字段進行去重處理,符合預期期望&#xff0…

#pragma 預處理指令

Linux C 編程一站式學習 #pragma 預處理指示供編譯器實現一些非標準的特性,C 標準沒有規定 #pragma 后面應該寫什么以及起什么作用,由編譯器自己規定。有的編譯器用 #pragma 定義一些特殊功能寄存器名,有的編譯器用 #pragma 定位鏈接地址&…

px ,em ,rem

做移動端或者響應式的頁面必然需要字體的變化的。這次我就自己的經驗來說說他們之間的關系,以及怎么用。 px (絕對單位)是我們常用的就不說了。 em(相對單位,相對父級) em 指字體高,任意瀏覽器的默認字體高都是16px。所…