2011-12-21 60 views
-1

我有一个实体列表,其中每个实体根据JPanel呈现为小部件。小部件具有动态行为 - 一旦放置在面板上,它可以由基础实体改变。这是自动发生的。此外,一些小部件可以通过不同的动作来调整大小,例如按钮点击。动态JList实现

问题是如何将它们组织成类似JList但没有橡皮图章工艺。换句话说,我想JList其中每个项目渲染与cellrenderer保持“活着”。

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

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

你有什么想法吗?

+0

为更好地帮助越早请张贴http://sscce.org/这里 – mKorbel 2011-12-21 14:47:30

+0

你真的需要更好地了解Swing的MVC的;你需要的一切已经提供给你..你只需要知道如何将它们连接在一起来说明你的实体。 – mre 2011-12-21 14:49:34

+0

是的。我的Swing知识并不完美,我发现它可以从零件构建组件,但我希望存在一些稳定且经过测试的实现。今晚我不想重塑自行车。 – 2011-12-21 14:57:48

回答

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来使其工作。

+0

是的。对JList源码的快速喧染使我确信现在基于现有组件对我来说太难了。我的Swing知识不那么深刻。正如我前面写的那样,我实现了一些基于布局,滚动面板和jpanel的错误解决方法,有时可以按我的意愿工作。但我仍然希望早些时候有人已经遇到了这样的问题 – 2011-12-21 16:06:41

-1

使用JList和ActionListener的XD

+0

做什么,怎么做? -1 – kleopatra 2014-02-11 10:59:08