布局
可以使用布局容器或窗格,以便在一个JavaFX应用程序场景图的UI控件的灵活和动态的安排。 JavaFX的布局API包括以下容器类,自动化常用的布局模式:
-
BorderPane
类,勾画出其内容节点的顶部,底部,右,左,或中心区域。 -
单行
HBox
类安排其内容节点水平。 -
VBox
类安排其内容节点,垂直在单个列。 -
StackPane
类的地方在一个背到前面的单栈的内容节点。 -
GridPane
类,允许开发人员创建一个灵活的网格的行和列在其中进行布局的内容节点。 -
FlowPane
类在一个水平或垂直排列其内容节点“流”,在指定的宽度(水平)或高度(垂直)边界包装。 -
TilePane
类的地方,其内容节点,大小均匀的布局单元格或瓷砖 -
AnchorPane
类使开发人员能够创建锚节点的顶部,底部,左侧,或布局的中心。
为了实现所需的布局结构,不同的容器可以嵌套在JavaFX应用程序。
要了解更多有关如何与布局,与在JavaFX的布局工作文章。 有关JavaFX的布局API的更多信息,请参见APIjavafx.scene.layout
为javafx.scene.layout包。
JavaFx Sence Graph(场景图)允许用户(开发者)快速创建GUI,尤其是涉及到复杂的特效和变换的时候。场景图其实是一个树形结构,常见的图形方面的应用程序和库都在使用这种结构,比如 向量编辑工具,3D库,视频游戏等。JavaFx 场景图是一种保留模式API,这意味着,它将维护你的应用程序里的所有图形对象的内部模型。在任何时候,它都知道要显示哪个对象,屏幕的哪个区域需要重绘,并且知道怎么样以最快的方式渲染所有的东西。你应该使用场景图API,让系统自动处理渲染细节,而不是直接调用基本绘图方法。这种方法将显著减少你程序所需代码的数量。
在上图中,Group对象作为根节点。Circle和Rectangle对象是叶节点,因为他们不能且没有孩子(子节点)。Region对象(定义了屏幕上的一块区域,他的子节点可以用CSS渲染)是包含两个叶节点(Text和ImageView)的分支结点。场景图可以比这复杂的多,但基本的组织结构是“父节点包含子节点”,这种模式会在所有的程序中重复出现。
那么在代码的角度,这些又是什么意思呢?下面我们开始创建一个应用程序窗口,仅有一个根节点:
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
public class Main extends Application {
@Override
public void start(Stage stage) {
Group root = new Group();
Scene scene =new Scene(root, 400, 400, Color.BLACK);
stage.setTitle("JavaFX Scene Graph Demo");
stage.setScene(scene);
stage.setVisible(true);
}
public static void main(String[] args) {
Application.launch(args);
}
}
这段代码产生的窗口效果如下:
基本要点步骤如下:
1. Main类继承了javafx.application.Application类,start(...)方法是重写的,start仅接收一个Stage(顶层UI容器)类型的参数。
2. 根节点root(javafx.scene.Group类的实例)创建以后和的宽度、高度、填充色一起传递到Scene的构造方法以构造scene。
3. 设置stage的标题,场景和可见性。
4. main方法调用Application.launch(...)。
程序运行结果之所以这样是因为,场景scene的填充色是Color.BLACK,根接点root当前没有孩子结点,没有其他要显示的东西。下面将修改代码,添加一个子节点到root。
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
public class Main extends Application {
@Override
public void start(Stage stage) {
Group root =new Group();
Scene scene =new Scene(root, 400, 400, Color.BLACK);
Rectangle r =new Rectangle(25,25,250,250);
r.setFill(Color.BLUE);
root.getChildren().add(r);
stage.setTitle("JavaFX Scene Graph Demo");
stage.setScene(scene);
stage.setVisible(true);
}
public static void main(String[] args) {
Application.launch(args);
}
}
修改后的运行结果如下图:
javafx.scene包定义了很多类,但当我们刚开始学习API时,有3个类非常重要:
Node:所有场景结点的抽象基类
Parent:所有分支节点的抽象基类(直接继承自Node)
Scene:场景图中所有内容的基容器类
此外 Group 根节点root(javafx.scene.Group类的实例) Rectangle javafx.scene.shape.Rectangle
下面是一些关于JavaFX应用的总结:
l 主类应继承Application类
l 主类应覆盖start()方法
l start()方法的参数是应用的原始舞台(Stage)
l main()方法应该调用launch()方法,并且最好只调用launch()方法
l 场景要添加一个root节点,可以是本教程中的Group节点,也可是其他祖先节点如layout pane。
l 当你创建场景时最好为其设定长宽。否则场景默认为能够显示其内容的最小尺寸
l 为root节点添加孩子结点:root.getChildren().add(circles);
l show()方法使舞台显示出来,最好将其放在最后。
l JavaFX提供各种错综复杂的图形效果,如模糊,填充,混合和动画。
最后 保持常看 API http://download.oracle.com/javafx/2.0/api/index.html