JavaFX 2.0布局窗格– FlowPane和TilePane

FlowPanesTilePanes是不错的布局窗格,如果您想一个接一个地连续地水平或垂直地布局子级,则可以。 它们彼此非常相似,因为它们都将子级布置成列(在水平Flow / TilePane的情况下)并按其宽度或行(在垂直Flow / TilePane的情况下)并在其高度处缠绕。

唯一的主要区别是, TilePane将所有TilePane放置在相同大小的图块中! 因此,将最大孩子的大小作为TilePane中每个单独瓦片的TilePane 。 因此, TilePane也是一种均等地调整按钮和其他控件的大小和对齐方式的好方法。 (请参阅我以前的文章《 在VBox或HBox内均等地调整按钮大小》 )

FlowPane和TilePane –示例1

import java.util.Random;
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.effect.DropShadow;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.*;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.scene.text.FontWeight;
import javafx.scene.text.Text;
import javafx.stage.Stage;/**** Created on: 24.03.2012* @author Sebastian Damm*/
public class FlowPaneAndTilePaneExample extends Application
{private Random random;private VBox root;        private FlowPane flowPane;private TilePane tilePane;@Overridepublic void start(Stage primaryStage) throws Exception{                random = new Random();root = new VBox(30);VBox upperVBox = createUpperVBox();VBox lowerVBox = createLowerVBox();fillPanesWithImages();root.getChildren().addAll(upperVBox, lowerVBox);Scene scene = new Scene(root, 800, 600, Color.ANTIQUEWHITE);primaryStage.setTitle("FlowPane and TilePane Example");primaryStage.setScene(scene);primaryStage.show();        }private VBox createUpperVBox(){VBox vbox = new VBox(20);Text textFlowPane = new Text("I am a FlowPane");textFlowPane.setFont(Font.font("Calibri", FontWeight.BOLD, 30));textFlowPane.setUnderline(true);textFlowPane.setEffect(new DropShadow());        VBox.setMargin(textFlowPane, new Insets(10, 0, 0, 10));flowPane = new FlowPane();flowPane.setHgap(5);flowPane.setVgap(5);vbox.getChildren().addAll(textFlowPane, flowPane);VBox.setMargin(vbox, new Insets(10));return vbox;}private VBox createLowerVBox(){VBox vbox = new VBox(20);Text textTilePane = new Text("I am a TilePane");textTilePane.setFont(Font.font("Calibri", FontWeight.BOLD, 30));textTilePane.setUnderline(true);        textTilePane.setEffect(new DropShadow());VBox.setMargin(textTilePane, new Insets(10, 0, 0, 10));tilePane = new TilePane();tilePane.setHgap(5);tilePane.setVgap(5);vbox.getChildren().addAll(textTilePane, tilePane);VBox.setMargin(vbox, new Insets(10));return vbox;}private void fillPanesWithImages(){for (int i = 1; i <= 6; i++){int imgSize = random.nextInt(128) + 1;Button bt = new Button();                        Image img = new Image(FlowPaneAndTilePaneExample.class.getResourceAsStream("images/person" + i + ".png"), imgSize > 50 ? imgSize : 50, 0, true, false);ImageView view = new ImageView(img);bt.setGraphic(view);flowPane.getChildren().add(bt);            Button bt2 = new Button();                        Image img2 = new Image(FlowPaneAndTilePaneExample.class.getResourceAsStream("images/person" + i + ".png"), imgSize > 50 ? imgSize : 50, 0, true, false);ImageView view2 = new ImageView(img2);bt2.setGraphic(view2);tilePane.getChildren().add(bt2);              }        }public static void main(String[] args){Application.launch(args);}
}

这个小应用程序通过将相同的内容放在两个窗格中来显示FlowPaneTilePane之间的主要区别。 这两个窗格都将放在另一个VBox ,顶部还有一个附加的Text

我假设到目前为止,只有FlowPane,TilePane和图像加载的代码才是新手。 如果您在理解此JavaFX代码时遇到问题,请参阅我以前的示例,从JavaFX 2.0的基础知识入手。

两个窗格提供除其他一个setHgapsetVgap方法来声明各列和各行之间的间隔。 为了填充按钮,我选择加载一些图像。

在JavaFX 2.0中,可以使用带有Image对象的ImageView来显示Image 。 ( 注意:这是javafx.scene.image.Image,而不是java.awt.image!)

然后可以将这样的ImageView应用于任何Labeled对象。 LabeledControl的子类,其中包括LabelButtonBase的抽象父类(这是每种按钮的基类),它使您可以为每种标签和按钮设置图像。

我的六个按钮都是128×128像素。 为了向您展示FlowPaneTilePane之间的FlowPane ,我选择了调整这些图像的大小。 目前,这只能直接在Image类的构造函数中实现,因为以后没有任何方法可以更改Image对象的大小。 一个构造函数使用InputStream ,两个宽度和高度的双精度值,和两个布尔值,用于保留图像的纵横比和'?smooth'属性。 如果要调整图像大小并保持宽高比,则可以指定宽度或高度,并通过传递“ true”作为第一个布尔值来保持宽高比。 使用“平滑”属性,您可以在更清晰或更快速的图像渲染之间进行选择。

根据为该大小生成的随机值,您的应用程序应如下所示:

您可以看到图像基本相同。 不同的是,该FlowPane后直接在另一只通过与规定的间隙隔开,勾画出所有图像setHgap方法,而TilePane把所有图像在相同尺寸的瓷砖。

FlowPane和TilePane –示例2

这是另一个小示例:正如本文的引言中所述, TilePane也是一种均等地调整按钮大小和对齐方式的好方法。 为了FlowPane显示FlowPaneTilePane之间的主要区别,将相同的元素再次放置在两个窗格中。

这是代码:

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Orientation;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Separator;
import javafx.scene.layout.*;
import javafx.scene.paint.Color;
import javafx.scene.paint.CycleMethod;
import javafx.scene.paint.RadialGradient;
import javafx.scene.paint.RadialGradientBuilder;
import javafx.scene.paint.Stop;
import javafx.scene.text.Font;
import javafx.stage.Stage;/**** Created on: 24.03.2012* @author Sebastian Damm*/
public class FlowPaneAndTilePaneExample2 extends Application
{private VBox root;        private FlowPane flowPane;private TilePane tilePane;@Overridepublic void start(Stage primaryStage) throws Exception{                root = new VBox();root.setAlignment(Pos.CENTER);initFlowPane();initTilePane();createButtons();root.getChildren().addAll(flowPane, new Separator(), tilePane);Scene scene = new Scene(root, 400, 300);RadialGradient background = RadialGradientBuilder.create().stops(new Stop(0d, Color.web("#fff")), new Stop(0.47, Color.web("#cbebff")), new Stop(1d, Color.web("#a1dbff")))                .cycleMethod(CycleMethod.NO_CYCLE).build();scene.setFill(background);primaryStage.setTitle("FlowPane and TilePane Example 2");primaryStage.setScene(scene);primaryStage.show();        }private void initFlowPane(){        flowPane = new FlowPane(Orientation.VERTICAL);flowPane.setHgap(5);flowPane.setVgap(5);        flowPane.setPrefHeight(200);flowPane.setAlignment(Pos.CENTER);VBox.setMargin(flowPane, new Insets(10));}private void initTilePane(){tilePane = new TilePane(Orientation.VERTICAL);tilePane.setHgap(5);tilePane.setVgap(5);tilePane.setPrefHeight(200);tilePane.setAlignment(Pos.CENTER);VBox.setMargin(tilePane, new Insets(10));}private void createButtons(){Button bt = new Button("1");bt.setMaxWidth(Double.MAX_VALUE);bt.setMaxHeight(Double.MAX_VALUE);Button bt2 = new Button("Button 1");bt2.setMaxWidth(Double.MAX_VALUE);bt2.setMaxHeight(Double.MAX_VALUE);Button bt3 = new Button("Button");bt3.setMaxWidth(Double.MAX_VALUE);bt3.setMaxHeight(Double.MAX_VALUE);bt3.setFont(Font.font("Cambria", 22));Button bt4 = new Button("1");bt4.setMaxWidth(Double.MAX_VALUE);bt4.setMaxHeight(Double.MAX_VALUE);Button bt5 = new Button("Button 1");bt5.setMaxWidth(Double.MAX_VALUE);bt5.setMaxHeight(Double.MAX_VALUE);Button bt6 = new Button("Button");bt6.setMaxWidth(Double.MAX_VALUE);bt6.setMaxHeight(Double.MAX_VALUE);bt6.setFont(Font.font("Helvetica", 22));flowPane.getChildren().addAll(bt, bt2, bt3);tilePane.getChildren().addAll(bt4, bt5, bt6);}public static void main(String[] args){Application.launch(args);}
}

再次根节点是一个VBoxFlowPane在上部区域和一个TilePane在下部区域。 代码中的某些部分可能对您来说是新的。 首先看一下44-51行。 在这里,我借助JavaFX 2.0中众多构建器类之一的帮助,为场景的背景创建了一个径向渐变。 稍后,我将在自己的文章中介绍渐变以及构建器模式,因此在这里我将不做过多解释。 现在,您只需要知道,这些线会创建一个放射状的背景,然后通过场景的setFill方法将其应用于场景。 (就像在前面的示例中一样,我们可以直接在场景的构造函数中指定背景填充,因为它需要一个Paint对象,该对象不仅包括普通颜色,还包括各种渐变)。

与第一个示例相反,这次我们使用垂直窗格,其中填充了按钮。 因为我想允许按钮增长到其父代提供的任何空间,所以我将每个按钮的最大高度和最大宽度设置为常量Double.MAX_VALUE 。 (如果您还没有在VBox或HBox中查看我之前的示例Sizing Buttons,请同样查看)

您的应用程序应如下所示:

正如你可以在这两个窗格看到的按钮长到其父的宽度,但只在TilePane按钮也垂直增长,因为在每一个瓦片TilePane是大小相等。 该示例可能看起来并不很重要,但是直到现在我在JavaFX 2.0中开发的应用程序中,我一直都希望按钮的大小和对齐方式均等,因为这是一个微妙的方面,它使您的应用程序看起来更加简洁。

如果您调整窗口大小,则其外观应如下所示:

请注意,一旦按钮不再在FlowPane垂直FlowPane ,按钮将仅占据其所需的空间(基于其内容),而在TilePane所有按钮的大小仍相等。

参考: JavaFX 2.0布局窗格–来自我们JCG合作伙伴 Sebastian Damm的FlowPane和TilePane ,在Java博客Just my 2 cents上。


翻译自: https://www.javacodegeeks.com/2012/07/javafx-20-layout-panes-flowpane-and.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/371934.shtml

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

相关文章

EasyRMS录播管理服务器项目实战:windows上开机自启动NodeJS服务

本文转自EasyDarwin开源团队成员Penggy的博客&#xff1a;http://www.jianshu.com/p/ef840505ae06 近期在EasyDarwin开源团队开发一款基于EasyDarwin在录播服务器EasyRMS过程中,我采用node作为EasyRMS录播服务器录播管理服务器的开发平台,基于node开发关于设备管理,录像计划,录…

windows10搭建django1.10.3+Apache2.4

很多教程都是在linux上搭建&#xff0c;windows上似乎天生不太适合&#xff0c;但是我还是愿意试试这个坑。 首先 交代一下自己的环境 python3.5.2 64位 django 1.10.3 apache 2.4 64位 windows 10 重点在apache上。 python 和django 相信有兴趣看这篇文章的基本上也都已经了解…

深入理解计算机系统 视频教程,深入理解计算机系统1

第一章 计算机系统漫游代码段的生命周期hello.c#include int main(){printf("hello world!\n");return 0;}1.1 前序源程序(源文件)实际上就是一个由0和1组成的位(又成比特bit)序列,8个位被组组成一组,称为字节。每个字节表示程序中的某些文本字符(大部分的现代计算机…

Java与iOS对话:Java对象与Apple plist序列化

我很高兴地宣布我的第一个开源项目java-plist-serializer可以帮助您将Java&#xff08;尤其是基于Spring的应用程序&#xff09;与iOS应用程序集成。 背景 我正在将Java Webapp作为后端并且客户端是iOS设备的项目。 最近&#xff0c;我收到了创建Web服务的任务&#xff0c;该服…

web.cofing(新手必看)

花了点时间整理了一下ASP.NET Web.config配置文件的基本使用方法。很适合新手参看&#xff0c;由于Web.config在使用很灵活&#xff0c;可以自定义一些节点。所以这里只介绍一些比较常用的节点。 <?xml version"1.0"?> <!--注意: 除了手动编辑此文件以外&…

MIPS下CPU和RAM的数据流动情况详解

这是计算机硬件间的数据路径&#xff08;即数据流动的路径&#xff09;&#xff0c;下面将较详细分析此图&#xff1a; PC&#xff08;program counter&#xff0c; 程序计数器&#xff09;是一个用于记录当前计算机正在执行的指令的地址的寄存器&#xff08;register&#xff…

计算机乱程序怎么办,我的电脑程序乱了怎么办

我的电脑程序乱了&#xff0c;想用光盘恢复一下系统的修复安装方法第一种方法&#xff1a;1、点击“开始”菜单&#xff0c;点击“运行”2、输入CMD回车3、输入命令SFC/SCANNOW4、插入系统光盘系统会自动将硬盘中的系统文件于系统盘中的文件比较并进行修复如果不行&#xff0c;…

【计算机网络】网络层——IP协议

目录 一. 基本概念 二. 协议报文格式 三. 网段划分 1. 第一次划分 2. CIDR方案 3. 特殊的IP地址 四. IP地址不足 1. 私有IP和公网IP 2. DHCP协议 3. 路由器 4. NAT技术 内网穿透(NAT穿透) 五. 路由转发 路由表生成算法 结束语 一. 基本概念 IP指网络互连协议…

完整的Web应用程序Tomcat JSF Primefaces JPA Hibernate –第2部分

托管豆 这篇文章是本教程第1部分的继续。 在“ com.mb”包中&#xff0c;您将需要创建以下类&#xff1a; package com.mb;import org.primefaces.context.RequestContext;import com.util.JSFMessageUtil;public class AbstractMB {private static final String KEEP_DIALOG…

P1014 Cantor表

洛谷 p1014 题目描述 现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的。他是用下面这一张表来证明这一命题的&#xff1a; 1/1 1/2 1/3 1/4 1/5 … 2/1 2/2 2/3 2/4 … 3/1 3/2 3/3 … 4/1 4/2 … 5/1 … … 我们以Z字形给上表的每一项编号。第一项是1/1&#xff…

dvd管理系统

>>>>>>>>>>>>>>>>>>>> 语言&#xff1a;java 工具&#xff1a;eclipse 时间&#xff1a;2016.12.1 >>>>>>>>>>>>>>>>>>>> 一代代码&#xff1a; 1 …

佳能2900打印机与win10不兼容_佳能RF 1.4、RF 2增倍镜与RF 100500mm L IS USM并不完全兼容...

据佳能官方透露&#xff0c;佳能RF 1.4、RF 2增倍镜与RF 100-500mm F4.5-7.1 L IS USM镜头并不完全兼容。在安装使用两款增倍镜时&#xff0c;用户需将RF 100-500mm镜头变焦环的变焦位置移动到超过300mm的远摄区域。而在搭配增倍镜后&#xff0c;镜头变焦范围将限定在300-500mm…

县级的图书馆计算机管理员,图书馆管理员的岗位职责

图书馆管理员的岗位职责导语&#xff1a;在领导的命令下&#xff0c;紧紧围绕学校总体工作要求&#xff0c;牢固树立全心全意为教学及教科研第一线服务的思想&#xff0c;工作主动热情&#xff0c;努力做好管理育人的工作。图书馆管理员岗位职责&#xff1a;1、每学期认真制订切…

使用Java快速入门的Apache Thrift

Apache Thrift是由facebook创建的RPC框架&#xff0c;现在它是一个Apache项目。 Thrift可让您在不依赖语言的定义文件中定义数据类型和服务接口。 该定义文件用作编译器的输入&#xff0c;以生成用于构建通过不同编程语言进行通信的RPC客户端和服务器的代码。 您也可以参考Thri…

Windows/Linux安装python2.7,pycharm和pandas——《利用Python进行数据分析》

一、Windows下&#xff08;两种方法&#xff09; 1. 安装Python EDP_free并安装pandas ① 如果你没有安装python2.7&#xff0c;可以直接选择安装Python EDP_free&#xff0c;然后再安装pandas等包就行 &#xff1a; Python EDP_free 网址&#xff1a; http://epdfree-7-3-2.…

Python基础类型

1. 列表、元组操作 列表是我们最以后最常用的数据类型之一&#xff0c;通过列表可以对数据实现最方便的存储、修改等操作 定义列表 names [Alex,"Tenglan",Eric] 通过下标访问列表中的元素&#xff0c;下标从0开始计数 >>> names[0] Alex >>> nam…

angular点击按钮弹出页面_Win10提示“由于启动计算机时出现了页面文件配置问题”解决方法...

我们在使用Windows10系统的过程中&#xff0c;经常会遇到一些问题。近期有一个网友咨询装机之家小编&#xff0c;称自己Windows10系统开机之后&#xff0c;弹出系统属性对话框&#xff0c;提示“由于启动计算机时出现了页面文件配置问题”的问题&#xff0c;我们要如何解决呢&a…

计算机程序编程就业,计算机编程就业

为毕业生写计算机编程就业提供计算机编程就业范文参考,涵盖硕士、大学本科毕业论文范文和职称论文范文&#xff0c;包括论文选题、开题报告、文献综述、任务书、参考文献等&#xff0c;是优秀免费计算机编程就业网站。基于编程语言类课程教学方法的探讨位把考查学生的编程能力也…

Spring集成–第1节– Hello World

Spring Integration的“ Hello World ” –考虑一个简单的程序&#xff0c;以使用Spring Integration将“ Hello World”打印到控制台&#xff0c;并在此过程中访问一些企业集成模式概念 在进入程序本身之前&#xff0c;快速回顾一下消息传递概念将很有用–消息传递是一种集成样…

正则表达式贪婪模式与懒惰模式

正则表达式贪婪匹配模式&#xff0c;对于初学者&#xff0c;往往也很容易出错。有时候需要匹配一个段代码内容&#xff0c;发现匹配与想要不一致。发现原来&#xff0c;跟贪婪模式有关系。如下&#xff0c;我们看下例子&#xff1a; 什么是贪婪模式 字符串有: “<h3>abd&…