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.mzph.cn/news/372172.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java ui自动化测试脚本,如何用Airtest编写UI自动化脚本(示例代码)

前言游戏并不像app一样直接把渲染树节点暴露出来,这就造成游戏UI自动化在元素定位上的不方便性,不过依赖airtest的图片识别,我们可以直接跳过元素检查,以图片对比的形式进行自动化,虽然效率可能会低一些,但…

django实现瀑布流、组合搜索、阶梯评论、验证码

django实现图片瀑布流布局 我们在一些图片网站上经常会看到,满屏都是图片,而且图片都大小不一,却可以按空间排列。默认一个div是占用一行,当想把div里的图片并排显示的时候,只能使用float属性,但是&#xf…

带有docx4j的Java Word(.docx)文档

几个月前,我需要创建一个包含许多表和段落的动态Word文档。 过去,我曾使用POI来实现此目的,但是我发现它很难使用,并且在创建更复杂的文档时对我来说效果不佳。 因此,对于这个项目,经过一番搜索&#xff0c…

mysql中distinct关键字,MySQL关键字Distinct的详细介绍

DDLPrepare SQL:?Prepare Data:?查询数据如下图所示:第一种情况,使用Distinct关键字,查询单列数据,如下图所示:结果:对 name 字段进行去重处理,符合预期期望&#xff0…

(二)windows下安装PHPCMS V9

一、准备工作 搭建环境 :参考:Windows下搭建PHP开发环境及相关注意事项PHPCMS V9 :下载适合自己 PHPCMS V9 版本到本地或服务器,下载地址:http://www.phpcms.cn/html/download/说明:官方提供了 2 种不同的编码。包括 G…

JavaFX 2.0布局窗格– HBox和VBox

如果要对JavaFX 2.0中所有不同的布局窗格进行概述,或者想了解有关它们的一些基本知识,请参阅我以前的文章《 JavaFX 2.0中的布局窗格》 。 布局窗格HBox和VBox绝对是JavaFX 2.0中最基本的布局容器。 如您所知,它们的用途是将所有子级布置在一…

单片机串行通信全解析

1.什么是串行通信? 串行通信(英语:Serial communication)是指在计算机总线或其他数据通道上,每次传输一个位元数据,并连续进行以上单次过程的通信方式。与之对应的是并行通信,它在串行端口上通过…

java type 类型,java中的泛型类型与Type接口

假设我们定义了一个Room的类,表示一个房间public classRoom(){}由于我们建造好房间是,不知道房间以后的用途,他可能用来住人,也有可能用来放货物,因此需要用到泛型。但是我们可能想获取Room这个房间里面进来的的东西的…

vray学习笔记(3)-多维子材质是个什么东西

多维子材质是个什么东西?为什么出现这个概念? 在3dsmax官方网站,我们可以看到它的定义: The Multi/Sub-Object material lets you assign different materials at the sub-object level of your geometry. 意思是多维子材质这个概…

Hello JavaFX 2.0:命令行介绍

我从博客文章Hello JavaFX 2.0:NetBeans 7.1 beta的介绍中,从NetBeans 7.1 beta的角度看了一个无处不在的Hello World示例的简单JavaFX版本。 在本文中,我将介绍仅使用命令行工具通过JavaFX实现的Hello World版本。 JavaFX 2.0 API文档包括ja…

oracle列分区,Oracle数据库分区--实例

分区表通过对分区列进行判断,把满足不同条件的分区列对应的记录保存在不同的分区中。一、何为分区表什么情况下会使用分区表?表中已有大量数据,或预计到表中将会保存大量的数据可以按照预期(月份、区域、dml)对表中的数据执行查询和更新什么是…

ZK实际应用:MVVM –与ZK客户端API一起使用

在之前的文章中,我们使用ZK的MVVM实现了以下功能: 将数据加载到表中 使用表单绑定保存数据 删除条目并以编程方式更新视图 ZK MVVM和ZK MVC实现方式之间的主要区别是,我们不直接在controller(ViewModel)类中访问和操…

终极JPA查询和技巧列表–第1部分

我们可以在Internet上找到一些JPA“如何做”,在本博客的此处,教您如何使用JPA执行多项任务。 通常,我看到有人问有关使用JPA进行查询的问题。 通常,为了回答此类问题,提供了几个链接,以尝试找到该问题的解决…

Spring集成–第2节–更多世界

这是Spring Integration Session 1的后续活动 第一部分是使用Spring Integration的简单Hello World应用程序。 我想通过考虑其他一些方案来进一步介绍它。 因此,对Hello World应用程序的第一个更改是添加网关组件。 要快速重新访问较早的测试程序,请执行…

oracle 会话实例,返璞归真:Oracle实例级别和会话级别的参数设置辨析

杨廷琨(yangtingkun)云和恩墨 CTO高级咨询顾问,Oracle ACE 总监,ITPUB Oracle 数据库管理版版主参数文件是Oracle数据库文件中级别最低,也是最基本的文件,但是也是数据库实例启动第一个涉及的文件。如果参数文件缺失或者某些参数设…

在多节点集群中运行Cassandra

这篇文章收集了我在多节点中设置Apache Cassandra集群的步骤。 在设置集群时,我已经参考了Cassandra Wiki和Datastax文档。 详细介绍了以下过程,分享了我建立群集的经验。 设置第一个节点 添加其他节点 监视集群– nodetool , jConsole &am…

Oracle 添加 scott 示例用户

学习SQL有一段时间了,但是也忘记的差不多了,今天有赶紧复习复习,然后发现一个问题,为啥之前看的视频教程,马士兵用的Oracle有scott用户和那些表格,而我的没有?难道是Oracle取消了?然…

win8oracle10g安装报错,Win8电脑安装Oracle 10g提示程序异常终止的解决方法

有win8系统用户反映说在安装Oracle 10g的时候,选择高级安装之后,就弹出一个窗口,提示程序异常终止,发生内部错误,导致Oracle 10g安装失败,该怎么解决这样的问题呢?下面随小编一起来看看Win8电脑…

<avatar: frontiers of pandora>技术overview

https://www.eurogamer.net/digitalfoundry-2023-avatar-frontiers-of-pandora-and-snowdrop-the-big-developer-tech-interview https://www.youtube.com/watch?vLRI_qgVSwMY&t394s 主要来自euro gamer上digital foundry对于avatar的开发团队Massive工作室的采访&#xf…

iOS 启动连续闪退保护方案

版权声明:本文由刘笑江原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/79 来源:腾云阁 https://www.qcloud.com/community 一.引言 “如果某个实体表现出以下任何一种特性,它就具备…