`
somefuture
  • 浏览: 1090915 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

(翻译)第三十回 重置JavaFX2.0结点

阅读更多

 

原文地址http://download.oracle.com/javafx/2.0/layout/size_align.htm

 

 

 

使用JavaFX内置布局窗格最大的好处是窗格帮你管理结点的大小和对其性质。窗格改变大小时,结点大小十分改变要根据窗格的性质。注意不是所有的结点类都可以改变大小。UI控件和布局窗格可以,但是形状、Text对象、 Group对象不可以,它们在布局中是刚性对象。如果你想要更多的控制控件大小,请直接指定其尺寸。布局窗格会根据你的设置来决定控件的大小。

改变结点大小

布局窗格通过调用prefWidth(height)和 prefHeight(width) 方法查询结点的首选尺寸。默认地,UI控件根据其内容计算它们的首选尺寸。比如,Button 对象的尺寸是根据文本长度和标签中字体的尺寸(可能还有图片)计算的。一般的,计算出来的尺寸都是刚好够大以使标签能完全看见。

UI控件也提供根据典型用法的默认最小和最大尺寸。比如,Button 对象的最大尺寸是首选尺寸,因为不太可能让其任意大。然而,ScrollPane 对象的最大尺寸是不确定的,因为总是希望它们会随着内容增长。

既可以使用结点的默认尺寸,也可以随心而设置。比如,Figure 2-1 是边框窗格中一些按钮和列表视图的默认尺寸。

Figure 2-1 Computed Sizes

 
如果想要 Figure 2-2 中的效果呢?里面UI控件的尺寸都是预设的。

应用程序通常需要直接设置控件的最大、最小、首选尺寸。下面将讲解如何修改控件的外观来是自己满意。

让按钮同样大

要实现该目标,可以为每个按钮指定高度和宽度,然后将它们的首选尺寸改成最大的宽度和高度。一种更简单的方法是让布局窗格来完成该工作。布局窗格由想要达到的效果来决定。

使用垂直盒子

 Figure 2-1 中的场景为按钮使用了一个VBox布局窗格且按钮尺寸是默认的。按钮已经具有相同高度了,所以只要改变其宽度即可。

Figure 2-2 中的场景使用一个VBox窗格来利用一下默认行为:让 VBox窗格的宽度和最宽元素的宽度相同。要让按钮都和 VBox窗格宽度相同,就要把每个 按钮的最大宽度设为Double.MAX_VALUE常量,这样控件的变化就没有了限制。当然,把最大值指定为具体指也行,比如 80.0.

Example 2-1 在实现了任何让VBox窗格中的按钮都一样宽。

Example 2-1 Set a Column of Buttons to the Same Width

BorderPane root = new BorderPane();
root.setPadding(new Insets(20, 0, 20, 20));

Button btnAdd = new Button("Add");
Button btnDelete = new Button("Delete");
Button btnMoveUp = new Button("Move Up");
Button btnMoveDown = new Button("Move Down");

btnAdd.setMaxWidth(Double.MAX_VALUE);
btnDelete.setMaxWidth(Double.MAX_VALUE);
btnMoveUp.setMaxWidth(Double.MAX_VALUE);
btnMoveDown.setMaxWidth(Double.MAX_VALUE);

VBox vbButtons = new VBox();
vbButtons.setSpacing(10);
vbButtons.setPadding(new Insets(0, 30, 10, 25)); 
vbButtons.getChildren().addAll(btnAdd, btnDelete, btnMoveUp, btnMoveDown);

root.setright(vbButtons);  

小提示:

把按钮列放在了边框窗格的右部就限制了最宽按钮的首选宽度。边框窗格的中部会尽量去填满所以的控件,所以如果把Vbox放在中间,它和按钮都会扩大。

使用瓦片窗格

 Figure 2-1 中的场景为底部的按钮使用了一个HBox布局窗格且按钮尺寸是默认的。 按钮的款和搞都不同。

Figure 2-2 中的场景使用了一个水平TilePane布局窗格来利用其默认行为:每个细胞或瓦片都相同大小。 每个瓦片的尺寸都需要是瓦片窗格中最大结点的大小。

要让按钮和瓦片尺寸一样,把它们的最大宽度和高度设为Double.MAX_VALUE常量。 Example 2-2 中实现了该目标。

 

Example 2-2 Set a Row of Buttons to the Same Size

Button btnApply = new Button("Apply");
Button btnContinue = new Button("Continue");
Button btnExit = new Button("Exit");

btnApply.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
btnContinue.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
btnExit.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
btnExit.setStyle("-fx-font-size: 14pt;");

TilePane tileButtons = new TilePane(Orientation.HORIZONTAL);
tileButtons.setPadding(new Insets(20, 10, 20, 0));
tileButtons.setHgap(10.0);
tileButtons.getChildren().addAll(btnApply, btnContinue, btnExit);

 

即使窗口改变大小瓦片也不会变,所以瓦片窗格中的按钮不会改变的。

让结点保持首选尺寸

当舞台改变大小时,其中的布局窗格可能会给包含的控件产生过多或不足的空间。每个布局窗格都有其空间分派原则,根据的是控件最小、最大、首选尺寸。一般地,最大尺寸是Double.MAX_VALUE的话控件会扩张来填充空间而有限定大小的就不会。比如, ListView对象最大值不能确定。如果要限制其首选高度,可以设置为 Control.USE_PREF_SIZE 常量,见Example 2-3 .

Example 2-3 Set Maximum Height to Preferred Height

ListView<String> lvList = new ListView<String>();
ObservableList<String> items = FXCollections.observableArrayList (
        "Hot dog", "Hamburger", "French fries", 
        "Carrot sticks", "Chicken salad");
lvList.setItems(items);
lvList.setMaxHeight(Control.USE_PREF_SIZE);

按钮默认只扩张到首选尺寸。但是如果最小宽度没有指定,可能会出现三个点(... ) 。要防止按钮比首选宽度小,把最小宽度设置为其首选宽度。见Example 2-4 .

Example 2-4 Set Minimum Width to Preferred Width

Button btnMoveDown = new Button("Move Down");
btnMoveDown.setMinWidth(Control.USE_PREF_SIZE);

控件的首选尺寸首先基于经过计算(内容)的值。可以覆盖其首选值为自己的选择。下面的语句覆盖了列表的宽度。

lvList.setPrefWidth(150.0);

阻止改变大小

如果不想要结点改变大小,把其最大、最小、首选值设为一样的。要只阻止宽度或高度改变,就把宽度或高度的限制设为相同。在Example 2-5 中,列表创建时要求了限制值相同,所以即使窗口改变其尺寸也不变。一个按钮也限制了宽度的三个值相同。

 

Example 2-5 Set Size Constraints to Prevent Resizing

ListView<String> lvList = new ListView<String>();
lvList.setMinSize(150.0, Control.USE_PREF_SIZE);
lvList.setMaxSize(150.0, Control.USE_PREF_SIZE;

Button btnDelete = new Button("Delete");
btnDelete.setMinWidth(80.0);
btnDelete.setPrefWidth(80.0);
btnDelete.setMaxWidth(80.0);

 

文本对其

每个布局窗格都有自己的方法来对其结点。比如,HBox和 VBox 布局窗格中,结点是顶端对齐和左对齐的。TilePane和 FlowPane窗格中,结点是居中的。窗格自身默认是顶端对齐和左对齐的。

可以使用setAlignment()方法设置结点和窗格的对其方式。对其常量位于 javafx.geometry包中的 enum类型中。

  • HPos - 指定水平对齐的值
  • Pos - 指定垂直和水平对齐的值。下划线左边指定的是垂直对齐值,下划线右边指定的是水平对齐值。比如Pos.BOTTOM_LEFT要结点垂直方向在底部而水平方向在左边。

  • VPos - 指定垂直对齐的值。

Figure 2-3 是代码  Example 2-6 的效果.由于没有对齐限制,布局窗格在左上角。

 

Figure 2-3 Default Positions

Description of Figure 2-3 follows
Description of "Figure 2-3 Default Positions"

 

Example 2-6 Create a UI with Default Alignment

public void start(Stage primaryStage) {
    GridPane grid = new GridPane();
    grid.setHgap(10);
    grid.setVgap(12);

    HBox hbButtons = new HBox();
    hbButtons.setSpacing(10.0);

    Button btnSubmit = new Button("Submit");
    Button btnClear = new Button("Clear");
    Button btnExit = new Button("Exit");
    btnSubmit.setStyle("-fx-font-size: 11pt;");

    Label lblName = new Label("User name:");
    TextField tfName = new TextField();
    Label lblPwd = new Label("Password:");
    PasswordField pfPwd = new PasswordField();

    hbButtons.getChildren().addAll(btnSubmit, btnClear, btnExit);
    grid.add(lblName, 0, 0);
    grid.add(tfName, 1, 0);
    grid.add(lblPwd, 0, 1);
    grid.add(pfPwd, 1, 1);
    grid.add(hbButtons, 0, 2, 2, 1);
    Scene scene = new Scene(grid, 250, 250);
    primaryStage.setTitle("Layout Positioning");
    primaryStage.setScene(scene);
    primaryStage.show();
}

如果要 Figure 2-4 中的效果呢?窗格在屏幕中央。

 

Figure 2-4 Desired Positions

Description of Figure 2-4 follows
Description of "Figure 2-4 Desired Positions"

 

下面就讲述任何覆盖默认位置设置。

将网格居中

要让 Example 2-6 中的网格居中,这样做:

grid.setAlignment(Pos.CENTER);

对齐列中的控件

在我们的理想布局中,标签要右对齐而文本框左对齐。要在网格中达到该目的,为每列使用ColumnConstraints类并设置水平对其方式。 Example 2-7 为 Example 2-6 中的网格定义了列属性。

Example 2-7 Define the Columns in the Grid

GridPane grid = new GridPane();
grid.setAlignment(Pos.CENTER);
grid.setHgap(10);
grid.setVgap(12);

ColumnConstraints column1 = new ColumnConstraints();
column1.setHalignment(HPos.RIGHT);
grid.getColumnConstraints().add(column1); 

ColumnConstraints column2 = new ColumnConstraints();
column2.setHalignment(HPos.LEFT);
grid.getColumnConstraints().add(column2); 

 使用VBox窗格也可以实现控件右对齐。照下面这样使用 setAlignment() 方法:

VBox vbox = new VBox;
vbox.setAlignment(Pos.CENTER_RIGHT);

按钮居中

 HBox中的按钮跨越了网格的列。下面的代码让按钮居中:

HBox hbButtons = new HBox()
hbButtons.setAlignment(Pos.CENTER);

HBoxsetAlignment() 方法居中了HBox窗格和其中的结点。要是更喜欢将 HBox窗格行居中而其中的按钮底部对齐,就像 Figure 2-5 .

Figure 2-5 Override Positions and Bottom-Justify the Buttons

Description of Figure 2-5 follows
Description of "Figure 2-5 Override Positions and Bottom-Justify the Buttons"

要这样安排,把 HBox 窗格放在一个只有一个细胞的内网格中,再把它放在外网格的第三行。把内网格设置为居中,把HBox窗格设为底部对齐,见 Example 2-8 .

Example 2-8 Center and Bottom-Justify the Buttons

HBox hbButtons = new HBox();
hbButtons.setSpacing(10.0);
hbButtons.setAlignment(Pos.BOTTOM_CENTER);
hbButtons.getChildren().addAll(btnSubmit, btnClear, btnExit);

GridPane innergrid = new GridPane();
innergrid.setAlignment(Pos.CENTER);
innergrid.add(hbButtons, 0, 0);
grid.add(innergrid, 0, 2, 2, 1);
分享到:
评论
3 楼 zcool321 2014-10-23  
很感谢你的JavaFx教程~真的很受用,之后再看看官网的估计就了解的差不多了。英文很差,所以先来这里看了
2 楼 somefuture 2011-12-30  
sorradawnstar 写道
你好, 我读了你翻译的JavaFX教程. 有个问题请教一下: PrefSize, MinSize, MaxSize有什么关系啊? 我想指定一个控件的大小, 用setMinSize不成功, 用setPrefSize却成功了.

我的邮箱: dawnstar@163.com

非常感谢你关注JavaFX2。
Pref是一个控件初始化时的推荐大小。
如果一个控件大小会变化(可能是里面的内容变化了,或者是父控件变化了,等等),还需要指定max和min。
这样当它变化时,它的尺寸会限制在某个区间内,不至于太大(和太小)。
1 楼 sorradawnstar 2011-12-29  
你好, 我读了你翻译的JavaFX教程. 有个问题请教一下: PrefSize, MinSize, MaxSize有什么关系啊? 我想指定一个控件的大小, 用setMinSize不成功, 用setPrefSize却成功了.

我的邮箱: dawnstar@163.com

相关推荐

    javafx2.0 中文文档.zip

    这个“javafx2.0 中文文档.zip”压缩包包含了关于JavaFX 2.0的中文文档,对于理解和学习这个技术至关重要。 首先,JavaFX 2.0的核心是它的 scenegraph 模型,这是一种基于节点的对象模型,用于构建复杂的用户界面。...

    JavaFX2.0 体系结构和框架

    【JavaFX2.0 体系结构和框架】深入解析 JavaFX2.0 是一个基于Java技术的丰富客户端平台,专为开发富互联网应用程序(RIAs)设计,它以其出色的动态画面和美观的用户界面而受到赞誉。尽管中文资料相对较少,但通过对...

    javaFX高级教程JavaFX2.0的FXML语言 中文文档

    ### JavaFX 2.0 的 FXML 语言高级教程 #### 概述 JavaFX 2.0 引入了一种新的声明性标记语言——FXML(发音为 “fizz-le”),这是一种基于 XML 的语言,专门用于定义应用程序的用户界面。通过使用 FXML,开发者...

    JavaFX高级教程:JavaFX2.0的FXML语言(中文版)

    JavaFX 2.0 是一个强大的富互联网应用程序(RIA)平台,用于构建具有美观图形界面的应用程序。在JavaFX 2.0中,FXML(FXML Language)被引入,这是一种基于XML的声明性语言,专门用于定义应用程序的用户界面。这个...

    javafx2.0官方例子

    javafx2.0,java,javafx,例子,代码 Sun公司(已于20092008年12月05日发布了JavaFX技术的正式版,它使您能利用 JavaFX 编程语 言开发富互联网应用程序(RIA)。JavaFX Script编程语言(以下称为JavaFX)是Sun微...

    JavaFX 2.0 電子書 - Pro JavaFX 2

    最新JavaFx 2.0 電子書 In Pro JavaFX 2: A Definitive Guide to Rich Clients with Java Technology, Jim Weaver, Weiqi Gao, Stephen Chin, Dean Iverson, and Johan Vos show you how you can use the JavaFX ...

    JavaFx2.0入门指南

    JavaFX 2.0 入门指南是针对那些希望通过JavaFX快速开发富用户体验应用程序的开发者设计的。这个指南,源自Oracle官方,包含了中英文对照,旨在帮助初学者快速上手。在本文档中,你将学习如何利用JavaFX创建一个名为...

    JavaFX 2.0 Introduction by Example.zip

    JavaFX 2.0 Introduction by Example.zip是javafx2.0的最新书籍《[JavaFX.2.0:Introduction.by.Example].Carl.Dea》上的源码!大家可以下载本书和源码一起看!我都上传了!

    JavaFX2.0内建控件教程(全部控件)

    ### JavaFX 2.0 内建控件教程 #### 1. UI控件概览 JavaFX 2.0 提供了一系列丰富的内置用户界面(UI)控件,这些控件可以帮助开发者快速构建美观且功能强大的应用程序。JavaFX UI 控件位于 `javafx.scene.control` ...

    javafx2.0在netbeans插件

    JavaFX 2.0 是 Oracle 公司推出的一个强大的富客户端开发平台,它允许开发者创建具有丰富图形用户界面和交互性的应用程序。NetBeans IDE 是一个流行的开源集成开发环境(IDE),支持多种编程语言,包括 Java。`...

    JavaFX2.0基础教程.pdf

    ### JavaFX2.0基础教程知识点总结 #### 1. JavaFX概览 - **JavaFX认知**:JavaFX是一个由Java技术构建的平台,它旨在简化富互联网应用程序(RIA)的创建与部署过程,这些应用程序能够跨多个平台运行并且具有统一的...

    Javafx 2.0: Introduction by Example

    Javafx 2.0: Introduction by Example

    JavaFX2.0基础教程(整合版)

    JavaFX2.0平台是java客户端设计演进,使应用开发者易于创建和部署跨平台且表现一致的Rich Internet Application(RIAs)。JavafX是由Java技术构建,基于高性能硬件加速的媒体和图形引擎,JavaFX平台提供了一套丰富的...

    javafx_2.0_introduction_by_example

    根据给定文件的信息,我们可以提炼出关于JavaFX 2.0的重要知识点,这些知识点涵盖了JavaFX的基本概念、架构策略、发展历程以及其在图形用户界面(GUI)开发中的应用。 ### JavaFX 2.0:下一代GUI工具包 JavaFX 2.0...

    JavaFX2.0IntroductionbyExamplePDFBooks.pdf 英文原版

    JavaFX 2.0 Introduction by Example – PDF Books

Global site tag (gtag.js) - Google Analytics