JavaFX如何与WPF比较?

我大多是一个C#程序员,我大约十年前就不再写Java了,但是我通过阅读文章,和朋友交谈等方式来跟上Java技术的发展。

我听说过一个叫做JavaFX的新的丰富的GUI框架,但是找不到任何比较它与非Java平行的资源。

由于我对C#和WPF非常熟悉,所以我想了解两种技术有多相似或不同。

编辑:看到没有答案即将到来,我会尝试更具体:

  1. WPF使用XAML来创build可视化树,JavaFX有类似的东西吗?
  2. WPF最适合与MVVM模式中的视图模型绑定,JavaFX是否也广泛使用绑定?
  3. WPF利用GPU进行渲染,JavaFX也是这样做的吗?
  4. 当通过networkingPC上的浏览器运行时,Silverlight如何与JavaFX进行比较?

…更多来…

我正在改变这个社区wiki,以便比较可以不断更新(希望)。

我在过去的几周里一直在学习JavaFX。 这里是一个关于WPF和我眼中的比较的高层次的概述:

我所有的评论都与JavaFX 2.0相关。 这个信息可能会随着平台的相当不成熟而正在被积极地发展而改变。

图像

像WPF一样,JavaFX使用保留的graphics渲染系统。 用户界面包含一个由“节点”组成的场景图,可以被认为在概念上类似于WPF的UIElement

如果可用,JavaFX会将graphics渲染卸载到GPU。 graphics系统使用Windows上的DirectX和其他平台上的OpenGL。

标记

JavaFX用户界面既可以通过代码也可以通过与XAML类似的FXML标记来创build,因为对象图可以通过嵌套元素来创build。

FXML与XAML有一些相似的特性,如属性绑定(仅限简单expression式)和绑定到事件处理器(任何onEvent方法)。 事件处理程序可以在线声明,但通常绑定到相关控制器中的事件。

FXML文件可以有一个关联的控制器,它允许你声明复杂的事件处理程序并设置属性之间的绑定。 这是一个MVC意义上的控制器,并不像WPF世界中的viewModel(通常控制器将引用节点和控件)。

与WPF不同的是,FXML似乎并没有被编译成像BAML这样的中间二进制表示。 我还没有注意到任何性能问题,但没有广泛使用该系统。 我注意到,虽然FXML通常比任何XAML都要短,因为平台仍鼓励您编写代码和样式分开声明。

FXML的介绍可以在这里find。

场景构build器是免费提供的(如啤酒),所以如果您不喜欢手工编写UI,您可以拖放元素,设置属性并绑定到控制器中的代码,FXML将自动生成。 很显然,场景构build器远不如Expression Blend强大,但仍然比Visual Studio提供的“devise器”更好。

捆绑

JavaFX有一个非常强大的属性和绑定系统。 Java Bean模式已被扩展为包含封装属性的类(类似于WPF依赖属性表示属性的方式)。 这些类实现提供失效和更改通知的接口。

失效通知和更改通知之间有区别。 无效只是告诉你,绑定expression式现在是无效的,需要重新计算; 重新计算直到您通过其get()getValue()方法请求属性值才会实际发生。 但是,如果注册了更改侦听器,则将立即重新评估expression式,绑定到该属性的任何内容都将反映这些更改。

JavaFX以类似于WPF的方式公开了这些属性,其中包含一个get和set属性以及一个返回属性包装(不像WPF属性一样是静态的)的实例的方法。

可以在多个属性之间创build复杂的绑定。 想要一个整数属性是另外两个(a = b + c)的总和? 没问题,JavaFX提供了一个stream畅的API来expression这种关系EG

A.Add(B,C);

如果B或C的值发生变化,则会提出相应的通知,以便系统知道A需要重新评估。 请注意,在这种情况下,如果尝试将A的值设置为与其他属性绑定,则会引发exception,因此在此上下文中没有意义。

这些expression式可以是相当复杂的EG a = (b + c) * (d - e)并且可以包括任意数量的属性。 stream畅的API相当容易阅读和使用,但并不像某些Microsoft库提供的Fluent API那么好,但这更多的是Java语言的限制,而不是JavaFX本身。

可以在相同types的属性之间创build简单的双向绑定,以便如果更新另一个绑定,另一个绑定会自动反映更改。

如果您想要创build一个不是由API提供的自定义绑定expression式,或者如果您关心性能,JavaFX还提供了一个低级别的API来自定义绑定。

JavaFX和WPF最大的区别之一是绑定主要是用JavaFX中的代码和WPFbuild立绑定的方式进行的。

有关属性和绑定的介绍可以在这里find。

样式

JavaFX使用CSS来改变场景图中包含的节点的外观。 有一个完整的规范可用来解释可以在每个节点types上设置的types和属性。

JavaFX还提供了一些有助于改进CSS的附加function,例如可在其他地方定义和使用的variablesEG

 .button { my-custom-color: RGB(234, 44, 78); } .my-control { -fx-background-color: my-custom-color } 

它还提供了一些function,使您可以从其他以前定义的颜色中派生颜色,这对于创build像渐变这样的东西很有用。 这意味着可以定义颜色的基础调色板,其余的可以从这些值生成(这是默认的JavaFX CSS文件所做的)。

JavaFX CSS不允许你定义一个节点使用的布局的types (因为所有的布局都需要在代码中执行)。 这对我来说真的很好,因为这是CSS的一个方面,当使用HTML时,真的让我感到痛苦。

就我个人而言,我更喜欢CSS到XAML样式,这往往是我想要的太冗长。

JavaFX CSS的指南可以在这里find。

布局

JavaFX提供了许多类似于WPF提供的布局窗格。 我注意到的一个区别是度量和布局合同是在Region类的inheritance链中进一步定义的。

如前所述,Layout不能使用CSS来执行,但可以使用代码FXML来表示,或者使用场景构build器(最终转换为FXML)来创build。

控制

JavaFX提供了我们所期望的不断增长的控件库。 JavaFX和WPF之间的一个主要区别是,控件本质上是黑色的,并且不能以WPF控件的方式进行重新模板化。 他们似乎也暴露了比WPF控件less得多的属性。

这些控件确实将一些特定于实现的区域暴露给CSS,从而允许您的样式指定控件的特定区域。 这被称为控制的子结构 。 EG CheckBox公开两个子结构; 该框和复选标记允许控件的每个部分独立地进行样式devise。 请注意,如前所述,只能使用CSS来更改控件的外观 ,但感觉不能。 EG不能通过用WPF TabControl改变其内部布局面板来显着改变TabPane布局内容的方式。

虽然这听起来相当有限,但在JavaFX中创build自定义控件的首选方式似乎是沿着从布局面板派生的线来定位标准控件,并使用CSS对其进行重新devise。

结论

总的来说,我对JavaFX目前提供的东西印象深刻。 虽然它不像WPF那么成熟,但它正在被积极开发,而且Oracle似乎正在支持这一点。 时间会告诉你是否成功。

我会build议给JavaFX一个尝试。 阅读文档并尝试放置一个小应用程序,看看你的想法。

您还应该查看定期更新开发团队提供的信息的FXExperience.com 。

我认为最好的方式来感受JavaFX只是试试看。 JavaFX网站上有一些很好的教程。 这里有一对夫妇:

  • JavaFX语言
  • 在JavaFX中创build一个UI

他们很快,给你一个良好的语言感觉。 如果您对更多教程和文章感兴趣, JavaFX网站上还有许多其他的文章。

对于你的问题的具体答案:

  1. JavaFX有自己的声明性语言来创build不是xml派生的“可视化树”。 UI基于场景graphics,因此您可以将各种效果和animation应用到graphics中的任何节点。 有关更多信息,请参阅教程。 还有一个JavaFX的devise工具(我还没有尝试过)。
  2. JavaFX具有内置到语言中的绑定 。
  3. 桌面上的JavaFX使用使用GPU渲染的Java AWT / Swing。 Java的每个版本似乎都将更多的graphics卸载到GPU上。 Sun公司的Chris Campbell曾经发表过一些关于GPU加速的文章 。 我不确定JavaFX的移动版本是否具有GPU加速function。 我发现JavaFX的早期版本并不足以满足我需要的性能,但是我知道最新版本的性能比以前的版本有显着提高,并且仍然在努力提高速度。
  4. JavaFx使用Java小程序在浏览器中运行。 从Java 6更新10开始,Java applet框架已经过重新devise,尽pipe它不像Adobe Flash那样无缝,但它有很大的改进。 我不确定它是如何与Silverlight比较的,除了让Silverlight在Linux上运行,还没有让JavaFX在Linux上运行。

这是另一个相关的问题 。