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

(翻译)第五回 开始使用JavaFX2.0

阅读更多

原文地址http://download.oracle.com/javafx/2.0/get_started/jfxpub-get_started.htm

 

如果想用 JavaFX快速开发富用户体验的应用,就好好读本文吧。我们将创建一个简单应用并了解到用少量代码实现复杂图形效果是多么容易。当然了,JavaFX不仅仅只是异常漂亮生动的形状而已。读完本文后去看看样例将大有好处。

Figure 1 Colorful Circles Application

Description of Figure 1 follows
Description of "Figure 1 Colorful Circles Application"

如果你很熟悉JavaFX场景图形编程模型,那就很容易理解程序的代码。 舞台( stage)是应用的最高层容器,场景( scene)是应用中内容的绘图表面。内容都被组织为场景图形,是一颗节点的层次树。

Figure 2 为应用 ColorfulCircles展示了场景图形。 分支节点是 Group 类的实例化。非分支节点,即叶子节点,是 Rectangle 和Circle 类的实例化。

Figure 2 Colorful Circles Scene Graph

Description of Figure 2 follows
Description of "Figure 2 Colorful Circles Scene Graph"

建立应用

你可以使用任何为开发Java设计的工具来构建javaFX应用。我们推荐使用NetBeans IDE。 开始之前,请确保你的NB版本已经支持了javaFX2.0。详见 System Requirements。

安装如下步骤用NB做开发:

  1. File 菜单 , 选择New Project .

  2. 从JavaFX application 分类中, 选择JavaFX Application , 点击Next .

  3. 输入工程名 ColorfulCircles 后点 Finish .

  4. 打开 ColorfulCircles.java 文件,复制 import 声明粘贴进你的工程覆盖NB自动生成的语句。

  5. 或者你可以使用NB的代码完成功能或Fix Imports 命令导入Import语句,不过记得确保包都以javafx开头。

创建应用基础

 删除 NetBeans IDE生成的ColorfulCircles 类并用 Example 1 中的代码代替。以下是运行javaFX应用所需的最少代码:

Example 1 Basic Application

public class ColorfulCircles extends Application {
 
    public static void main(String[] args) {
        launch(args);
    }
    
    @Override
    public void start(Stage primaryStage) {
        
        primaryStage.show();
    }
}

ColorfulCircles类继承了 Application 类,包含两个方法。第一个方法是 main() 方法, 用来调用 launch() 方法。作为JavaFX最佳实践,launch() 方法是被  main() 方法调用的唯一方法。

然后, ColorfulCircles 类重写了抽象的 start() 方法。start() 方法的参数是应用的初始舞台。最后一行使得舞台可见。

现在你可以编译运行ColorfulCircles了,每一步都记得查看下中间结果。如果出问题了,查看下 ColorfulCircles.java 文件。

添加场景

现在为舞台添加场景:增加三行代码,参见Example 2 。这有两个最佳实践: 代码中为场景创建了一个Group节点做根节点,并设置了场景的宽和高(这里是800和600)。

primaryStage.show() 这一行之前添加场景及其所有内容。这是另一个最佳实践。

Example 2 Scene

@Override 
public void start(Stage primarystage) {
    Group root = new Group();




    Scene scene = new Scene(root, 800, 600, Color.BLACK);




    primaryStage.setScene(scene);




    primaryStage.show()

Figure 3 展示了到目前为止的结果。

添加图形

接下来在 primaryStage.show()行之前添加 Example 3 中的代码来创建30个圆。

Example 3 30 Circles

Group circles = new Group();
for (int i = 0; i < 30; i++) {
   Circle circle = new Circle(150, Color.web("white", 0.05));
   circle.setStrokeType(StrokeType.OUTSIDE);
   circle.setStroke(Color.web("white", 0.16));
   circle.setStrokeWidth(4);
   circles.getChildren().add(circle);
}
root.getChildren().add(circles);

这些代码创建了称为 circles 的Group,然后使用一个ofr循环向其中添加30个圆。每个圆半径到是150,并用white颜色填充,此外不透明度是5%,所以基本是透明的。

然后为这些圆创建边框,代码中包含了 StrokeType 类。 描边类型的 OUTSIDE 标明圆的边界向外扩展 StrokeWidth 的值,也就是4。描边的颜色是 white ,不透明度是16%,使得它比圆的颜色浅。

最后一行把 circles 加到根节点上。这只是临时结构,稍候将修改场景图形使得它匹配 Figure 2 展示那样。

Figure 4 展示了当前应用。由于代码没有为每个圆指定特定位置,它们都叠加在一起,并且窗口的左上角是圆心。层叠的圆的不透明度和黑色北京作用使得圆看起来是灰色的。

增加视觉效果

继续为圆应用盒子模糊效果使得它们看起来柔和。代码是 Example 4 。 在primaryStage.show() 之前添加这些代码。

Example 4 Box Blur Effect

circles.setEffect(new BoxBlur(10, 10, 3));

代码设置了模糊半径,宽和高都是10并且迭代3次,使它接近高斯模糊。 这样便在圆的边缘出现了平滑效果,看Figure 5 .

Figure 5 Box Blur on Circles

Description of Figure 5 follows
Description of "Figure 5 Box Blur on Circles"

创建背景渐变

现在创建一个矩形并用线性渐变填充,代码见 Example 5 .

root.getChildren().add(circles) 之前添加这些代码,这样矩形才能在圆下面。

Example 5 Linear Gradient

Rectangle colors = new Rectangle(scene.getWidth(), scene.getHeight(),
     new LinearGradient(0f, 1f, 1f, 0f, true, CycleMethod.NO_CYCLE, new 
         Stop[]{
            new Stop(0, Color.web("#f8bd55")),
            new Stop(0.14, Color.web("#c0fe56")),
            new Stop(0.28, Color.web("#5dfbc1")),
            new Stop(0.43, Color.web("#64c2f8")),
            new Stop(0.57, Color.web("#be4af7")),
            new Stop(0.71, Color.web("#ed5fc2")),
            new Stop(0.85, Color.web("#ef504c")),
            new Stop(1, Color.web("#f2660f")),}));
root.getChildren().add(colors);

代码创建了称为colors的矩形。 矩形和场景同宽高,并从左下角的(0,0)点开始到右上角的(1,1)点应用线性渐变。 true 表示渐变在矩形中是成比例的,NO_CYCLE 表示颜色循环不会重复, Stop[] 序列表明了渐变颜色序列。最后一行把colors 添加到根节点。

现在边缘模糊的灰色圆出现在了彩虹色的上面,见 Figure 6 .

Figure 7 展示了中间的场景图。现在circles和colors 矩形都是根节点的孩子。

Figure 7 Intermediate Scene Graph

Description of Figure 7 follows
Description of "Figure 7 Intermediate Scene Graph"

应用混合模式

现在通过增加混合覆盖效果给圆增加颜色并使场景变暗。这个任务需要一点家务活,你需要从场景中移除 circles组和渐变的矩形,并把它们添加到新的混合覆盖组中。

  1. 删除下面两行代码:

    root.getChildren().add(colors);

    root.getChildren().add(circles);

  2. 添加 Example 6 中的代码到上面删除代码的位置。

    Example 6 Blend Mode

    Group blendModeGroup = 
        new Group(new Group(new Rectangle(scene.getWidth(), scene.getHeight(),
            Color.BLACK), circles), colors);
    colors.setBlendMode(BlendMode.OVERLAY);
    root.getChildren().add(blendModeGroup);
    

     blendModeGroup 组为混合覆盖组建立了结构。组中包含了两个孩子。第一个是一个新建匿名Group ,包含一个新建的匿名黑色矩形和以前创建的circles 组。第二个孩子是以前创建的colors 矩形。

  3. setBlendMode() 方法把混合覆盖应用到了colors 矩形。最后一行代码把blendModeGroup 添加到场景作为根节点的孩子,如Figure 2 .

混合覆盖效果是图形设计程序中的常规效果。它可以暗化图像或高亮它们,这取决于混合组中的颜色。这里,我们把线性渐变矩形用作覆盖,黑色矩形用来保持背景黑暗,而接近透明的圆从矩形中取了色不过依然变暗了。

Figure 8 展示了结果。下一步活化了圆之后将能看到完整的混合覆盖效果。

添加动画

最后一步是使用javaFX动画来移动圆:

  1. 如果没准备好,增加 import static java.lang.Math.random; 到导入声明。

  2. primaryStage.show() 之前增加Example 7 中的活化代码。

    Example 7 Animation

    Timeline timeline = new Timeline();
    for (Node circle: circles.getChildren()) {
        timeline.getKeyFrames().addAll(
            new KeyFrame(Duration.ZERO, // set start position at 0
                new KeyValue(circle.translateXProperty(), random() * 800),
                new KeyValue(circle.translateYProperty(), random() * 600)
            ),
            new KeyFrame(new Duration(40000), // set end position at 40s
                new KeyValue(circle.translateXProperty(), random() * 800),
                new KeyValue(circle.translateYProperty(), random() * 600)
            )
        );
    }
    // play 40s of animation
    timeline.play();
    

    动画是由时间线驱动的,所以这里创建了时间线,然后使用一个for 循环为30个圆增加两个关键帧。第一个关键帧在0秒时使用translateXProperty 和translateYProperty 属性设置窗口内的一个随机位置。第二个关键帧在40秒时同样做。这样,当时间线play()后,所有圆就在40秒内从一个随机位置到另一个。

 

Figure 9 展示了运动中的30个圆。完成后查看 ColorfulCircles.java 文件 .

Figure 9 Animated Circles

Description of Figure 9 follows
Description of "Figure 9 Animated Circles"

4
0
分享到:
评论

相关推荐

    javafx2.0用户界面开发

    "JavaFX 2.0 用户界面开发" JavaFX 2.0 是一种基于 Java 技术构建的客户端平台,旨在帮助开发者创建和部署跨平台且表现一致的 Rich Internet Application(RIAs)。JavaFX 平台提供了一套丰富的图形和媒体 API,...

    使用JavaFX2.0编写国际象棋游戏

    在本项目中,我们将探讨如何使用JavaFX 2.0框架来开发一款国际象棋游戏。JavaFX是一个用于创建桌面、Web以及移动设备上富客户端应用程序的强大的图形库。通过这个项目,我们可以深入理解JavaFX的基本概念,以及如何...

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

    通过以上内容,我们可以全面了解 JavaFX2.0 的各个方面,包括其历史背景、技术特点、新特性、开发流程、以及如何使用 FXML 来创建用户界面等。这对于想要深入了解 JavaFX2.0 并利用它来开发高质量应用的开发者来说是...

    Pro JavaFX 2英文电子书

    5. **第五章:使用 JavaFX UI 控件** - **目的**:深入探讨 JavaFX 提供的各种 UI 控件。 - **主要内容**: - JavaFX 内置的各种标准控件。 - 如何自定义控件以满足特定需求。 - 控件的最佳实践和设计模式。 ...

    JavaFX8 Introduction by Example 第二版

    《JavaFX8 Introduction by Example 第二版》是为专业软件开发人员设计的,旨在通过实例介绍如何使用JavaFX 8平台开发图形界面丰富的客户端应用程序。JavaFX是一个用于构建富互联网应用(Rich Internet Applications...

    JMF2.0-guide.pdf

    开发者可以使用事件驱动或回调的方式来处理媒体事件,例如播放结束、缓冲更新等。 6. **实时流处理**: JMF支持RTSP(Real-Time Streaming Protocol)协议,可以实现实时流媒体的播放和传输。 7. **自定义服务...

    通讯录的设计与实现-java-version2.0

    可以使用JavaFX的皮肤和组件库,或者引入第三方UI库,如JFoenix(JavaFX的Material Design风格)来提升视觉效果。 8. **安全与隐私**:通讯录包含敏感的个人信息,因此在设计时应考虑数据的安全性。可以采用加密...

    基于Java的电梯模拟程序 v2.0.zip

    【标题】"基于Java的电梯模拟程序 v2.0.zip" 涉及的主要知识点是使用Java编程语言设计和实现一个电梯模拟系统。这个程序可能是为了教学、实践或研究目的,帮助用户理解多线程、并发控制、状态机设计以及算法在实际...

    Project-Code:java项目源代码,它是一种语言翻译器,由Javafx接口在Java中设计,使用Watson api-java project source code

    该项目名为"Project-Code",主要是一个基于Java的源代码实现,它是一个语言翻译器,设计上利用了JavaFX作为用户界面(UI)框架,并且整合了IBM Watson的API来实现高级的语言处理功能。让我们深入了解一下这个项目的...

    基于Java的MVC的资源管理器 v2.0.zip

    【描述】提到的"v2.0"表明这是该资源管理器的第二个主要版本,通常意味着在功能、性能或用户体验方面有所改进和增强。Java是一种广泛使用的面向对象的编程语言,以其跨平台的特性(Write Once, Run Anywhere)和丰富...

    图表生成.rar

    2. **JavaFX图表组件**: 自JavaFX 2.0起,JavaFX引入了内置的图表组件,如 BarChart(柱状图)、LineChart(线图)和PieChart(饼图)。这些组件易于使用,可以直接嵌入到JavaFX应用程序中,提供交互式图表功能。...

    2014级软件工程专业数据结构课程设计方案V2.0资料.docx

    第五题是农夫过河问题,属于状态空间搜索的问题,可以通过状态转移矩阵和深度优先搜索(DFS)或广度优先搜索(BFS)策略来解决。 最后,迷宫求解问题是一个典型的路径寻找问题,可以使用深度优先搜索(DFS)或广度...

    scenicView

    描述中提到,ScenicView是配合JavaFX Scene Builder 2.0使用的。Scene Builder是一款图形化界面设计工具,允许开发者拖放组件来构建JavaFX的界面。然而,Scene Builder并不提供直接的调试功能,这就是ScenicView的...

    jdk-6u45-windows-i586.rar

    这个版本的JDK还包括对JavaFX 2.0的初步支持,这是Oracle推动Java在桌面应用领域发展的关键一步。 描述中提到的"可执行exe版本"是指JDK安装程序,用户可以通过双击这个exe文件来安装JDK,使得开发环境具备编译和...

    jdk-7u10-windows

    9. **改进的Swing和JavaFX**:Java 7对Swing组件进行了性能优化,同时开始引入JavaFX 2.0作为下一代富客户端平台。 **标签“jdk1.7-demos”** 暗示这个压缩包可能包含了Java 7的演示程序和示例代码,这对于初学者和...

    如何打包成exe的执行文件 菜鸟来

    2. **使用JavaFX Packager:** JavaFX 2.0及以后版本提供了将JavaFX应用程序打包成跨平台可执行文件的功能,包括Windows的.exe。但这主要适用于使用JavaFX开发的应用。 3. **使用第三方工具:** 这里推荐两个流行的...

    java-play-voice.rar_play

    自JavaFX 2.0引入以来,它提供了一个强大的媒体处理库,支持音频和视频播放。如果你的应用场景涉及到JavaFX,可以使用`javafx.scene.media.MediaPlayer`类。只需创建一个`Media`对象,指定声音文件的URL,然后创建...

    MyHouse_v2.0

    2. **用户界面设计**:由于应用与个人房屋相关,UI设计应注重用户友好性和直观性,可能使用了JavaFX或Android的布局组件来构建界面。 3. **数据存储**:可能使用了SQLite(对于Android应用常见)或其他关系型或非...

    WeatherApp2.0

    5. **数据持久化**:如果WeatherApp2.0需要存储用户的偏好设置或历史查询,可能使用了SQLite这样的轻量级数据库,或者文件系统来实现数据持久化。 6. **异常处理**:良好的异常处理是任何软件的关键部分。在Weather...

    javaStudenFX

    JavaFX2.0开始,它成为了Java平台的组成部分,不再依赖于第三方插件。JavaFX支持2D和3D图形、媒体播放、动画效果、CSS样式等,使得开发者可以创建出美观且功能强大的桌面应用。 在JavaStudentFX项目中,我们可以...

Global site tag (gtag.js) - Google Analytics