2024年10月javafxgui(Java的GUI技术目前在哪些领域还有较为广泛的应用,以及这种技术还会有怎样的发展前景)

 更新时间:2024-10-12

  ⑴javafxgui(Java的GUI技术目前在哪些领域还有较为广泛的应用,以及这种技术还会有怎样的发展前景

  ⑵Java的GUI技术目前在哪些领域还有较为广泛的应用,以及这种技术还会有怎样的发展前景

  ⑶Java技术是一门编程语言,也是一个平台,它基于Java虚拟机技术,借助这个东西建立了跨平台的优势。(题外话:Java热门的原因之一就是一个跨平台的概念,和跨平台类似跨浏览器的好处也是如此,这也是现在AJAX技术流行的原因之一。另外现在热炒的RIA富客户端的概念下的技术除了AJAX外还有Adobe的Flash/Flex,微软的SilverLight,SUN的JavaFX等,个人更看好FLash/Flex,原因是Flash插件在浏览器端占用率很高Java技术的重要性就不讲了,从最近流行的一个统计数据上来说,目前世界上编程语言Java、C、VB、C++依次排名前位,这排名本身不说明什么,至少也是工业界对编程语言使用上一个侧面的反映吧。Java编程语言与众不同之处在于:Java程序既是编译型的(转换为一种称为Java字节码的中间语言,又是解释型的(JVM对字节码进行解析和运行。编译只进行一次,而解释在每次运行程序时都会进行。编译后的字节码采用一种针对JVM优化过的机器码形式;解释器是JVM的实现。这段是摘自网上的,编译原理学的不是很好,对这门语言的背后运行机制理解到这样了。Java平台是一种纯软件平台,它有三个版本JavaSE、JavaEE、JavaME。JavaSE(JavaPlatform,StandardEdition这个版本以前叫做JSE,后来版本号从.直接跳到.,其实也就是.,所以就叫成JavaSE.。目前Java开发人员使用较多的版本是.,当然还有JavaSE.这个更新的版本。它允许开发和部署在桌面、服务器、嵌入式环境和实时环境中使用的Java应用程序。记住这个扣五七八零二四一四四JavaSE还包含了支持JavaWeb服务开发的类,并为JavaEE这个版本提供基础。虽说桌面应用程序,Java一直不被看好,但也稍微提一下,负责桌面GUI开发的类库我知道的有:JDK自带的主要是AWT/SWING这个Java原生类库;也可以使用IBM的SWT/JFace这个第三方类库。开发工具我了解的有:Beans(最近已经是.final版了,做GUI有使用VB的感觉,Eclipse(SWT/JFace这个项目其实就是做Eclipse项目时扩展出来的,所以对SWT/JFace支持的也不错。JavaEE(JavaPlatform,EnterpriseEdition这个版本以前叫做JEE,也就是大家可能听得比较多的,也是Java比较流行的领域,Java的企业级版本。JavaEE下有很多流行的开发框架,像Struts、Spring、Hibernate这种流行的所谓SSH组合等。根据项目大小、应用领域,技术平台的选择面还是很多的,除了JavaEE,还有.,LAMP组合(Linux、Apatch、MySql、PHP组合,相对来说比较新Ruby在RubyonRails的框架应用,后两者可能在相对来说比较轻量级的Web领域运用成功案例比较多,更重量的企业级潜力还有待挖掘。JavaME(JavaPlatform,MicroEdition这个版本以前叫做JME。应用领域像各种移动设备和嵌入式设备,比如:手机、PDA、电视机顶盒和打印机。JavaME不是太熟悉,不过移动设备和嵌入式设备的开发个人觉得算是比较有意思的领域,最近比较瞩目的业界新闻有一个就是Google发布开源智能手机操作系统开发平台Android,也就是前一阵子炒得很火的GPhone(原来Google出的不是手机,而是一个手机操作系统开发平台。这个平台貌似会对JavaME有些冲击,按照网上的消息,Android包括:、高度定制的Linux操作系统内核及智能手机硬件驱动支持;、经过Google修改过的Java虚拟机Dalvik,这里的性能比SUN的Hotspot高,支持大部分Java核心类库;、大量智能手机开发核心类库;、大量现成的智能手机应用软件;、基于Eclipse的开发环境。也是按照网上的说法,JavaEE提供了统一的编程平台,但不能调用操作系统的资源;而Android下直达操作系统,上直达应用软件,如:浏览器、日历、地图等。Java开发工具很多,个人使用的IDE有Eclipse和Beans。Eclispe比较流行,各种插件也多,当然用起来也不错;Beans现在也是越做越好了,介绍这两个IDE主要是开源的,当然还有其它工具如JBuilder、IntelliJ、JCreator。这些IDE各有优势劣势,根据你开发的项目来选择了。

  ⑷如何用javafx做gui界面

  ⑸oracle推出JavaFX本是想代替swing,awt成为新的java界面主流,但还是略显没落。就开发来说:javaFX确实比swing好看些,但没有swing的事件按钮等写法爽快,特别是使用eclipse的matisse开发视图,托拉拽的方式。可javaFX不只是有swing的优点还能支持多媒体,动画等。swing已经很久没有更新了吧,如果做GUI还是推荐javaFX。虽然javaFX略占cpu,不过现在的服务器或者pc的配置都逐步高了,一点cpu相比效果也不算啥。桌面开发javaFX的文档和资源相对于swing少些。如果两者你都不熟悉可以直接研究javaFX。

  ⑹为什么说JavaFX已经过时了

  ⑺javaFX就从来没有流行过。要说java真正流行过的gui技术只有applet,那时候独领风骚。后来的swing和swt也还可以,毕竟上个十年cs架构的程序也还有市场。而现在这些年,不是非要客户端调用dll等特殊功能,一般都做成bs架构了,javafx只能说生不逢时。

  ⑻java图形界面GUI,什么组件可以实现以下功能,求解

  ⑼swing可以通过个组件配合,模拟一个数字输入组件

  ⑽JavaFX可以直接使用Spinner组件实现,效果如下

  ⑾当然了也可以在JavaFX里使用动画,来产生更有动感的效果;如下图,使用了位置改变动画,来产生动感;

  ⑿拓展:可以在swing里使用JFXPanel?来使用JavaFX的组件~

  ⒀Java实现GUI编程基本方法都有那些

  ⒁典型的包括窗口(Window)、框架(Frame/JFrame)、对话框(Dialog/JDialog)、面板(Panel/JPanel)等。只有先创建了这些容器,其它界面元素如按钮(Button/JButton)、标签(Label/JLabel)、文本框(TextField/JTextField)等才有地方放。②添加组件为了实现GUI应用程序的功能,为了与用户交换,需要在容器上添加各种组件/控件。这需要根据具体的功能要求来决定用什么组件。例如,如果需要提示信息,可用标签(Label/JLabel);如果需要输入少量文本,可用文本框(TextField/JTextField);如果需要输入较多文本,可用文本区域(TextArea/JTextArea);如果需要输入密码,可用密码域(JPasswordField)等等。③安排组件与传统的Windows环境下的GUI软件开发工具不同,为了更好地实现跨平台,Java程序中各组件的位置、大小一般不是以绝对量来衡量,而是以相对量来衡量。例如有时候,程序的组件的位置是按“东/East“、“西/West“、“南/South“、“北/North“、“中/Center“这种方位来标识的。因此,在组织界面时,除了要考虑所需的组件种类外,还需要考虑如何安排这些组件的位置与大小。这一般是通过设置布局管理器(LayoutManager)及其相关属性来实现的。事实上上述按方位来安排组件就是采用了Java中多种布局管理器里的BorderLayout布局管理器。为了完成一个GUI应用程序所应具备的功能,除了适当地安排各种组件产生美观的界面外,还需要处理各种界面元素事件,以便真正实现与用户的交换,完成程序的功能。在Java程序中这一般是通过实现适当的事件监听者接口来完成的。

  ⒂JavaFXHTTP网络和XML分析

  ⒃JavaFX的重点是在客户端目的是提高JavaGUI的外观和感觉这样使用户体验更有吸引力的用户界面当然许多用户的应用程序需要用远程服务器来交互信息如今HTTP协议和XML作为交互信息的最佳选择而被普遍接受所以我们想要去展示的是在JavaFX中处理HTTP交流细节是多么简单的事情并且展示我们如何从一个XML数据结构中分析和提取信息的

  ⒄在本文中我们假设你已经熟悉了JavaFX语言的基本概念

  ⒅JavaFX基础语言概念

  ⒆虽然是一个汇编语言JavaFX混合了一些从Java继承下来的脚本语言的特征脚本语言用于快速简洁的应用程序开发而JavaFX基于Java所继承的特征使它成为一个更全面的语言

  ⒇JavaFX提出了一个新的编码模式作为一个声明语言它迫使我们去描述我们是多么的想要应用程序在没有描述特定的控制流下工作的尽管我们用必要的语言来做这样的事情当我们需要开发GUI的时候这个模式是真的很强大基本的想法就是在JavaFXGUI开发模式的背后是你要describe你的用户界面是什么样子的在代码和visualstructure之间有严格的关系此外在代码中用于声明对象的命令反应了用于展现他们的命令总体的结果就是它是一个简洁的方法用几行的代码就能创建一个GUI这使应用程序易于理解和维护

  ⒈另外一个JavaFX的有趣的特征就是它是一个静态类型语言这就意味着每个变量的数据类型函数等等被称为piletime针对这一特征的JavaFX教程可以链接Resourcessection

  ⒉JavaFXHTTP&XMLPackageOverview

  ⒊为了用HTTP协议和XML开发一个应用程序JavaFX提供了一些包如下

  ⒋·javafxioforhandlingHTTPmunication

  ⒌·javafxdatapullandjavafxdataxmlforXMLparsing

  ⒍在Figure中的图解显示了包括这些包的分类

  ⒎HTTP&JavaFX

  ⒏处理HTTP协议时我们在javafxio包中可以使用HttpRequest类别这个类别可以使异步HTTP请求到达支持HTTP协议的一台远程服务器中目前支持HTTP方法有

  ⒐这个类别在数据交换中是保持中立的所以我们可以调用一台远程服务器并且发送我们想要发送的任何信息类型只要我们可以提供一个OutputStream其中包括必须用POST或是PUTHTTP方法发送的数据

  ⒑与每一个HTTP支持方法有关的HttpRequest操作有特定的循环周期就HTTPGET方法来说我们关注在的是循环周期对于其他的方法(POSTPUTDELETE)循环周期是相同的如果是HTTPGET请求循环周期如Figure所示

  ⒒Figure:HTTPGETmethodrequestlifecycle

  ⒓正如以上我们所看到的每一块循环周期的描述都被HttpRequestclass的内部变量的特定值所定义

  ⒔关于每个变量的转换有一个相应的方法叫做duringthetransitionitself这样我们能够控制和处理不同的在HTTP循环周期的状态这些方法都有相应变量的相同的名字前缀用on例如我们想在请求连接到服务器时来追踪就使用onConnecting函数

  ⒕是时候为我们的JavaFX客户端进行编码了首先我们必须声明一个包括URL的变量:

  ⒖defurl:String=;

  ⒗然后创建HTTP请求并且规定callback函数当HTTP请求开始连接的时候可以呼叫

  ⒘HttpRequest{location:url;

  ⒙onConnecting:function(){

  ⒚javalangSystemoutprintln(Connecting);

  ⒛}enqueue();

  注意生成这个请求的方法enqueue()现在我们想要读取反应部分我们可以使用onInput功能提供的InputStream我们需要添加这条代码到客户端

  onInput:function(is:InputStream){try{

  varresponseSize:Integer=isavailable();

  javalangSystemoutprintln(Responsesize{responseSize});

  isclose();

  最后一步是处理在HTTP请求期间发生的任何的异常情况HTTPRequest有一个功能叫做无论何时所发生的异常(wheneveranexceptionours)所以我们可以为客户端添加异常处理的代码

  onException:function(ex:Exception){Systemoutprintln(Error:{exgetMessage()});

  如果用Beans运行客户端你可以看到类似Figure的输出

  Figure:Clientlog

  在javafxio包中有其他两个类别叫HttpHeaders和HttpStatus第一个类别定义一组常量对应相应的HTTPheader值名字第二个类别定义一组常量对应可能的HTTP反应代码

  正如我们所说的今天很多客户端用一个XML模板来发送数据到HTTP而且JavaFX提供了简单解析XML文件的能力现在我们关注其他两个包在Figure中所示

  ·javafxdataxml

  ·javafxdatapull

  javafxdatapull包含了分析一个XML文件的类别同时javafxdataxml包定义了一些常量并且处理合格的名称处理器是eventbased(类似SAXparser)并且支持两个不同的数据格式

  本文我们关注在XML数据格式

  PullParserclass是JavaFX的文件分析器的核心可以接受用于控制分析器的许多属性首先我们需要声明一个我们想要分析的文件类型使用类别属性documentType该字符串有两个值

  ·PullParserXML用于分析XML

  ·PullParserJSON用于分析JSON

  在声明文件类型之后我们需要提供文件输入去分析分析器接受一个输入流以后我们会看到这是非常方便的当我们需要去分析一个来自HTTP请求的XML文件为了声明输入流我们需要设置input变量的值

  所以来创建一个PullParser的例子如下

  parser=PullParser{documentType:PullParserXML;

  input:xmlFileInputStream;

  当分析器分析文件的时候它会产生一系列的条目我们需要执行一个callback函数来应对这些条目的发生这个callback函数叫做onEvent而其在它本身中稍后我们会执行我们的逻辑来从文件中提取信息函数签名是onEvent(event:Event)Event类别属于javafxdatapull包这个类别包括所有关于pullparsing条目而且可以用它来提取我们需要的信息作为在PullParser定义中的值之一Type声明了条目的类型我们感兴趣于一下类型的条目

  ·START_DOCUMENT:这个条目在文件分析的开始时产生的

  ·START_ELEMENT:这个条目是在分析器找到新的开始元素时产生的我们可以用这个条目来读取元素属性

  ·END_ELEMENT:这个条目是在分析器找到最后的元素时产生的我们可以用它来读取元素中的文本

  ·END_DOCUMENT:这个条目是在分析器到达最后的文件时产生的

  还有其他的条目用于JSON文件;如果你感兴趣可以看一看PullParser文件无论如何这里有针对START_ELEMENT和END_ELEMENT条目反应的一个框架实施

  onEvent:function(event:Event){/*Westart***yzingthedifferenteventtypes*/

  if(eventtype==PullParserSTART_ELEMENT){

  /*Hereweimplementourlogictohandlethestartelementevent

  forexampletoextracttheattributevaluesandsoon*/

  elseif(eventtype==PullParserEND_ELEMENT){

  /*Hereweimplementourlogictohandletheendelement*/

  在分析过程中一些错误也会产生我们可以管理他们只要检查了被分析器所产生的条目类型整合HTTP&XMLAPIs

  现在我们已经描述了这两个API该看一下最有趣的部分了我们怎样去整合所有的东西这样我们才能编译一个完整的XMLoverHTTP的客户端这是非常有用的如果我们想要一个客户端来用远程服务器交互信息

  让我们假设JavaFX客户端应用程序调用一个可以恢复XML文件的serlet结构如下

  ﹤?xmlversion=encoding=UTF?﹥﹤data﹥﹤personid=﹥﹤name﹥Mikey﹤/name﹥﹤surname﹥Mouse﹤/surname﹥﹤/person﹥﹤/data﹥

  这个一个简单的XML文件但是足够达到示例的目的了我们的目标是为我们的客户端连接到testserlet并且检索XML内容然后分析它并且显示提取的信息为了做到这一点我们需要改变HttpRequest函数onInput为了当我们开始接收XML文件时也可以去分析它如何操作的代码如下所示

  onInput:function(is:InputStream){try{

  PullParser{

  onEvent:function(event:Event){

  //Wehandletheevent

  isclose();

  注意我们怎样添加了PullParser到onInput函数而且我们设置了分析器输入流到从HttpRequest接收的输入流现在我们只需要处理以上所描述的条目

  if(eventtype==PullParserSTART_ELEMENTandeventlevel==){

  javalangSystemoutprintln(Startanewelement{eventqnamename});

  varqAttr:QName=QName{name:id};

  varattVal:String=eventgetAttributeValue(qAttr);

  javalangSystemoutprintln(AttributeIDvalue{attVal});

  elseif(eventtype==PullParserEND_ELEMENT){

  varnodeName:String=eventqnamename;

  javalangSystemoutprintln(Endelement{nodeName});

  //Nowweextractthetextonlyifthenodeisnameorsurname

  if(nodeName==nameornodeName==surname){

  vartextVal:String=eventtext;

  javalangSystemoutprintln(Text{textVal});

  一步步分析代码是非常有用的在有PullParserSTART_ELEMENT条目的情况下我们使用eventlevel变量这个告诉我们每个条目是在哪一个行发生的(从开始XML文件的根源)我们已经知道id属性是在第一行所以我们只在这一行限制提取然后创建一个QName目标设置名称变化是根据属性名称然后我们应用该值

  在PullParserEND_ELEMENT情况下我们想要提取节点内容为了做到这一点我们使用包括节点值的text变量

  如果一切运行正常我们将会在项目控制台(console)中看到所分析的条目如Figure所示

  FigureHTTPrequestwithXMLparsing

  结束语lishixinzhi/Article/program/Java/JSP//

  JavaFX绑定探究

  数据绑定连接一些对象并且使它们同步尽管Swing的开发者们取决于额外的类库但是绑定是完全融入了JavaFXScript编程语言仔细看一看它运行的库显示了一个完全绑定构架其基本概念与JGoodiesBinding和BeansBinding很相似(在我以前的文章BindingBeans中有做过比较)JSR(BeansBinding)可能不会成为Java的一部分所以一直寻找可代替品的开发者们会问自己JavaFX绑定构架是否可以通过简单的Java程序而进行使用

  JavaFX建立在普通的JavaSE运行上为了在本文中展示这个示例你需要为你的操作系统(在此只支持官方的Windows和MacOSX)下载合适的JavaFXSDK具体请参考Resources安装installation过程只需要几个步骤在Windows的机器上默认安装地址是C:ProgramFilesJavaFXjavafxsdkMacOSXusersshouldlookat/Library/Frameworks/JavaFXframework/Versions/

  图JavaFXSDK基础目录

  图显示了JavaFXSDK的基础目录这个bin目录包括可执行编译并运行JavaFXScript程序我们不使用它们JavaFX(Script)documentation在docs中文件srczip包括部分JavaFX运行的来源如果你打开它你会注意到文件是以stg和st结尾的最后lib和它的子目录包含库jars本文的示例取决于它们中的一些

  lib/shared/javafxrtjar包含sunjavafxruntimelocation包它的类和接口来自基本的JavaFXBinding的构建块例如Location接口代表一个值它可能是可变的或是不能改变的有效或无效的空的或是非空这样的状态可以通过相应的getters来查询例如isMutable()如果Location的值是无效的当update()方法被调用时或该值被检索时它会被更新

  一个Location的类型是通过子接口来决定的;例如IntLocation如果你要在srczip中查询IntLocationjava你不会看到它这是因为它的来源是来自两个文件XxxLocationst和XxxTemplatestg每个子接口为类型XYZ添加getAsXYZ和andsetAsXYZ()还有DoubleLocationFloatLocationShortLocationCharLocationLongLocationBooleanLocationByteLocation和ObjectLocation

  其他的对象可能会附属于一个Location当值与地址变化联系在一起的时候changelisteners可以接收到通知最后Locations是很懒惰的虽然当值无效的时候changelisteners会得到通知但是新的值不会被重新计算直到需要它的时候到目前为止我指谈论了接口的问题当然可以为我以上所提到的类型而随时执行Locations

  publicstaticvoidmain(Stringargs){

  finalIntVariablei=IntVariablemake();

  iaddChangeListener(newChangeListener(){

  publicbooleanonChange(){

  Systemoutprintln(onChange():+iget());

  returnfalse;

  Systemoutprintln(iget()+

  isMutable():+iisMutable());

  IntLocationi=IntConstantmake();

  Systemoutprintln(iget()+

  isMutable():+iisMutable());

  iset(iget());

  为了编译并运行LocationDemo请附加lib/shared/javafxrtjar到你的类路径上这个演示示例采用了IntVariable和IntConstant类两个都执行了IntLocation接口因此是Locations使用静态make()方法创建Instances使用get()查询当前值正如你在图中所看到的在初始化引发一个通知之后设置一个值它通过子抽象类ChangeListener来进行处理

  图LocationDemo输出

  当地址内容已经改变的时候它的onChange()方法被调用该方法返回一个Boolean值指示监听者是否仍然有效返回false将导致监听者从监听者名单上删除Javadoc建议当相关的弱引用被报告清除的时候那些做它们自己弱引用管理的监听者应该返回false

  就像JGoodiesBinding的ValueModel还有BeansBinding的Property一样Locations读取和编写类型值提供了一个方法它们也可以通知注册的监听者关于值的变化最后你将会在以下的小节中看到它们用于建立绑定

  像BeansBinding和JGoodiesBinding一样JavaFX运行包含一个辅助类来建立绑定sunjavafxruntimelocationBindings它是用于在两个Locations之间建立bijective关系这个意思是说如果一个值被更新它所对应的也会被更新在Locations被实例之后它们被传递到bijectiveBind()

  publilassBindingDemo{

  privatestaticIntLocationii;

  publicstaticvoidmain(Stringargs){

  i=IntVariablemake();

  i=IntVariablemake();

  BindingsbijectiveBind(ii);

  showValues();

  isetAsInt();

  showValues();

  isetAsInt();

  showValues();

  privatestaticvoidshowValues(){

  Systemoutprintln(i:+iget());

  Systemoutprintln(i:+iget());

  bijectiveBind(ii)在i和i之间建立两种依赖关系如果其中一个被更新例如调用setAsInt()其他的值也会变化为了到达此目的执行附加了两个监听者在Locations中分享状态方便的方法makeBijectiveBind()创建一个新的Location并它绑定到现存的绑定上面如下所示

  i=IntVariablemake();

  i=BindingsmakeBijectiveBind(i);

  BindingDemo展示了如何使用它它包含在/today////sourceszip中具体细节请参考Resources图显示了它的输出

  图BindingDemo输出

  请注意只有可编译的类型才能使用bijectiveBind()来进行绑定以下的代码行取自BindingDemojava(包含在sourceszip中的)第一眼看上去代码没什么问题但是它们会抛出ClassCastException异常这里发生什么事情了呢?

  ObjectLocationloc=IntVariablemake();

  ObjectLocationloc=BooleanVariablemake();

  BindingsbijectiveBind(locloc);

  在创建绑定的过程中locget()结果被传递到loc的set()方法中这个不会为Boolean和Integer工作的为了避免这种问题只要适当的确定参数泛型类型ObjectLocation目前为止我们已经看到两个变量是如何被同步的以下的小节中将看一看Swing组件是如何被绑定的

  几乎每个JavaFXScript教程都是由显示一个窗口按钮或是标签的小程序开始的JavaFX使用Swing来构建并显示这些组件因此我们可以假设Swing融入了JavaFX运行不久你将会看到这个也会应用于绑定

  lib/desktop/javafxswingjar文件包含javafxextswing包它的类包含了大多数常见的Swing组件如果你检查它们你将会注意到它们用$开始显示各区域它们的类型是ObjectVariable它可以执行ObjectLocation

  图在Eclipse的Members视图中SwingLabel

  考虑到这个接口属于sunjavafxruntimelocation包它是安全的假设这样的Locations可以绑定到其他的变量上以下的程序展示你是如何做到这个的为了编译并运行这个示例请添加lib/shared/javafxrtjarlib/desktop/javafxswingjarlib/desktop/Scenariojar以及lib/desktop/javafxguijar到你的类路径上

  publilassSwingDemo{

  publicstaticvoidmain(Stringargs){

  JFramef=newJFrame();

  fsetDefaultCloseOperation(JFrameEXIT_ON_CLOSE);

  JPanelp=newJPanel(newBorderLayout());

  fsetContentPane(p);

  SwingLabellabel=newSwingLabel();

  ObjectLocationtext=

  BindingsmakeBijectiveBind(label$text);

  padd(labelgetJponent()BorderLayoutCENTER);

  fsetVisible(true);

  textset(HelloJavaFX!);

  }除了这个很有用的创建并显示窗口的Swing代码之外还有三件比较重要的事情要做

  SwingLabel被实例化并分配到label

  Location被分配到test并绑定到label的$text上

  标签被有层次的添加到组件上

  请注意你不能直接添加SwingLabel到容器中相反它的getJponent()方法用来获取Jponent实例

  虽然这个简单的例子展示了一个Swing组件如何被绑定到一个变量上的但是却没有说明使用JavaFX绑定的好处在我以前的文章BindingBeans中我演示了如何使用JGoodiesBinding和BeansBinding来执行一个简单的音量控制

  VolumeControl示例

  音量控制是基于一个简单的特定应用的POJO叫做Volume它有两个区域volume和mute如图所示它通过一个复选框和一个滑块进行操作标签显示现在的volume值除此之外mute控制音量是否调整

  涉及Swing组件和POJO区域之间的关系如下

  滑块设置volume

  Mute选择或不选择复选框

  Volume设置成滑块的位置

  Mute启用或禁用滑块

  Volume设置标签文本

  完整的来源包含在sourceszip中细节请参考Resources部分它的结构很像我以前的文章中的版本所以很容易比较不同的版本为了编译并运行VolumeControl请添加lib/shared/javafxrtjarlib/desktop/javafxswingjarlib/desktop/Scenariojar和lib/desktop/javafxguijar到你的类路径

  首先所有相关的组件都要初始化这个发生在initponents()中例如垂直坏块被创建并有如下设置

  sliderVolume=newSwingSlider();

  sliderVolume$verticalset(true);

  在initEventHandling()中建立绑定例如复选框与mute链接用以下命令BindingsbijectiveBind(checkboxMute$selectedvolumemute);当复选框被选择的时候禁用滑块是通过添加一个监听者到mute上实现的

  volumemuteaddChangeListener(newChangeListener(){

  publicbooleanonChange(){

  sliderVolume$enabledset(!volumemuteget());

  returntrue;

  });每次volumemute改变的时候onChange()就会被调用如果它变成true滑块就被禁用如果变成false滑块就再次使用这个状态用sliderVolume$enabledset()来设置相同的方法同样适用于创建标签文本滑块的值用Integer代表正如我们早前已经看到的它不能绑定到Strings上转换完成如下

  publicbooleanonChange(){

  labelInfo$textset(volumevolumeget()toString());

  returntrue;

  }通过使用toString()get()结果变成aString并传递labelInfo$textset()

  很惊讶的看到JavaFX绑定在Swing应用程序中的使用是如此简单虽然绑定构架还没有为这个所设计但是它是一个相当体面的工作尽管如此本文还是故意忽视了一些问题

  Sun会允许使用并可能重新分配部分JavaFX运行给非JavaFX应用程序吗?

  如何安全使用内部类?这里所描述的包还没有被设计成公共的APIS

  为什么没有成熟的绑定构架给Swing开发者们使用?lishixinzhi/Article/program/Java/JSP//

  JAVA中提供GUI默认工具类是什么

  java以前默认javaSwing和javaAWT,可以只使用jdk带的jar包开发。java加入了javaFX。java以后,把javafx从标准jdk中删除,需要手动引入javafx的jar包才能开发桌面应用。

您可能感兴趣的文章:

相关文章