Java 自定义swing组件-将节点转换为文本
我正在编写一个定制的swing组件(一些全新的东西,但想想JTree或JList)。我试图遵循JTree、JTable、JList等的一般设计以实现一致性(我还看到各种糟糕的第三方组件放弃了可分离模型和/或渲染器方法) 因此,我有一个充满节点、组件本身和渲染器的模型。在某些情况下,节点必须转换为文本并由渲染器显示。我不清楚最好的方法:Java 自定义swing组件-将节点转换为文本,java,swing,Java,Swing,我正在编写一个定制的swing组件(一些全新的东西,但想想JTree或JList)。我试图遵循JTree、JTable、JList等的一般设计以实现一致性(我还看到各种糟糕的第三方组件放弃了可分离模型和/或渲染器方法) 因此,我有一个充满节点、组件本身和渲染器的模型。在某些情况下,节点必须转换为文本并由渲染器显示。我不清楚最好的方法: 将节点本身(作为对象)传递给渲染器,并让渲染器决定如何显示它。 JList就是这样做的 只需自定义渲染器即可更改文本 允许在如何显示节点方面具有极大的灵活性(
- 将节点本身(作为对象)传递给渲染器,并让渲染器决定如何显示它。
- JList就是这样做的
- 只需自定义渲染器即可更改文本
- 允许在如何显示节点方面具有极大的灵活性(甚至不必是文本)
- 将节点本身(作为对象)传递给渲染器,但在组件类中有一个convertValueToText()方法。
- JTree就是这样做的
- 渲染器可以像以前一样灵活-不必使用这种方法
- 必须重写组件才能更改文本转换
- 如上所述,但将convertValueTotext()委托给模型。
- JXTable就是这样做的
- 该模型可能是该方法的最佳位置,并且更容易在那里重写
- 向模型添加一个方法,该方法返回给定节点的字符串。重要的是,该值可以为null,表示渲染器应该知道该做什么,或者我们根本无法提供任何有用的内容
- 组件具有相同的方法,并将调用传递给模型。这对于视图模型分离很重要。渲染器调用此方法,因此它不会直接与模型对话
- 默认呈现程序调用上述方法,如果该方法不为null,则使用该方法,否则可以调用该值上的toString,或者提供默认值,或者其他任何方法
谢谢你的观点 好问题。这不是Swing所特有的,而是一个关于模型和视图之间差异的哲学问题 通常,将对象转换为文本是模型的工作还是视图的工作?我的纯粹主义者head说,实际上您需要一个视图层次结构——一个用于将对象模型转换为文本,另一个用于显示文本。您甚至可能需要两种以上的格式—例如,对象到文本、文本到文档结构、文档结构到HTML,然后CSS呈现给用户 然而,实用主义者说,这可能太难记住和保持。因此,在您的情况下,我建议:考虑一下您希望从模型中提取非文本数据的可能性有多大。如果不太可能,则在模型中放入等效的convertValueToText 否则,允许组件使用渲染器(如果给定),或者获取对象值并在内部将其转换为文本
这允许最大的灵活性,并可能使API的用户感到最自然。我相信这就是JTable模型,尽管我很久没有使用Swing了。AFAIK JList和JTree都不需要渲染器来渲染文本。渲染器传递数据对象并返回一个JComponent,该JComponent在树/列表本身中定位为子元素,然后进行渲染。
我同意这个。文本的渲染器只返回一个JLabel。如果您希望能够更改方式,则构建文本并将格式化程序传递给TextRender,就完成了
- 斯蒂芬