JavaFX如何与WPF进行比较?

我大多是C#程序员,大约10年前我停止编写Java,但我尝试通过阅读文章,与朋友交谈等方式跟上Java技术。

我听说过称为JavaFX的新的丰富的GUI框架,但是找不到任何将它与非Java平行对比的资源。

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

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

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

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


    过去几周我一直在学习JavaFX。 这里有一个关于它如何与WPF进行比较的高层次概述:

    我所有的评论都与JavaFX 2.0有关。 由于该平台还相当不成熟并且正在积极开发中,因此这些信息可能会有所变化。

    图像

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

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

    标记

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

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

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

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

    FXML的介绍可以在这里找到。

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

    捆绑

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

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

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

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

    A.Add(B,C);

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

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

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

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

    JavaFX和WPF之间最大的区别之一是绑定主要是在JavaFX中的代码中执行的,而WPF是在标记中建立绑定的方式。

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

    样式

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

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

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

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

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

    就我个人而言,我更喜欢CSS到XAML样式,这些样式往往过于冗长。

    JavaFX CSS的指南可以在这里找到。

    布局

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

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

    控制

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

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

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

    结论

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

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

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


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

  • JavaFX语言
  • 在JavaFX中创建一个UI
  • 他们非常快,并给你一个良好的语言感觉。 如果您对更多教程和文章感兴趣,JavaFX网站上还有许多其他的内容。

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

  • JavaFX拥有自己的声明性语言来创建不是xml衍生物的“可视化树”。 用户界面基于场景图形,因此您可以将各种效果和动画应用到图形中的任何节点。 有关更多信息,请参阅教程。 还有一个JavaFX的设计工具(我还没有尝试过)。
  • JavaFX具有内置到语言中的绑定。
  • 桌面上的JavaFX使用使用GPU渲染的Java AWT / Swing。 Java的每个版本似乎都将更多的图形卸载到GPU上。 Sun的Chris Campbell发表了一些关于GPU加速的文章。 我不确定JavaFX的移动版本是否具有GPU加速功能。 我发现JavaFX的早期版本对于我所需要的功能不够高,但我知道最新版本的性能比以前的版本有显着的提高,并且仍在努力提高速度。
  • JavaFx使用Java小程序在浏览器中运行。 从Java 6 update 10开始,Java applet框架已经过重新设计,尽管它没有Adobe Flash那么无缝,但它有很大的改进。 我不确定它如何与Silverlight相比,除了让Silverlight在Linux上工作时遇到困难之外,它确实让JavaFX在Linux上工作。
  • 这是另一个相关的问题。

    链接地址: http://www.djcxy.com/p/65911.html

    上一篇: How does JavaFX compare to WPF?

    下一篇: No conversion from RGB to YUV