【问题标题】:suggestions for declarative GUI programming in JavaJava 中声明式 GUI 编程的建议
【发布时间】:2010-10-20 03:51:57
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

  • LOL - 关于 JavaFX 没有一个答案
  • 是的,我注意到了。并不完全给我温暖和模糊的感觉。虽然我确实尝试了他们的一些示例代码,但它非常简洁。
  • 我自己确实对缺少 JavaFX 注释感到疑惑。无论如何,对于以下所有内容和 JavaFX(我们敢于包括 XAML、XUL 和 wxWidgets...)——所有这些东西都需要像 Ant 这样的工具,它可以让您在(小部件)类中扩展工具。一些元小部件信息和“工具支持”
  • 第二件事,很惊讶我是怎么忘记的。布局应该与“设计”和内容分开。

标签: java swing user-interface layout declarative


【解决方案1】:

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

主要优点:

  • 简单易学。
  • 简洁代码(每行1行代码 形式的组件),也 易于维护
  • 编译时检查(其中 声明式 UI 不能有)
  • 尊重平台外观 (基线对齐,之间的差距 组件...) 没有任何硬编码 长度值

【讨论】:

  • @Mahmoud-Aziz 你可能不相信你不能在一小时内使用它,但你真的尝试过吗?我不敢相信你确实在一小时内尝试使用它 :-) 就我个人而言,我确实确认任何 Swing 开发人员都可以在一小时后开始使用它(阅读文档,使用代码完成,执行一些初步检查,然后你就完成了) .请注意,我没有提到你可以在一小时后做任何你想做的事情,更复杂的表格可能需要几个小时......
【解决方案2】:

我尝试了很多解决方案,例如 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

【讨论】:

    【解决方案3】:

    WindowBuilder,非常不错的插件,包括GWT,XWT,SWT,Swing等

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

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

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

        【讨论】:

          【解决方案6】:

          我最近遇到SDL / Swing

          【讨论】:

            【解决方案7】:

            作为 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
            • 它是否仅在 SourceForge 上托管?没有 Maven 存储库?
            【解决方案8】:

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

            【讨论】:

            • 谢谢——mmyers 对 Javabuilders 的推荐也让我找到了 MiG Layout。
            • 因为 MigLayout,我刚刚放弃使用 GUI 构建器 (VisualBuilder) :)
            • 看起来很整洁,甚至有人写了一个clojure模块来包装它。谢谢指点。
            • 一位同事对 MIG Layout 赞不绝口。
            • 自从我发现它以来,我所有的 GUI 代码都是使用 MiG Layout 完成的。它非常强大,代码仍然非常可读和可维护。唯一的缺点是需要一点时间来适应(米格布局备忘单在这个过程中很有帮助^^)。
            【解决方案9】:

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

            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 代码不一定写得不好,只是几乎所有代码都写得不好(包括在教科书中)。

            【讨论】:

            • 嗯 - 这实际上很漂亮。不错。
            • 圆滑和讨厌之间只有一线之隔。 :)
            • Eclipse 将其重新格式化为需要很多行的东西:(
            • @Tom,我们将 Format Source 作为 Eclipse 中的默认保存操作,因此源代码始终被规范化。这是为了给需要回顾存储库历史的维护者提供最好的条件。
            • 看起来不错,但是您是否知道在使用它的任何地方定义一个新类可能对性能产生影响?
            【解决方案10】:

            你可以看看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)
            

            【讨论】:

            • 我可能会选择 javabuilders,它似乎在我的一些隐含标准下得分很高:体面的文档/教程、功能齐全(带绑定、布局管理器挂钩等)。
            【解决方案11】:

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

            【讨论】:

            • 好点。不过,您必须知道要搜索什么。我用谷歌搜索了“java declarative gui”,不知道为什么我没有考虑使用“xml”作为搜索词。
            • @Jason S:+1,我认为指出似乎对您不起作用的谷歌搜索是在提问时添加什么信息的好主意。
            【解决方案12】:

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

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

            【讨论】:

              【解决方案13】:

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

              【讨论】:

                【解决方案14】:

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

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2018-01-05
                  • 2023-03-30
                  • 1970-01-01
                  相关资源
                  最近更新 更多