如果你不想橡皮图章发生,那么你将不得不创建自己的使用实际组件的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来使其工作。
为更好地帮助越早请张贴http://sscce.org/这里 – mKorbel 2011-12-21 14:47:30
你真的需要更好地了解Swing的MVC的;你需要的一切已经提供给你..你只需要知道如何将它们连接在一起来说明你的实体。 – mre 2011-12-21 14:49:34
是的。我的Swing知识并不完美,我发现它可以从零件构建组件,但我希望存在一些稳定且经过测试的实现。今晚我不想重塑自行车。 – 2011-12-21 14:57:48