在Java中声明性GUI编程的build议

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

这是我的总体问题,但是我想要采取的方法有两个具体问题:

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

  2. 简单的旧的Swing的东西来parsingXUL-ISH XML:有没有人发明了XML的声明性语法(如XUL)用于Java Swing? 我想这不难,创build一些基于STaX的代码来读取XML文件,实例化Swing元素的层次结构,并通过某种对象模型来访问层次结构。 但是我宁愿使用一些众所周知的logging和testing的东西,而不是试图自己去创造这样的东西。

  3. JGoodiesforms – 不完全是声明式的,但有点紧密,我已经与JGoodies绑定的好运。 但是他们的表单布局的语法看起来有点神秘。

编辑:这里有很多伟大的答案! (&我在上面添加了#3)特别感谢你听到你们任何一个使用这些框架用于实际应用的经验。

ps我尝试了一些谷歌search(“爪哇gui声明”),只是不知道该找什么。

你可能会看看javabuilders ; 它使用YAML来构buildSwing 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对于声明性语言(超过其他select)是完美的。

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

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

如果简洁是重要的,你可能要考虑双重大括号的习惯用法:

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

然后,你不会失去一个众所周知的通用编程语言(你知道你会需要它,而JellyTags吸)的任何力量。 所有你需要的是一个额外的成语。

它并没有太多用处,因为实际上人们对XML的嘲笑并没有解决真正的痛点。

一般来说,您可以使用构build器图层来提取重复的代码。 GUI代码不一定要写的很差,只是几乎所有的东西都是(包括在课本里)。

我强烈build议米格布局 – 它需要几天习惯的语法,但一旦你得到它,它的奇迹。 我使用JGoodies表单已经有一段时间了,Karsten的构build器概念运行良好,但是它有点神秘… MiG更容易拾取,并且产生了非常简洁的代码。

如果你愿意在普通的Java之外轻轻一点,那么Groovy的“构build器”概念就可以很好地适用于GUI。 当然,你可以很容易地在Groovy和Java之间进行交互。 请参阅Swing Builder页面以获取更多信息。

给Swiby一个尝试: http ://swiby.codehaus.org/

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

SDL / Swing完全符合您的需求。 它是一个小巧的(283k),不显眼,易于学习的声明式Swing框架。

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

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

我可以find你要求的以下例子:

  • SWIXML
  • SwiXAT Swing-XML创作工具 (基于SWIXML)
  • CookSwing:XML到Swing GUI
  • JFCML – JFC / Swing XML标记语言
  • 可能JEasy ,我不确定

我最近遇到了SDL / Swing 。

新的东西… XWT ,将包括在eclipse e4中

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

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

主要优点:

  • 容易和快速学习。
  • 简洁的代码(表单中每行组件的每行代码1行),这也使维护更加简单
  • 编译时检查(哪个声明式UI不可以)
  • 对平台外观和感觉(基线alignment,组件之间的间隙…)的尊重,没有任何硬编码的长度值

像往常一样,当你在寻找某些东西的时候,进行search总是一个好主意。 这是谷歌的第一个链接,而寻找“java xml gui”

WindowBuilder ,它是一个很好的插件,包括GWT,XWT,SWT,Swing等