【问题标题】:Create an Interactable JList创建一个可交互的 JList
【发布时间】:2014-08-06 19:11:00
【问题描述】:

正如许多人所知,JList 中的组件不可交互(您无法与它们交互),它们就像组件外观的快照。我正在开发一个简单的应用程序,而 JList 正是我想要的,只是列表中的组件应该是可交互的。

到目前为止,我已经通过实现一个简单的 AbstractListModel 和 ListCellRenderer 创建了这个:

JList 中的每个组件都是一个 JPanel,如您所见,其中包含 JProgressBar、JLable 和 JButton 等其他组件。唯一的问题是按钮(和所有其他组件)不可交互。我该如何解决这个问题?

注意:我不想要单列 JTable!

【问题讨论】:

  • 考虑使用布局来生成垂直对齐的组件列表,例如可能来自 SwingX 或 BoxLayout 的 VerticalLayout
  • @MadProgrammer 实际上我确实有这样的计划,以防万一 JList 无法修复(使用带有 GridLayout 的 JPanel 是我所拥有的)。但我会等待这个问题的答案。
  • 我想你自己回答了,JList 不可编辑,它不是设计成的,试图改造成这样,是很多艰苦的工作(是的,我实际上已经试过)。您“可以”在JList 上使用MouseListener,找到被点击的行,将MouseEvent 转换为ListCellRenderer 的上下文中并确定点击了什么......但第一个选项是更快更简单(使用布局管理器)
  • @Seyed Mohammad 我不想要单列 JTable! == 错误的决定
  • @MadProgrammer 如果您尝试过并且没有简单且干净的解决方案,那么就决定了!答案很简单,它无法完成,我应该寻找替代方案。将此作为答案发布,以便我接受。

标签: java swing jlist


【解决方案1】:

为将来的人们添加此答案。 我刚刚遇到了完全相同的问题,如果您只需要自定义渲染项目而不是功能齐全的组件,那么使用 JListListCellRenderer 非常棒。

这就是我所做的,并且是一种享受:

panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));

然后当我获得动态组装面板所需的信息列表时:

public void build(List<Item> items){
    panel.removeAll();
    for(Item item: items){
        panel.add(new ItemEntry(item));
    }
}

将您的面板包装在JScrollPane 中,它会像以前一样工作,只有您的所有控件现在都可以正常工作:)。

【讨论】:

    【解决方案2】:

    我想你自己回答了,JList 不可编辑,它不是设计成的并且试图对其进行改造,是一项艰巨的工作(是的,我实际上已经尝试过)。

    您“可以”在JList 上使用MouseListener,找到被点击的行,将MouseEvent 转换为ListCellRendererComponent 的上下文中,然后尝试确定是什么被点击了......但是,这又是很多额外的工作,可以通过其他方式更容易地实现......

    考虑使用布局来生成垂直对齐的组件列表,例如来自 SwingX 的 VerticalLayoutBoxLayout

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-04
      • 1970-01-01
      • 2011-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-23
      • 1970-01-01
      相关资源
      最近更新 更多