Java 是否可以动态生成外观良好的属性对话框?
我有一个应用程序,它显示各种GUI可访问对象的属性对话框。因为有大量不同种类的对象,所以也有大量不同的属性对话框。因为我们懒惰,我们不想手工构建每个属性对话框;此外,插件可能会引入新类型的对象,这些对象也需要属性对话框,如果插件设计者也不需要手工编写属性对话框,那就太好了(这样既可以节省它们的工作量,又可以确保结果的一致性)。相反,我们构建了一个框架,将这些对象的属性映射到GUI组件(例如,复选框、文本字段、组合框),然后将它们全部打包到一个对话框中。这样做的好处是,我们不需要为构建对话框做任何工作,但是对话框看起来也像是我们在布局它们时没有做任何工作:它们看起来像一堆堆Jenga块。这些对话看起来很尴尬Java 是否可以动态生成外观良好的属性对话框?,java,user-interface,swing,properties,dialog,Java,User Interface,Swing,Properties,Dialog,我有一个应用程序,它显示各种GUI可访问对象的属性对话框。因为有大量不同种类的对象,所以也有大量不同的属性对话框。因为我们懒惰,我们不想手工构建每个属性对话框;此外,插件可能会引入新类型的对象,这些对象也需要属性对话框,如果插件设计者也不需要手工编写属性对话框,那就太好了(这样既可以节省它们的工作量,又可以确保结果的一致性)。相反,我们构建了一个框架,将这些对象的属性映射到GUI组件(例如,复选框、文本字段、组合框),然后将它们全部打包到一个对话框中。这样做的好处是,我们不需要为构建对话框做任何
所以,我的问题是:有没有办法自动布局属性对话框,使它们看起来不那么丑陋?(我意识到这个问题的答案可能是“不”,但也可能是我们在思考更好的方法方面没有足够的创造性。)NB:我们正在使用Java Swing,但实际上问题本身与语言无关。一个建议是:如果您的属性以点分隔的分层格式命名,您可以动态构建一个
JTree
来表示不同的属性组。当用户单击树中的给定节点时,您可以在一个单独的JPanel
上的JTable
中显示该类别中的属性(例如,作为名称-值对)。您还可以通过添加用户可以搜索属性的JTextField
来丰富GUI
这样,至少你不会在同一个屏幕上显示大量信息。。。尽管缺点是您的GUI最终看起来像Regedit:-)
编辑属性时,可以使用反射来确定属性的类型,从而确定适用的单元编辑器;e、 g
- 对于枚举,您可以提供一个基于
的编辑器JComboBox
- 对于数值,您可以显示
或JSpinner
JFormattedTextField
- 对于布尔值,可以提供基于
的编辑器JCheckBox
然而,好的GUI布局是很难的,即使是人类程序员也常常做得很差。这就是为什么没有人开发出一种通用的自动布局工具,它不需要指定许多关于如何显示自动生成的控件的附加信息,对此我并不感到惊讶。我建议使用注释来驱动GUI框架。这样,后端对象可以声明,例如,哪些属性最重要,应该显示在UI的顶部(或“简单”UI中,或选项卡式对话框的第一个选项卡上,等等)。您还可以使用它覆盖框架中默认提供的自动检测小部件,或者声明验证器,等等
有了这类信息,您的框架可以应用各种启发式方法来动态设计更友好的对话框。您的插件作者基本上可以设计自己的对话框,至少可以大致设计,而无需编写任何UI代码。我们已经提供了适合该数据类型的编辑器。真正的问题是以一种合理的方式来布置它们。我仍然建议使用基于树的方法:这意味着GUI是动态的,不会将所有数据杂乱无章地放在一个面板上。此外,当你说“以合理的方式布局”一个包含名称、值对列的JTable时,会给你一个紧凑的表示。我不是downvoter,但我会推测downvoter我们正在寻找一个自动布局系统,这是优于他们目前的系统堆叠在一个盒子里的一切。将所有内容堆叠在一棵树中可以折叠部分框,但这并不能解决这里的硬布局问题,因为没有任何内容排列在一起,类似的控件也没有组合在一起。属性视图不是我想要的,因为它们对用户来说太“技术化”。(不过,对于我们的编辑器应用程序来说,这可能是一个不错的选择。谢谢。)