55

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

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

  1. JavaFX:在JavaFX 中是否有一个真实的GUI 显示(例如,不是圆形和矩形,而是列表框、按钮和标签等)的示例,它可以与访问和更新各种元素的Java 源文件交互?

  2. Plain Old Swing with something to parse XUL-ish XML:有没有人发明了一种用于 XML 的声明性语法(如 XUL)以与 Java Swing 一起使用?我想不难做到,创建一些基于 STaX 的代码,它读取 XML 文件,实例化 Swing 元素的层次结构,并通过某种对象模型使层次结构可访问。但我宁愿使用众所周知的、有文档记录和测试过的东西,也不愿自己发明这样的东西。

  3. JGoodies Forms——不完全是声明性的,但有点接近,我在 JGoodies Binding 上运气不错。但是他们的表单布局语法似乎有点神秘。

编辑:这里有很多很棒的答案!(我在上面添加了#3)我会特别感谢听到你们中的任何人在将这些框架之一用于实际应用程序方面的任何经验。

ps 我确实尝试了一些谷歌搜索(“java gui declarative”),只是不太知道要寻找什么。

4

14 回答 14

23

你可以看看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)
于 2009-04-17T16:56:29.473 回答
20

作为 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 的 textfield 替换为一些更高级的组件版本。用一些花哨的 UI 对话框(例如 JIDE 的)代替对话框的含义,而不是 JDialog。此功能可以节省大量工作量。由于 XSLT 和其他转换工具,XML 本身也很有用。
  11. 超越摇摆。因为迟早你会发现许多组件配置使用对象类型,例如数组、图标、图像、矢量等。
于 2009-05-28T12:41:16.430 回答
13

如果简洁很重要,您可能需要考虑双括号习语:

new JFrame("My Frame") {{
    setName("myFrame");
    add(new JLabel("My First Label") {{
         setName("myLabel2");
    }};
    add(new JLabel("My Second Label") {{
         setName("myLabel2");
    }};
}}

这样您就不会失去众所周知的通用编程语言的任何功能(您知道您将需要它,而 JellyTags 很烂)。你所需要的只是一个额外的习语。

它的使用并不多,因为实际上人们对 XML 的不满并没有解决真正的痛点。

通常,您可以使用构建器层来抽象重复代码。GUI 代码不必写得很糟糕,只是几乎所有代码都是如此(包括在教科书中)。

于 2009-04-17T19:38:06.230 回答
11

我强烈推荐MiG Layout - 需要几天时间来适应语法,但是一旦你掌握了它,它就会产生奇迹。我使用 JGoodies Forms 有一段时间了,Karsten 的构建器概念运行良好,但它有点神秘…… MiG 更容易上手,并且代码非常简洁。

于 2009-04-18T05:15:12.487 回答
7

如果您愿意稍微超越普通 Java,Groovy的“构建器”概念与 GUI 配合得非常好。当然,您可以相当轻松地在 Groovy 和 Java 之间进行互操作。有关更多信息,请参阅Swing Builder页面。

于 2009-04-17T16:55:28.680 回答
2

试试 Swiby:http ://swiby.codehaus.org/

“Swiby 是 Swing 和 Ruby 的混合体,适用于真正丰富的分布式应用程序。” 换句话说,Swiby 是一种混合了 swing 和 ruby​​ 的领域特定语言。

于 2009-04-17T16:55:59.240 回答
2

SDL/Swing完全满足您的需求。它是一个小巧 (283k)、不显眼、易于学习的声明性 Swing 框架。

menus {
    "File" {
        "Open" do="open" // calls "open()" in the controller
        "---"
        "Exit" do="exit"
    }
}

SDL/Swing 是开源的,但享有商业支持。我们 (Ikayzo.com) 开发了它多年,并已将其部署到从生命科学公司到银行的许多客户的生产系统中。

于 2010-06-08T13:25:23.740 回答
1

我可以找到您所要求的以下示例:

于 2009-04-17T16:55:47.197 回答
1

尽管它不是声明性的并且仅限于布局,但您可能想看看DesignGridLayout,它允许以非常简洁的方式以编程方式定义 Swing 布局(它是开源的)。

主要优点:

  • 轻松快速地学习。
  • 简洁的代码(表格中每行组件一行代码)也便于维护
  • 编译时检查(声明式 UI 没有)
  • 尊重平台外观和感觉(基线对齐,组件之间的间隙......),没有任何硬编码的长度值
于 2009-04-20T03:18:27.883 回答
1

一些新的东西...... XWT,将包含在 eclipse e4 中

于 2009-05-26T20:57:56.253 回答
1

我最近遇到了SDL / Swing

于 2010-04-26T23:27:12.370 回答
1

我尝试了很多解决方案,例如 SWIXML、Javabuilders、MigLayout、Cookswing。我终于发现 javaFX 和 javaFX-Scenebuilder 是最好的最快的解决方案,基于 XML 的 GUI 工具。您喜欢 scenebuilder 创建 GUI 的方式(使用拖放项目!)。此外,它使用 CSS(层叠样式表)作为 GUI 主题。请相信 Oracle,它是 Java 应用程序的最佳 GUI 工具。参观使用场景构建器创建 javaFX 应用程序,这里: http ://docs.oracle.com/javafx/scenebuilder/1/get_started/prepare-for-tutorial.htm#CEGJBHHA

于 2013-07-03T17:00:14.843 回答
0

通常,在您寻找某些东西时执行搜索总是一个好主意。是谷歌在寻找“java xml gui”时的第一个链接

于 2009-04-17T16:57:30.420 回答
0

WindowBuilder , 一个非常不错的插件, 包含 GWT,XWT,SWT,Swing 等

于 2012-01-11T02:02:37.840 回答