【问题标题】:Dynamic JList implementation动态 JList 实现
【发布时间】:2011-12-21 14:43:42
【问题描述】:

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

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

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

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

你有什么想法吗?

【问题讨论】:

  • 如需更好的帮助,请尽快在此处发布sscce.org
  • 你真的需要更好地理解 Swing MVC;您需要的一切都已提供给您。您只需要知道如何将它们连接在一起以说明您的实体。
  • 是的。我的 Swing 知识并不完美,我看到它可以从片段中构建组件,但我希望存在一些稳定且经过测试的实现。我不想在今晚重新发明自行车。
  • sscce 现在相当困难。当前的实现有很多虚拟代码,方法签名本身不会提供太多信息。所以让我们考虑一下我用组件放置而不是橡皮图章来谈论 JList。
  • 我用组件放置而不是橡皮图章来谈论 JList 在 Swing 中,这本身就是一个矛盾 ;-)

标签: java swing jlist


【解决方案1】:

如果您不希望发生橡皮图章,那么您必须创建自己的使用实际组件的 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 才能让它工作。

【讨论】:

  • 是的。快速浏览 JList 源代码让我确信现在基于现有组件对我来说太难了。我的 Swing 知识没那么深。正如我之前写的那样,我基于布局、滚动面板和 jpanel 实现了一些错误的解决方法,这些解决方法有时可以按我的意愿工作。但我仍然希望早些时候有人已经遇到过这样的问题
【解决方案2】:

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

附:我认为这不是正确的实现方式……但它确实有效。

【讨论】:

    【解决方案3】:

    使用 JList 和 ActionListener XD

    【讨论】:

    • 具体做什么和怎么做? -1
    猜你喜欢
    • 1970-01-01
    • 2015-04-01
    • 2023-04-09
    • 2017-05-21
    • 1970-01-01
    • 2010-10-25
    • 2016-08-06
    • 1970-01-01
    • 2015-04-22
    相关资源
    最近更新 更多