Java中声明性GUI编程的建议

Jas*_*n S 55 java layout user-interface swing declarative

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

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

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

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

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

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

ps我尝试了一些谷歌搜索("java gui declarative"),只是不太清楚要找什么.

Mic*_*ers 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
Run Code Online (Sandbox Code Playgroud)

或者:

JFrame:
    name: myFrame
    title: My Frame
    content:
        - JLabel: {name: myLabel2, text: My First Label}
        - JLabel: {name: myLabel2, text: My Second Label}
Run Code Online (Sandbox Code Playgroud)

甚至:

JFrame(name=myFrame,title=My Frame):
    - JLabel(name=myLabel2, text=My First Label)
    - JLabel(name=myLabel2, text=My Second Label)
Run Code Online (Sandbox Code Playgroud)


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

  • "我有一个工具,可以做到这一点,这里是我不得不思考的东西"是有用得多比"我有一个工具,可以做到这一点,你应该,因为这是伟大的使用它." +1 (7认同)

Tom*_*ine 13

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

new JFrame("My Frame") {{
    setName("myFrame");
    add(new JLabel("My First Label") {{
         setName("myLabel2");
    }};
    add(new JLabel("My Second Label") {{
         setName("myLabel2");
    }};
}}
Run Code Online (Sandbox Code Playgroud)

然后,你不会失去任何众所周知的通用编程语言的强大功能(你知道你将需要它,而JellyTags很糟糕).你需要的只是一个额外的成语.

它并没有被大量使用,因为实际上人们在使用XML来解决问题并没有解决真正的痛点.

通常,您可以使用构建器层来抽象重复的代码.GUI代码不一定非常糟糕,几乎所有内容都是(包括在教科书中).

  • 光滑和讨厌之间有一条细线.:) (7认同)
  • 嗯 - 这实际上非常漂亮.尼斯. (3认同)
  • @Tom,我们将Format Source作为Eclipse中的默认保存操作,因此源代码始终是标准化的.这是为了向需要回顾存储库历史记录的维护者提供最佳条件. (2认同)

Kev*_*Day 11

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

  • 看起来非常整洁,有人甚至写了一个clojure模块来包装它.谢谢指针. (2认同)

Jon*_*eet 7

如果您愿意稍微偏离普通Java,那么Groovy的"构建器"概念在GUI中运行良好.当然,您可以非常轻松地在Groovy和Java之间进行交互.有关更多信息,请参阅Swing Builder页面.