2014-06-16 27 views
1

许多人可能知道,JList中的组件不可互动(您无法与它们交互),它们就像组件外观的快照。我正在研究一个简单的应用程序,JList是我想要的,除了列表中的组件应该是可交互的。创建一个可交互的JList

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

screenshot

在JList中每个组件一个JPanel,正如你可以看到含有其它成分JProgressBar的一样, JLable和JButton。唯一的问题是按钮(和所有其他组件)不可互动。我怎样才能解决这个问题 ?

注意:我不想单个列JTable!

+3

考虑使用布局来生成一个垂直对齐的组件列表,而不是从SwingX或BoxLayout的VerticalLayout例如 – MadProgrammer

+0

@MadProgrammer我实际上确实有这样一个计划,以防万一JList无法修复(使用JPanel与GridLayout是我的)。但我会等待这个问题的答案。 –

+1

我认为你自己回答了,'JList'不可编辑,它不是可以设计的,并且试图改造,是很多辛苦工作(是的,我实际上已经尝试过)。你可以在JList上使用'MouseListener',找到被点击的行,将'MouseEvent'翻译成'ListCellRenderer'的上下文并确定被点击的内容......但第一个选项是更快,更简单(使用布局管理器) – MadProgrammer

回答

1

我认为你自己回答了,JList是不可编辑的,它不是可编程的,它并没有被设计为和试图改造它,是很多辛勤工作(是的,我已经尝试过)。

你“可能”在JList使用MouseListener,发现被点击的行,翻译MouseEvent是的范畴内ListCellRendererComponent和尝试,并确定单击了什么......但是,这同样是很多额外的工作,可以更容易地通过其他手段实现...

考虑使用布局产生垂直排列的组件列表而不是从SwingX也许VerticalLayoutBoxLayout例如

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和它的工作就像以前只有你的所有控件现在将正常工作:)。