Java中声明性GUI编程的建议

时间:2009-04-17 16:52:05

标签: java swing user-interface layout declarative

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

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

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

  2. Plain Old Swing用什么来解析XUL-ish XML:有没有人发明过一种用于Java的声明性语法(如XUL)用于Java Swing?我想,要创建一些基于STaX的代码来创建一些代码,实例化Swing元素的层次结构,并通过某种对象模型访问层次结构,我认为这并不难。但我宁愿使用一些众所周知,记录和测试的东西,而不是试图自己发明这样的东西。

  3. JGoodies Forms - 不完全是陈述性的,但有点接近&我和JGoodies Binding有好运。但他们的表单布局语法似乎有点神秘。

  4. 编辑:这里有很多很棒的答案! (并且我在上面添加了#3)我特别感谢您在使用其中一个框架进行实际应用时获得的任何经验。

    P.S。我确实尝试了一些谷歌搜索(“java gui declarative”),只是不太清楚要找什么。

14 个答案:

答案 0 :(得分:23)

您可以查看javabuilders;它使用YAML来构建Swing UI。

manual [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)

答案 1 :(得分: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. 超越秋千。因为迟早会发现许多组件配置使用对象类型,如数组,图标,图像,向量等。

答案 2 :(得分: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代码不一定要编写得很糟糕,只是几乎所有的代码都是(包括在教科书中)。

答案 3 :(得分:11)

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

答案 4 :(得分:7)

如果您愿意稍微偏离普通Java,Groovy的“构建器”概念可以很好地与GUI配合使用。当然,您可以非常轻松地在Groovy和Java之间进行交互。有关详细信息,请参阅Swing Builder页面。

答案 5 :(得分:2)

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

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

答案 6 :(得分:2)

SDL/Swing完全符合您的需要。它是一个很小的(283k),不引人注目,易于学习的声明性Swing框架。

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

SDL / Swing是开源的,但享有商业支持。我们(Ikayzo.com)经过多年的发展,并将其部署在生产系统中,为生命科学公司和银行等众多客户提供服务。

答案 7 :(得分:1)

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

答案 8 :(得分:1)

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

主要优势:

  • 简单易学。
  • 简洁代码(每行1行代码 也是一种形式的组件) 轻松维护
  • 编译时检查(哪个 声明性用户界面不能有)
  • 尊重平台外观&感觉 (基线对齐,间隙 组件......)没有任何硬编码 长度值

答案 9 :(得分:1)

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

答案 10 :(得分:1)

我最近遇到SDL / Swing

答案 11 :(得分:1)

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

答案 12 :(得分:0)

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

答案 13 :(得分:0)

WindowBuilder,这是一个非常好的插件,包括GWT,XWT,SWT,Swing等