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.pswp.cn/news/371934.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/371934.shtml
英文地址,請注明出處:http://en.pswp.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&…