【问题标题】:Java GUI based on Fields in classJava GUI 基于类中的字段
【发布时间】:2014-11-10 15:00:41
【问题描述】:

我需要在运行时基于类字段在 Java 中生成 GUI。

我正在开发 Web 服务,因此我需要在客户端动态生成 GUI。例如,如果我的 Web 服务上有一个包含字段 String nameint numberArrayList<> list 的类,我需要生成一个包含 2 个 JTextFields 和一个 JList 的 GUI。

是否有任何 API 或其他东西可以帮助我做到这一点?

【问题讨论】:

  • 你看过java反射吗?注释也是一种有趣的方式
  • 我没有看到我可以用反射 API 做到这一点。我试图为此编写我的 self 类,但我不能真正为所有 java 类型编写代码
  • 先分解问题。首先创建动态 GUI,然后从需要使用的类中构建 GUI
  • 好吧,动态 GUI 创建是我可以从类中获取我需要的字段但我不知道如何将这些字段映射到适当的 Swing 组件的问题,我无法在网上找到任何可以帮助我的东西跨度>

标签: java user-interface


【解决方案1】:

您正在寻找类似“裸对象”的方法。

虽然这种方法非常适合获得某种初始 GUI,但生成 GUI 的方式往往会使即使是最微不足道的 GUI 更改也需要更改驱动 GUI 生成的对象。

这往往与许多旨在最大限度地减少在需要新的 GUI 功能时重写核心逻辑的方法背道而驰。

既然你已经被警告了,如果你还想踩这个地雷,我会用伪代码给你指路

 public Component generateComponent(Object object) {
   Class c = object.getClass();
   Method[] m = c.getDeclaredMethods();
   for (int i = 0; i < m.length; i++) {
      if (m.getName().startsWith("get")) {
        Class returnClass = m.getReturnClass();
        if (returnClass.equals(String.class)) {
           add(new TextBox(...);
        }
      }
   }
 }

您必须很快决定要包含/排除哪些方法,以及您用来做出该决定的机制。然后您必须决定如何呈现信息,并且您必须对新的 JComponents 列表进行更改以回调相关的“set...”方法。

简而言之,这听起来是个好主意,除非你去做。然后它就变成了你得到你想要的东西而不是你想要的东西的问题之一。

【讨论】:

  • 如果您确实采用这种方法,我强烈建议您使用“裸对象”工具包,而不是自己动手。本指南的唯一例外是,如果您对这些东西的工作原理感到好奇,并且滚动自己的体验是您真正想要的(而不是工作软件)。
  • 我已经尝试过这种方式,但问题是我必须使用 if 语句来检查每个可能的类,所以如果 returnClass.equals(String.class) 然后添加 TextBox,如果 returnClass .equals(Boolean.class) 然后添加 checkBox 等等我需要某种 API 或一些库来帮助我将这些类型映射到相应的 Swing 组件中我希望你能理解我。对不起,我从来没有听说过裸体物体,我会用谷歌搜索
  • 它变得困难的原因是,为你需要的东西编写软件比编写软件比在运行时处理任何不可预见的需求要容易得多。即使是裸对象方法最终也必须做出一些权衡,比如使用有限数量的类型到字符串和字符串到类型的适配器。
  • 我正在 wiki 上阅读它,它似乎可以帮助我解决问题
  • 好像是这样;然而,我要警告你,这与通过月球前往纽约一样好。尽管它已经使用了近十年,但它并没有席卷整个行业,这是有原因的。我几乎认为这是一种反模式。
【解决方案2】:

我认为ReflectionUI 是您正在寻找的。它基于反射生成 GUI。此外,您还可以自定义生成的 GUI。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-03
    • 2011-05-29
    • 2020-05-11
    • 1970-01-01
    • 2015-06-03
    • 2014-10-20
    相关资源
    最近更新 更多