我有一段时间回过头来玩JavaFX,并且在使用该语言方面有好有坏的经验。 随着JavaFX 2.0 beta的发布,我想尝试一下。

在这里,我开发了一个简单的地址解析应用程序,该应用程序将使用Google地址编码API来获取地址并提供该位置的纬度-经度值。

我使用Groovy进行JSON解析,因为最新版本1.8提供了一个非常整洁的json解析支持。

import groovy.json.*class GeocodingParser {static def GEOCODE_JSON_URL = "http://maps.googleapis.com/maps/api/geocode/json"static def GEOCODE_XML_URL = "http://maps.googleapis.com/maps/api/geocode/xml"static def getGeocodeForAddress(address){def queryBuilder = []queryBuilder << "address=${URLEncoder.encode(address)}"queryBuilder << "sensor=false"def queryString = queryBuilder.join("&")def requestUrl = GEOCODE_JSON_URL+"?${queryString}"def payload = new URL(requestUrl).textdef jsonSlurper = new JsonSlurper()def doc = jsonSlurper.parseText(payload)def geocode = new Geocode()geocode.latitude = doc.results.geometry.location.lat.join("")geocode.longitude = doc.results.geometry.location.lng.join("")geocode.locationType = doc.results.geometry.location_type.join("")return geocode}
}class Geocode {def String latitudedef String longitudedef String locationTypedef String toString(){return "Latitude: ${latitude}, Longitude:${longitude} and Location type: ${locationType}"}
}

您可以看到使用JsonSlurper进行的json解析非常简洁。 groovy解析器返回Geocode包装器类中的纬度,经度和位置类型(这些是我们应用程序所关注的值)的值,这也是Grooy Bean。

现在,让我们看一下实际上是本文重点的JavaFX代码:

public class NewFXMain extends Application {/*** @param args the command line arguments*/public static void main(String[] args) {Application.launch(NewFXMain.class, args);}@Overridepublic void start(Stage primaryStage) {primaryStage.setTitle("Geocoder");TabPane mainTabPane = new TabPane();Tab geoTab = new Tab("Geocoding");geoTab.setClosable(false);mainTabPane.getTabs().add(geoTab);final GridPane geoGrid = new GridPane();geoGrid.setHgap(10);geoGrid.setVgap(10);geoGrid.setPadding(new Insets(0, 20, 0, 10));Label mainGeoLabel = new Label("Geocoding");final TextBox geoAddressTextBox = new TextBox(15);Button geoCodeButton = new Button("Geocode");final TextBox latitudeValTextBox = new TextBox();latitudeValTextBox.setEditable(false);final TextBox longitudeValTextBox = new TextBox();longitudeValTextBox.setEditable(false);final TextBox locationTypeValTextBox = new TextBox();locationTypeValTextBox.setEditable(false);final StringProperty latitudeProperty = new StringProperty();latitudeProperty.addListener(new ChangeListener<String>() {@Overridepublic void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {latitudeValTextBox.setText(newValue);}});final StringProperty longitudeProperty = new StringProperty();longitudeProperty.addListener(new ChangeListener<String>() {@Overridepublic void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {longitudeValTextBox.setText(newValue);}});final StringProperty locationTypeProperty = new StringProperty();locationTypeProperty.addListener(new ChangeListener<String>() {@Overridepublic void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {locationTypeValTextBox.setText(newValue);}});geoCodeButton.setOnAction(new EventHandler<ActionEvent>(){@Overridepublic void handle(ActionEvent event) {String address = geoAddressTextBox.getText();if(address == null){}else{Geocode parsedCode = (Geocode)GeocodingParser.getGeocodeForAddress(address);latitudeProperty.set(parsedCode.getLatitude());longitudeProperty.set(parsedCode.getLongitude());locationTypeProperty.set(parsedCode.getLocationType());}}});geoGrid.add(mainGeoLabel, 4, 1);geoGrid.add(new Label("Address"), 2, 3);geoGrid.add(geoAddressTextBox, 3, 3,3,1);geoGrid.add(new Label("Latitude"), 2,7);geoGrid.add(new Label("Longitude"),2,8);geoGrid.add(new Label("Location Type"),2,9);geoGrid.add(latitudeValTextBox,3,7,2,1);geoGrid.add(longitudeValTextBox,3,8,2,1);geoGrid.add(locationTypeValTextBox,3,9,2,1);geoGrid.add(geoCodeButton, 4, 5);geoTab.setContent(geoGrid);Scene scene = new Scene(mainTabPane);primaryStage.setScene(scene);primaryStage.setVisible(true);primaryStage.setResizable(false);}
}

我已经使用绑定来绑定显示纬度,经度和位置类型值的组件以及具有相同值的属性。 例如,以下代码显示了纬度值如何绑定到将显示该值的控件。 该控件(文本框)保存了通过Geocoding API发送的json响应后获得的纬度值。

现在,我们创建一个StringProperty来保存纬度的值,并将更改侦听器附加到此属性,以使该属性中的值一旦更新,便会使用新值更新文本框。 那么,到底是什么改变了这个财产的价值? 我们添加一个按钮,该按钮调用groovy解析器并在包装类中获取纬度,经度和位置类型值。 在上面的动作侦听器中,我们获取已解析的值,然后使用相应的值更新属性。 此更新依次触发相应的更改侦听器中的方法。

现在进入控件的布局。 我使用了GridBox布局,这非常灵活,因为它使我能够以整齐的顺序放置组件。

以下是一些想法:

  • JavaFX 2.0已更改,以使Java程序员更加友好
  • JavaFX 2.0比JavaFX脚本更为冗长-例如:研究必须完成绑定的方式。
  • 缺乏工具支持–创建GUI很困难。
  • Java程序员不必一起学习新的语言,他们对JavaFX API感到很宾至如归
  • 与其他JVM语言(如Groovy,Scala)的互操作性。
  • JavaFX 2.0中添加了许多新控件,API。
  • 缺乏多平台支持。

源代码可以在这里找到。

参考: 使用JavaFX 2.0 beta的示例应用程序以及 JCG合作伙伴 Mohamed Sanaulla在Experiences Unlimited Blog上的 想法 。

相关文章 :
  • Xuggler开发教程
  • YouTube Java API入门
  • SmartGWT入门,提供出色的GWT界面

翻译自: https://www.javacodegeeks.com/2011/06/javafx-20-beta-sample-application-and.html

JavaFX 2.0 beta示例应用程序和思考相关推荐

  1. 书评:JavaFX 2.0:示例介绍

    尽管Oracle在JavaOne 2010和JavaOne 2011上对JavaFX的更改使我从怀疑论者转变为对JavaFX的信奉者 ,但是JavaFX愿景的转变并非没有缺点 . 特别是,JavaFX ...

  2. 从JavaFX 1.3迁移到JavaFX 2.0

    几天前,我完成了将Modellus的源代码从JavaFX 1.3脚本迁移到JavaFX 2.0 Java语言的过程. 因此,我认为写关于我在此过程中学到的知识会很好. 我想指出,如果您想继续在Java ...

  3. 将JavaFX 2.0与Swing和SWT集成

    JavaFX 2.0对JavaFX的改进之一是可以更轻松地与Swing和SWT进行互操作 . 一些在线资源记录了如何完成此操作. 其中包括将JavaFX集成到Swing应用程序和SWT Interop ...

  4. 一步一步学Silverlight 2系列(35):升级Silverlight 2 Beta 1应用程序到Beta 2

    摘要 Silverlight 2 Beta 2发布之后,在原来的Beta 1基础之上有了很多的改变.本文总结一下Silverlight 2 Beta1 和Beta 2之间的变化,以及升级Silverl ...

  5. 国外博客透露JavaFX 2.0路线图

    [国外博客]大家注意否,JavaFX脚本语言已经转化为纯粹的Java APIs for JavaFX.当然,令人印象深刻的是其背后的JavaFX团队.仅仅2年的时间,从1.0到1.3.x,增加了很多的 ...

  6. JavaFX 2.0示例介绍书

    我最近完成了有关JavaFX 2.0 SDK新版本的书的编写,并且已经将它放在您附近的书店( Amazon )的书架上. 该书将逐步指导您完成JavaFX 2.0的来龙去脉. 当您遇到一章时,将看到一 ...

  7. java fx fxml界面_使用 JavaFX 2.0 FXML 呈现企业应用程序的 UI

    使用 JavaFX 2.0 FXML 呈现企业级应用程序 UI 作者:James L. Weaver 使用 FX 标记语言的强大功能定义企业级应用程序的 UI. 2012 年 6 月发布 下载: :示 ...

  8. JavaFX官方教程(三)之JavaFX示例应用程序入门

    翻译自   JavaFX示例应用程序入门 此示例应用程序集旨在帮助您开始使用常见的JavaFX任务,包括使用布局,控件,样式表,FXML和视觉效果. Hello World,JavaFX Style ...

  9. [转]微软代码示例:ASP.NET 2.0 三层架构应用程序教程系列

    本文转自:http://www.codeusing.com/hi/uephee.wen/resource/view/170.aspx 资源分类:微软代码示例               更新日期:20 ...

最新文章

  1. 6、HTML有序列表+无序列表+定义列表
  2. 用MsgWaitForMultipleObjects代替WaitForSingleObject和WaitForMultipleObjects()
  3. JS - JSON对象与JSON字符串相互转换的几种方法
  4. python导入requests库一直报错原因总结_python导入requests库一直报错原因总结 (文件名与库名冲突)...
  5. static 和 visibility hidden 的区别
  6. 实验一 熟悉常用的Linux操作,实验2-熟悉常用的HDFS操作
  7. LInux系统木马植入排查分析 及 应用漏洞修复配置(隐藏bannner版本等)
  8. 制造跨度 makespan是什么
  9. .net中对时间的操作
  10. 语义分割数据集——VOC2012
  11. Android -- 创建数据库到SD卡
  12. 【数据库】结构化数据、非结构化数据、半结构化数据的区别
  13. Android关系型数据库应用——电话(短信)黑名单
  14. 小程序输入框字数统计
  15. 2020-09-15 JAVA面试题整理
  16. 数据分析、数据挖掘、数据运营有啥区别?
  17. 亲,你寄的 U盘不是 4G 的哟~
  18. 191_Ubuntu 18.04安装Samba服务器及配置
  19. 【创利树】电商的用户流失率是80%,你的用户流失率是多少呢?
  20. 浪涌保护器的工作原理(SPD)

热门文章

  1. java 键入_在Java中键入Safe SQL
  2. dc/os_DC / OS中具有Java和数据库应用程序的服务发现
  3. 数据结构压缩_将数据压缩到数据结构中
  4. 赞扬精心设计:基于属性的测试如何帮助我成为更好的开发人员
  5. 使用Apache Kafka作为消息系统的发布-订阅通信中的微服务,并通过集成测试进行了验证...
  6. java 开发人员工具_Java开发人员应该知道的7种新工具
  7. Spring Boot微服务,Docker和Kubernetes研讨会–第一部分
  8. Java 9、10及更高版本:Java平台的未来
  9. jmeter异步请求测试_使用JMeter对异步HTTP / REST服务进行压力/负载测试
  10. 构建openjdk镜像_在Windows上构建OpenJDK