首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >关于Java中声明式GUI编程的建议

关于Java中声明式GUI编程的建议
EN

Stack Overflow用户
提问于 2009-04-17 16:52:05
回答 14查看 9.1K关注 0票数 55

我想知道Java中是否有任何关于声明式GUI编程的建议。(我讨厌基于视觉的图形用户界面创建器/编辑器软件,但我对手动实例化JPanels、but、JLabels和JLists等感到有点厌倦。)

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

XUL

  • JavaFX :在JavaFX中有没有一个逼真的图形用户界面显示的例子(例如,不是圆形和矩形,而是列表框、按钮和标签之类的),它可以与访问和更新各种XUL旧Swing的Java源文件接口:有没有人发明了一种声明性语法(比如XUL)用于JavaFX Swing?我认为创建一些基于STaX的代码并不难,该代码读取XML文件,实例化Swing元素的层次结构,并通过某种对象模型访问该层次结构。但是,我宁愿使用一些广为人知的、有文档记录和测试的东西,也不愿尝试发明这样一种myself.

  • JGoodies Forms --不完全是声明性的,但有几分接近--我在JGoodies绑定方面运气很好。但是他们的表单布局语法看起来有点神秘。

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

附注:我确实尝试了几次google搜索("java gui声明式“),只是不太知道该找什么。

EN

回答 14

Stack Overflow用户

回答已采纳

发布于 2009-04-17 16:56:29

您可能会了解一下javabuilders;它使用YAML来构建Swing UI。

manual PDF中的一个简单示例

代码语言:javascript
复制
JFrame:
    name: myFrame
    title: My Frame
    content:
        - JLabel:
            name: myLabel2
            text: My First Label
        - JLabel:
            name: myLabel2
            text: My Second Label

或者:

代码语言:javascript
复制
JFrame:
    name: myFrame
    title: My Frame
    content:
        - JLabel: {name: myLabel2, text: My First Label}
        - JLabel: {name: myLabel2, text: My Second Label}

或者甚至是:

代码语言:javascript
复制
JFrame(name=myFrame,title=My Frame):
    - JLabel(name=myLabel2, text=My First Label)
    - JLabel(name=myLabel2, text=My Second Label)
票数 23
EN

Stack Overflow用户

发布于 2009-05-28 12:41:16

作为CookSwing的作者,我在进行实际实现之前对这个主题进行了长时间的仔细研究。我靠编写Java Swing GUI应用程序为生。

如果您打算使用任何类型的命令式编程语言来描述Java Swing组件,那么您不妨直接使用Java。Groovy等只是增加了复杂性,并没有太多的简化。

声明式语言要好得多,因为即使是非程序员也能理解它,特别是当您需要将微调特定布局的任务委托给艺术家时。XML是声明性语言(优于其他选择)的完美选择,因为它的简单性、可读性和大量可用的编辑器/转换工具等。

这里是声明式GUI编程中面临的问题,没有任何特殊的顺序。这些问题已经在CookSwing中得到了解决。

  1. 的可读性和简单性。(JavaFX并不比XML更简单。关闭XML的标记有助于阅读,并且不会增加额外的类型,因为XML编辑器通常为you)
  2. Extensibility.做这件事。非常重要,因为定制的Swing组件将出现在任何重要的项目中。
  3. 图形用户界面布局。这也是非常重要的。能够处理BorderLayout、GridBagLayout、JGoodies FormsLayout等实际上就是一种复制/粘贴的能力。在设计版面的过程中,有必要尝试不同的版面。因此,人们需要能够复制/粘贴和移动东西。XML更好,因为组件和布局的层次结构很容易看到。由于多行属性和缩进问题,JavaFX有些问题。有一个好的编辑器是必须的,并且有很多好的XML editors.
  4. Templates (例如,能够包含另一个布局文件)对于保持一致的外观非常有用。例如,你可能希望对话框、按钮面板、etc.
  5. Interactions的外观与Java代码保持一致。这一点至关重要。有些GUI组件只能用Java代码创建(不管是什么原因)。因此,必须能够加载这些对象。它还必须能够直接连接XML代码中的侦听器和其他Java对象/组件。稍后使用it来连接它们将不会很好地工作,因为它非常tedious.
  6. Internationalization (i18n)。能够从资源包中加载文本/字符串,而不是硬编码文本。此功能对于某些applications.
  7. Localization (l10n)非常重要。声明性编程(尤其是使用XML)的优点是,您可以针对特定的语言环境切换到不同的GUI表单,仅此而已。如果你用Java或任何其他命令式语言编写代码,就不是那么容易了。
  8. 错误检查/容错。最初的设计经常会在这里或那里包含错误。有时,错误可能是因为尚未设计出相应的Java代码。或者缺少图标资源。用命令式编码来处理错误是非常乏味的。因此,希望能够在容错的同时能够定位错误,从而可以在possible.
  9. GUI组件替换时尽早地预览图形用户界面布局。也就是说,将过去具有JTextField文本字段替换为一些更高级的组件版本。用一些花哨的UI对话框(比如JIDE的)代替JDialog来代替对话框的含义。此功能可以节省大量的工作。由于XSLT和其他转换tools.
  10. Beyond Swing,XML本身也很有用。因为迟早您会发现许多组件配置使用对象类型,如数组、图标、图像、矢量等。
票数 20
EN

Stack Overflow用户

发布于 2009-04-17 19:38:06

如果简洁性很重要,你可以考虑双括号的习惯用法:

代码语言:javascript
复制
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代码并不一定要写得很差,只是几乎所有的代码都写得很差(包括在教科书中)。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/761237

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档