阅读更多

15顶
3踩

Web前端

原创新闻 JavaFX初识

2008-08-06 09:59 by 见习记者 metaphy 评论(6) 有13476人浏览
Sun确实反应太慢,在Adobe Flash平台已经可以开发产品级RIA应用的时候,它给出的road map还是慢慢腾腾:

2008年7月,Sun将开放JavaFX Desktop SDK
2008秋,JavaFX Desktop 1.0 发布
2009春,JavaFX Mobile and TV 1.0发布

也就是说,截至今天,1.0依然在按计划进行中,我们体验的只是Preview版本(Sun也不建议用这个版本进行产品开发),似乎让人灰心,但没关系,相信Sun可以后来居上,譬如NetBeans之于Eclipse(当然它们至今仍未分高下)。从上面也可以看出,JavaFX Desktop和JavaFX Mobile and TV 都会发布,似乎又回到了1995年时候的Sun目标。

OK,先让我们来看一下JavaFX到底是什么。
JavaFX Preview SDK 是JavaFX platform的体验版本。这一版本是定位于web脚本开发人员和那些想事先体验JavaFX技术和工具的家伙。这一SDK同样包含"Nile Project",这是一套工具和插件,能让脚本开发人员用拖放的方式建立图形化的东西。运行JavaFX Application需要:
1.Java SDK 1.6 Update 7或更新,最好是Update 10
2.JavaFX Preview SDK (上面说了,JavaFX SDK 1.0还在娘胎中),请下载Netbeans IDE 6.1 with JavaFX: http://javafx.com/htdocs/downloadpage.html


而开发JavaFX,则需要写JavaFX Script,这是一种新的脚本语言,旨在方便高效地创建图形界面及绑定数据,而这个所谓的图形界面,最终调到的是swing,但需要注意:
1.JavaFX能提供Swing所没有的一些Widgets
2.对Swing组件的的操作,使用JavaFX Script可能有所限制,也即是说,Swing里面对图形界面元素控制的一些方法或属性,在Java FX里面可能不存在。
下面是用JavaFX开发的一个Clock,其实Swing也完全可以做到:


JavaFX Script看上去:
package myclockproject;

import javafx.application.Frame;
import javafx.application.Stage;
import javafx.scene.CustomNode;
import javafx.scene.Group;
import javafx.scene.Node;
import javafx.scene.geometry.Circle;
import javafx.scene.paint.Color;
import javafx.scene.geometry.*;
import javafx.scene.text.Text;
import javafx.scene.Font;
import javafx.scene.FontStyle;
import javafx.scene.transform.Translate;
import javafx.scene.transform.Rotate;
import javafx.scene.image.ImageView;
import javafx.scene.image.Image;

import java.util.Date; 
import java.lang.Math;
import javafx.animation.Timeline;
import javafx.animation.KeyFrame;
import javafx.ext.swing.Button;

Frame {
    title : "Java FX Clock Application"
    width : 295
    height: 325
    closeAction : function (){
        java.lang.System.exit(0) ;
    }
    visible: true
    stage: Stage {         
        content: Clock{}
    } 
}

public class Clock extends CustomNode {
    public attribute radius : Number = 77;
    public attribute centerX : Number = 144;
    public attribute centerY : Number = 144;
    public attribute hours:Number;
    public attribute minutes:Number;
    public attribute seconds:Number;

    public function nextTick () {  
        var now = new Date();
        seconds = now.getSeconds();
        minutes = now.getMinutes();
        hours = now.getHours();
    } 
    
    public function create(): Node {
        return Group {
            content:[ 
                ImageView {
                    image: Image {
                        url: "{__DIR__}/clock_background.png"
                    }
                },
 
                Group{
                    transform: Translate { x: centerX, y: centerY }
                    content: [                        
                // code to display the numbers for every third hour 
                        for (i in [3, 6, 9, 12])
                        Text { 
                            transform: Translate { x : -5, y : 5 }        
                            font: Font {size: 16 style: FontStyle.BOLD }
                            x: radius * (( i + 0 ) mod 2 * ( 2 - i / 3)) 
                            y: radius * (( i + 1 ) mod 2 * ( 3 - i / 3)) 
                            content: "{i}"    
                        },

                //code to display a circle for the rest of the hours on the clock    
                        for (i in [1..12]) 
                        if (i mod 3 != 0 ) then Circle {       
                            transform:Rotate { angle: 30 * i }        
                            centerX: radius
                            radius: 3        
                            fill: Color.BLACK
                        } else [ ],
                        Circle { 
                            radius: 5
                            fill: Color.DARKRED
                        },
                //code for the smaller center circle
                        Circle {
                            radius: 3
                            fill: Color.DARKRED
                        },
                        //code for the seconds hand
                        Line {
                            transform: Rotate { angle: bind seconds * 6 }
                            endY: -radius - 3
                            strokeWidth: 2
                            stroke: Color.RED
                        },
                        //code for the hour hand
                        Path {
                        //for the hour hands
                            transform: Rotate { angle: bind (hours + minutes / 60) * 30 - 90 }
                            fill: Color.BLACK
                            elements: [
                                MoveTo {x: 4, y: 4},
                                ArcTo {x: 4 y: -4 radiusX: 1 radiusY: 1},
                                LineTo{ x: radius - 15  y: 0},
                            ]
                        },
                        // code for the minutes hand
                        Path {
                            //for the minutes hand
                            transform: Rotate { angle: bind minutes * 6 - 90 }
                            fill: Color.BLACK
                            elements: [
                                MoveTo {x: 4, y: 4},
                                ArcTo {x: 4 y: -4 radiusX: 1 radiusY: 1},
                                LineTo{ x: radius  y: 0},
                            ]
                        }]}
            ]
        };
    }
    
    init {
        var timeline = Timeline {
            repeatCount: Timeline.INDEFINITE
            keyFrames : [
                KeyFrame {
                    time : 1s
                    action: function() {
                        nextTick();
                    }
                }
            ]
        }
        timeline.start();
        
    }
}

JavaFX Script还是比较简单的。它与Java的差距,比JavaScript与Java的差距,个人感觉小的多。

如何发布JavaFX应用呢?JavaFX内容可以通过Java Web Start发布为应用程序(这将最终运行在用户的Desktop上面),或者发布为Applets作为Java的Plug-In;无论哪种方式,都需要有一个JavaFX runtime.

参考:
Sun:
http://www.sun.com/software/javafx/script/index.jsp
SUN为Java FX专题建立的网站,网站本身也是Java FX技术的一个演示。
http://javafx.com/
InfoQ:
http://www.infoq.com/news/2008/01/javafx-chet-haase
JavaFX Script:
http://www.sun.com/software/javafx/script/index.jsp

Clock工程src下载(程序和资源来源于Sun):here
15
3
评论 共 6 条 请登录后发表评论
6 楼 summerfeel 2008-09-04 17:15
支持拖放的功能其实并不新鲜了,个人感觉图形界面用flex的MXML来写更加符合规范也更容易维护,Adobe的UI组件很好很强大,产品的成熟度上也比JavaFx领先很多,除了swing的骨灰级fans,Java在UI方面凭什么与别人竞争?
5 楼 fight_bird 2008-08-07 17:33
产品级RIA?拜托楼主提供一个产品级的AIR版本给我用,AIR还很不完善。
4 楼 geminiyellow 2008-08-07 08:24
sun~sun~sun~~
3 楼 Nighthaven 2008-08-06 15:32
引用
其次是部署体验,通过Web部署一个JavaFX程序,要用JavaWebStart下载,还会在添加删除程序里面增加一个项

这是因为现在只是预览版,jre update 10还没有发布,发布之后这些问题就不存在了。
2 楼 metaphy 2008-08-06 12:16
引用
首先开发体验,很难把美工与程序员的职责比较好的区分开来。

这个不是问题。美工按程序的要求提供素材,程序把这些东西组织起来。

部署确实不太好。嵌入网页倒是可以用applet。说鸡肋为时过早,毕竟一切还在进展中。
1 楼 qhfrose 2008-08-06 11:14
试用过,
首先开发体验,很难把美工与程序员的职责比较好的区分开来。
其次是部署体验,通过Web部署一个JavaFX程序,要用JavaWebStart下载,还会在添加删除程序里面增加一个项。貌似现在还不能很好的整合在网页里。
按现在的情况 ,JavaFX只是鸡肋而已。希望正式版能有所改变。

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 小程序登录页面

    现在官方对小程序的getuserinfo做了调整,所有的获取用户信息都需要用户手动去触发,这个就是小程序登录前端页面,直接可以用

  • php 判断客户端是否在线,判断用户是否在线的代码

    考虑两种情况:(1)用户关闭浏览器或重定向到其他网页function exit_init() {if(xmlhttp.readyState==4){if(xmlhttp.status==200){ //}else{alert("there was a problem accessing the server:"+xmlhttp.status);}}}//定义windows 的onbeforeunl...

  • PHP如何判断访问来源是微信小程序、公众号平台、APP

    //判断是什么平台 function platform() { //ll($_SERVER['HTTP_USER_AGENT']); $platform='h5'; $a_strtolower = strtolower($_SERVER['HTTP_USER_AGENT']); if(strpos($a_strtolower, "micromessenger"))//公众号MicroMessenger {

  • php 判断来源 微信客户端_PHP如何判断访问来源是微信小程序webview?

    type: 必填项;必须是 miniprogram ,表示小程序类型;这个参数是小程序出来后新增的类型。追问type???怎么判断,请贴出完整代码,目前这个判断就完全可以了,至于你那个type如果贴出来,我试过可以,可以采纳你的答案,谢谢了你已经解决了 楼下的是多余的 谢谢本回答被提问者采纳你是想做APP开发吗,你APP访问的时候在请求头那加些特殊的数据来提交,服务器那边判断一下本回答由网...

  • php判断访问请求来源,PHP如何判断访问来源是微信小程序webview?

    其实并没有,虽然有这个说法,但实际上小程序便没有抢到APP的饭碗。但为什么这么说呢?原因在于国内的安卓应用市场多个第三方应用商店并存,流量分散、用户需求和习惯的变化加上技术变迁,都使得应用市场本身面临转型。手机里装了几十个甚至上百个App,但平均每天都会用到的数量屈指可数,又或者地图、外卖等同类App不得不装好几个换着用,明知使用频率不高却耗电、占内存就是删不得?也因为有这样的用户痛点,当“微信之...

  • php检测是否在微信小程序登录,微信小程序授权登陆及每次检查是否授权实例代码...

    授权登录登录//index.js//获取应用实例var APPID ='xxx'var SECRET = 'xxx'const app = getApp()Page({data: {list:[],userInfo:null},//事件处理函数onGotUserInfo:function (e) {if (e.detail.userInfo != undefined && app....

  • 判断请求是浏览器发出还是小程序发出

    1、获取请求的requestHttpServletRequest request=ServletActionContext.getRequest();2、拦截器中判断请求头通常判断来自手机端的请求还是PC端的请求只需要判断:request.getHeader( "content-type" ) == null && (request.getheader("user-agent").tolowerca

  • 用js判断是小程序环境还是公众号!

      哈喽this is  qiaokeai的随手记........ 有问题博主一概不负责......略略略   首先引入js <script type="text/javascript" src="https://res.wx.qq.com/open/js/jweixin-1.3.2.js"></script> 其次写script <script typ...

  • H5页面判断是否在微信小程序中

    最近在做项目时,遇到一个H5页面在小程序中隐藏部分模块,从而引出一个判断逻辑:H5判断是否在微信小程序中。 刚开始也是不停的度娘,找到用user-agent来判断,起初也是没问题,之后测试测出来个bug,即IOS手机中这个竟然不能用,于是又做了一些功课,找到一个可以用到的方法。如下 /** * 判断是否为微信小程序 * * @export * @returns */ export...

  • PHP + 小程序开发过程

    前言在此之前,我也曾经写过一篇用Go语言开发的过程总结!当然这次也不例外,同样记录下过程,方便后续再次接触时,重新拾起会轻松点。为什么我标题要以“从0到1”这样的字样做标题呢? 因为在开发此项目(PHP+小程序)之前,对php、小程序都是零基础的,就是从未接触过啦!我特意地看了一下博客文章的记录,从项目的启动时间(2017-10-12)到今天,用时一个多月左右,进度还算满意(PS:闲时开发,(*゚

  • 用PHP判断oicq是否在线的小程序

    2000年09月12日 09:19:00 来源:keniv >? function get_status($uin){ $fp = @fsockopen ("infocenter.tencent.com", 80, &$errno, &$errstr, 30); if(!$fp){ return 出错; }else{fputs($fp, "GET /$uin/l/00

  • 微信小程序获取手机号码 PHP/前端代码

    小程序端代码 // 首先需要通过wx.login()方法获取code,然后从后端换取session_key,不要获取按钮时获取可能会导致登录态失效 // index.js onLoad: function(i) { let that = this; wx.login({ success:login=>{ getApp().request({...

  • 小程序如何判断测试环境和线上环境

    因测试环境与线上环境的域名不同,上线时每次都需要该域名配置,是否有啥方法可以判断小程序当前运行环境呢? 用wx.getSystemInfoSync()判断systemInfo.platform == 'devtools' ...

  • 微信小程序 不能 setData 值为 undefined

    微信小程序使用 setData 去刷新数据值是 undefined 会报错,而经常我们后台api查询数据库记录为空,会传递 null 值,到了小程序上就转为了 undefined 由于我们需要显示没有数据时的文字信息,所以方法很多 要么就后端判断转为空数组,前端放心 setData 要么就返回错误码,前端专门判断然后用变量标示,根据变量是否显示数据为空的提示 还有就是后端不管,就是一顿...

  • 小程序setData

    "resetdata":function(){//写触发函数绑定在页面上 this.setData({//this.setdata很重要 "changdata":"哈哈哈哈哈setData调用后文字"//重新设置data里面的"changdata"的值 }) },

  • 一个 PHP文件搞定微信小程序

    不说废话 ,代码见(最后一条最为重要) 微信支付 配置参数 private $config = array( 'appid' => "",//"wxcf1dded808489e2c", /*小程序ID*/ 'mch_id' => "",//"1440493402", /*微信申请成功之后邮件中的商户id*/ 'api_k...

  • 怎么判断进入小程序的途径

    在 app.js的onShow 方法里进行获取 onShow: function (options) { let option = JSON.stringify(options); console.log('app.js option-----' + option) console.log('app.js--------------------...

Global site tag (gtag.js) - Google Analytics