我有一个如下所示的GUI设置:
它会显示一个文档,并允许用户通过添加/删除JTextAreas
和文本来编辑它。
尝试打开文档时遇到问题。文档本身由JPanels
层组成。 GUI中的单个点上永远不会超过6层JPanels
。
由于我不知道JTextArea
的高度是多少,我必须使它相对于父级(换句话说,不指定它)。
因为布局管理器(MigLayout
)不知道组件的确切大小(它相对于父组件),所以它首先要求其父组件查询父组件的大小。该大小再次未知,父母的父母被要求等等(直到1级或2级JPanel)。最后,它必须询问很多组件的大小(MigLayout中的方法checkParent(Container)
被调用超过10万次,仅用于上面的示例。)
我需要做的是仅在打开文档时设置JTextArea
(或它所在的JPanel
的高度,因此布局管理器不必询问JTextAreas
父母,造成递归地狱。
打开文档后,我必须将高度重置为默认值(因此在添加/删除文本时调整高度)。
我绝对不知道如何做到这一点,或者如果这是要走的路,我只能确定我上面描述的是问题所在。
几点说明:
MigLayout
错误,我去过论坛(链接如下)JScrollPane
放入JTextArea
,因为它的任务不仅仅是保存信息,而是准确显示需要多少空间JTextAreas
的高度,因此在再次打开文档时可以使用它们修改: 在这个问题中引用的文件不是JTextAreas中使用的“文档”和类似的东西,而是我的程序中的自定义类中的“文档”(我没有提及,因为它是无关紧要的,除非它被理解为“文件“)。
答案 0 :(得分:1)
因为您的Document
建模了层次结构,所以需要一棵树。由于您的界面需要每个节点的控件和视图,因此您需要一个表。看见here的Outline
可能是合适的选择。您的DocumentTreeModel
将保留对文档根Element
的引用,就像示例的FileTreeModel
包含对根File
的引用一样。您的RowModel
将包含JLabel
,JCheckBox
和JTextArea
。