2011-01-06 101 views
3

我有一个JList,它显示了多个JPanels,我创建了一个自定义渲染器,返回一个新的JPanel。 JPanels显示在JList中,但它们不可访问,我不能选择它们,如果我有一个按钮或文本区域,我不能按它。 我想尝试如果这在JList中工作,因为我想进一步分页。我设法通过将面板添加到Jscroll窗格来实现它,但很想让JList的工作。JList与自定义渲染器

感谢

回答

10

这是JList(和JTabel,JComboBox等)的正常行为。

您的自定义渲染器返回的JPanel未添加到Swing层次结构中。 JList只使用其paint方法在正确的位置绘制渲染器。渲染器只是用作邮票,而您在JList中看到的内容不是组件的图像,而是组件的图像。

这是一种在屏幕上显示很多组件的有效方式,不需要实际实例化组件的开销。请注意,您的渲染器可以始终返回相同的实例(甚至更可取)。

有关更多详细信息,请参阅Swing tutorial

如果您希望JList的条目具有真实组件的作用,您可以执行以下操作。首先,使用JTable而不是JList。带有一列且没有标题的JTableJList大致相同。为什么使用JTable?因为JTable提供编辑。编辑器在JTable上注册,就像Renderers一样。当用户点击一个JTable的单元格时,通常会出现一个编辑器。编辑器叠加在渲染器上,这次它是一个真正的组件。如果渲染器和编辑器组件相同,则用户感觉JTable的单元是真实的组件。

Swing tutorial有这种技术的例子。

+1

谢谢你..非常清晰,简洁 – AhmadAssaf 2011-01-06 15:52:19

0

我不能选择他们,如果我有一个按钮或者在它的文本区域,我不能按它

渲染器只是一个组成部分的绘画。它不是一个真正的组件,所以你不能点击按钮或在文本区域输入文本。

你需要为此使用真实的组件。因此,最好使用组件创建自定义面板,然后将该面板添加到已添加到滚动窗格的另一个面板。

+0

或使用JTable中只有一列,并创建自定义的渲染/编辑:) – willcodejavaforfood 2011-01-06 15:27:42

0

这里是我的解决方案:

public class AccountRenderer extends DefaultListCellRenderer { 

private static final long serialVersionUID = 1L; 

@Override 
public Component getListCellRendererComponent(JList list, Object value, 
     int index, boolean isSelected, boolean cellHasFocus) { 
    JLabel renderer = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); 
    if (value != null) { 
     Account entry = (Account) value; 
     renderer.setText(entry.getName()); 
    } 
    return renderer; 
} 

}