动态JList实现

时间:2011-12-21 14:43:42

标签: java swing jlist

我有一个实体列表,其中每个实体都基于JPanel呈现为窗口小部件。窗口小部件具有动态行为 - 一旦放置在面板上,它就可以被底层实体更改。这是自动发生的。此外,一些小部件可以通过不同的操作调整大小,例如按钮点击。

问题是如何将它们组织成类似JList但没有橡皮图章技术的东西。换句话说,我想JList用cellrenderer呈现的每个项目保持“活着”。

现在我已经基于JPanel使用垂直BoxLayout实现了快速而肮脏的组件,它使用了JList's渲染器组件和它的模型......但是我的实现太脏了......

嗯..是的,使用JTable也不合适。

你有什么想法吗?

3 个答案:

答案 0 :(得分:0)

如果您不想进行橡皮图章处理,那么您必须创建自己的使用实际组件的JList实现。

您可以尝试通过为渲染器中的每一行缓存每个组件来解决橡皮图章效果,并将值绑定到其中,并在JList向渲染器询问它时返回该实例。这是非常危险的,因为如果您要显示20行,则必须在渲染器中缓存20个实例,并且只有在该行不可见时才能重用一个。这意味着如果你有5个独特的配置(A,B,C,D,E)组件,你可能有10个A型,5个B型,2个C型,3个D型,0个类型E正在显示。但是,您不能简单地重用其中一个组件而不知道它是否被显示。因此,您必须考虑是否正在显示该行,以及它是否是您正在渲染的行的正确类型。隐藏行后你必须清理。

另一种选择是为包含所有X变体的行创建一个组件,并将其放在CardLayout上。然后,您可以简单地每行显示一个缓存,并在渲染该行时简单地交换显示的卡。我认为这对你来说可能是最简单的选择。

更难的部分是路由事件点击鼠标点击,键盘事件等,使这些活动组件像普通组件一样响应。当用户点击它们时重新呈现按钮,等等将是具有挑战性的。不是不可能,而是乏味。

最后,变量行高JList很痛苦。特别是在你的计算中,要弄清楚是否显示了一行,因为你不能简单地进行简单的数学计算,如:int rowHeight = jlist.getHeight / model.size()。它不起作用。你必须计算每一行的高度,然后计算一行是否可见。

做你正在谈论的是很多工作,并且非常棘手的编码来解决JList的一些假设以使其工作。最后,您可能会发现只需实现自己的List控件就可以做出不同的设计决策。无论哪种方式,它都要求你擅长Swing才能让它发挥作用。

答案 1 :(得分:0)

确定。我没有找到任何这种组件的实现。让它成为第一个。 https://github.com/wertlex/JActiveList

P.S。我不认为这是正确的实施方式......但它确实有效。

答案 2 :(得分:-1)

使用JList和ActionListener XD