Java中声明式GUI编程的建议

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (13)

我想知道在Java中是否有任何关于声明性GUI编程的建议。(我厌恶基于视觉的GUI创建器/编辑器软件,但是我们厌倦了手动实例化JPanels和Boxes以及JLabels和JLists等)

这是我的总体问题,但对于我正在考虑的方法,我有两个具体问题:

  1. JavaFX:JavaFX中是否存在一个真实的GUI显示的例子(例如,不是圆和矩形,而是列表框和按钮以及标签等),它可以与访问和更新各种元素的Java源文件进行交互?
  2. Plain Old Swing,用于解析XUL-ish XML:有没有人发明过用于Java Swing的XML的声明性语法(如XUL)?我想这并不难,可以创建一些基于STaX的代码来读取XML文件,实例化Swing元素的层次结构,并通过某种对象模型来访问层次结构。但我宁愿使用一些众所周知的记录和测试的东西,而不是试图自己创造这样的东西。
  3. JGoodies形式 - 不完全是声明性的,但有点紧密,我与JGoodies Binding有过好运。但他们的表单布局语法看起来有点神秘。

提问于
用户回答回答于

你可能会看看javabuilders ; 它使用YAML来构建Swing UI。

手册中的一个简单例子[PDF]:

JFrame:
    name: myFrame
    title: My Frame
    content:
        - JLabel:
            name: myLabel2
            text: My First Label
        - JLabel:
            name: myLabel2
            text: My Second Label

或者:

JFrame:
    name: myFrame
    title: My Frame
    content:
        - JLabel: {name: myLabel2, text: My First Label}
        - JLabel: {name: myLabel2, text: My Second Label}

甚至:

JFrame(name=myFrame,title=My Frame):
    - JLabel(name=myLabel2, text=My First Label)
    - JLabel(name=myLabel2, text=My Second Label)
用户回答回答于

作为CookSwing的作者,这是一款能够满足您需求的工具,在做实际的实现之前,我已经对此主题进行了长时间的仔细审视。我写了Java Swing GUI应用程序的生活。

国际海事组织(IMO),如果你打算使用任何种类的命令式编程语言来描述Java Swing组件,那么你也可以使用Java。Groovy等仅仅增加了复杂性而没有太多的简化。

声明式语言要好得多,因为即使是非程序员也能从中理解,特别是当您需要将特定布局的精细调整委派给艺术家时。由于简单性,可读性以及大量可用的编辑器/转换工具等,XML对于声明性语言(超过其他选择)是完美的。

以下是声明性GUI编程中遇到的问题,而不是以任何特定的顺序。CookSwing已经解决了这些问题。

  1. 易读性和简单性。(JavaFX并不比XML简单,关闭XML标签有助于读取很多内容,并且不会因为XML编辑器为您提供额外的输入,
  2. 可扩展性。非常重要,因为自定义Swing组件会出现在任何不平凡的项目中。
  3. GUI布局。也非常重要。能够处理BorderLayout,GridBagLayout,JGoodies FormsLayout等实际上是必须的。
  4. 简单的复制/粘贴。在设计布局的过程中,有必要尝试不同的布局。所以人们需要能够复制/粘贴和移动东西。XML更好,因为组件和布局的层次结构很容易看到。由于多行属性和缩进问题,JavaFX有些问题。有一个好的编辑器是必须的,并且有很多好的XML编辑器。
  5. 模板(即能够包含另一个布局文件)对于一致的外观非常有用。例如,人们可能希望拥有一致的对话框,按钮面板等。
  6. 与Java代码交互。这是至关重要的。一些GUI组件只能用Java代码创建(无论出于何种原因)。因此有必要能够加载这些对象。它也必然能够直接连接XML代码中的监听器和其他Java对象/组件。使用ID将它们连接起来将不会很好,因为它非常乏味。
  7. 国际化(i18n)。能够从资源包中加载文本/字符串而不是硬编码文本。此功能对于某些应用程序可能至关重要。
  8. 本地化(l10n)。声明式编程(特别是XML)的优点是,您可以切换到特定区域设置的其他GUI形式,就是这样。如果你使用Java或任何其他命令式语言编写代码,它并不那么容易。
  9. 错误检查/容错。初始设计通常会在这里和那里出现错误。有时候,错误可能是因为相应的Java代码还没有被设计。或者图标资源丢失。用命令式编码处理错误非常繁琐。因此,希望能够定位错误,但同时又具有容错性,因此可以尽早进行GUI布局的预览。
  10. GUI组件更换。也就是说,将原来使用JTextField的文本字段替换为一些更新的组件。用一些奇特的UI对话框(比如JIDE的)替换对话框的含义而不是JDialog。此功能可以节省大量的工作量。由于XSLT和其他转换工具,XML本身也很有用。
  11. 因为迟早你会发现许多组件配置使用对象类型,例如数组,图标,图像,向量等。

扫码关注云+社区