Java 是否可以动态生成外观良好的属性对话框?

Java 是否可以动态生成外观良好的属性对话框?,java,user-interface,swing,properties,dialog,Java,User Interface,Swing,Properties,Dialog,我有一个应用程序,它显示各种GUI可访问对象的属性对话框。因为有大量不同种类的对象,所以也有大量不同的属性对话框。因为我们懒惰,我们不想手工构建每个属性对话框;此外,插件可能会引入新类型的对象,这些对象也需要属性对话框,如果插件设计者也不需要手工编写属性对话框,那就太好了(这样既可以节省它们的工作量,又可以确保结果的一致性)。相反,我们构建了一个框架,将这些对象的属性映射到GUI组件(例如,复选框、文本字段、组合框),然后将它们全部打包到一个对话框中。这样做的好处是,我们不需要为构建对话框做任何

我有一个应用程序,它显示各种GUI可访问对象的属性对话框。因为有大量不同种类的对象,所以也有大量不同的属性对话框。因为我们懒惰,我们不想手工构建每个属性对话框;此外,插件可能会引入新类型的对象,这些对象也需要属性对话框,如果插件设计者也不需要手工编写属性对话框,那就太好了(这样既可以节省它们的工作量,又可以确保结果的一致性)。相反,我们构建了一个框架,将这些对象的属性映射到GUI组件(例如,复选框、文本字段、组合框),然后将它们全部打包到一个对话框中。这样做的好处是,我们不需要为构建对话框做任何工作,但是对话框看起来也像是我们在布局它们时没有做任何工作:它们看起来像一堆堆Jenga块。这些对话看起来很尴尬


所以,我的问题是:有没有办法自动布局属性对话框,使它们看起来不那么丑陋?(我意识到这个问题的答案可能是“不”,但也可能是我们在思考更好的方法方面没有足够的创造性。)NB:我们正在使用Java Swing,但实际上问题本身与语言无关。

一个建议是:如果您的属性以点分隔的分层格式命名,您可以动态构建一个
JTree
来表示不同的属性组。当用户单击树中的给定节点时,您可以在一个单独的
JPanel
上的
JTable
中显示该类别中的属性(例如,作为名称-值对)。您还可以通过添加用户可以搜索属性的
JTextField
来丰富GUI

这样,至少你不会在同一个屏幕上显示大量信息。。。尽管缺点是您的GUI最终看起来像Regedit:-)

编辑属性时,可以使用反射来确定属性的类型,从而确定适用的单元编辑器;e、 g

  • 对于枚举,您可以提供一个基于
    JComboBox
    的编辑器
  • 对于数值,您可以显示
    JSpinner
    JFormattedTextField
  • 对于布尔值,可以提供基于
    JCheckBox
    的编辑器

我认为您可以使用XML来提及您的小部件,好的方面是它还允许使用XML指定布局。这些正是我推荐使用XUI的地方,尽管他们声称它可以用于构建整个应用程序,我否认。另外,由于它是Swing的常见xui标准,它还使您的项目更加标准化。

有大量GUI框架具有“属性视图”的“解决方案”,您可能希望在重新发明轮子之前先看看它们。如果你已经见过他们,并且认为他们很差劲,我向你道歉:)

这里有一个关于JIDE one的例子,其中也显示了NetBeans和JBuilder的例子。

我会投反对票,至少是因为对“自动”和“不要看起来那么丑陋”的定义有足够的辨别力

这肯定是一个常见的问题:仅在去年,我想至少有三位同事提出过类似的要求。不幸的是,我不知道有任何自动布局解决方案不需要重要的指导(例如在XUI中指定布局)才能工作

显然,您可以做一些简单的事情来使自动生成的组件更易于组合,例如标准化标签和内容的宽度和高度。您还可以应用一些可能有用的启发式方法,例如按控件类型对属性进行排序,以便所有组合框都在一起,所有文本字段都在一起,等等


然而,好的GUI布局是很难的,即使是人类程序员也常常做得很差。这就是为什么没有人开发出一种通用的自动布局工具,它不需要指定许多关于如何显示自动生成的控件的附加信息,对此我并不感到惊讶。

我建议使用注释来驱动GUI框架。这样,后端对象可以声明,例如,哪些属性最重要,应该显示在UI的顶部(或“简单”UI中,或选项卡式对话框的第一个选项卡上,等等)。您还可以使用它覆盖框架中默认提供的自动检测小部件,或者声明验证器,等等


有了这类信息,您的框架可以应用各种启发式方法来动态设计更友好的对话框。您的插件作者基本上可以设计自己的对话框,至少可以大致设计,而无需编写任何UI代码。

我们已经提供了适合该数据类型的编辑器。真正的问题是以一种合理的方式来布置它们。我仍然建议使用基于树的方法:这意味着GUI是动态的,不会将所有数据杂乱无章地放在一个面板上。此外,当你说“以合理的方式布局”一个包含名称、值对列的JTable时,会给你一个紧凑的表示。我不是downvoter,但我会推测downvoter我们正在寻找一个自动布局系统,这是优于他们目前的系统堆叠在一个盒子里的一切。将所有内容堆叠在一棵树中可以折叠部分框,但这并不能解决这里的硬布局问题,因为没有任何内容排列在一起,类似的控件也没有组合在一起。属性视图不是我想要的,因为它们对用户来说太“技术化”。(不过,对于我们的编辑器应用程序来说,这可能是一个不错的选择。谢谢。)