带三个组件的Java GUI Swing Jlist

问题描述:

我需要使用三个组件创建Java Swing JList带三个组件的Java GUI Swing Jlist

每个JList行应该有一个JCheckBox,一个ImageIcon和一个JLabel。 问题是JLabel只能有两个元素。所以我需要一个梅索德添加JCheckBox的...

的jList由三个部分组成: -

enter image description here

+2

'JTable'来去提醒。首先查看[Concepts:Editors and Renderers](http://docs.oracle.com/javase/tutorial/uiswing/components/table.html#editrender)和[Writing a Custom Cell Renderer](http:/ /docs.oracle.com/javase/tutorial/uiswing/components/list.html#renderer)获得更多想法 – MadProgrammer

+0

*“问题是JLabel只能有两个元素” - - 没有意义 – MadProgrammer

+0

谢谢 我的意思是你可以创建一个自定义单元格渲染器,并可以从jlabel扩展,它可以有一个图标和一个文本。但我也需要一个复选框。 所以我试图创建一个自定义的JComponent ... –

在没有任何真实的信息,我可以建议最好由具有看看Concepts: Editors and Renderers开始, Writing a Custom Cell Renderer细胞如何呈现工作。

根据您的基本要求,您需要从某种类型的容器类开始,然后向其中添加组件,然后每次使用它提供的数据调用getListCellRendererComponent时,需要填充组件的值。

您还需要照顾的选择渲染的,因为这是通常由DefaultListCellRenderer

举个例子照顾......

Little me introduce you to my little friends

public static class CustomListCellRenderer extends JPanel implements ListCellRenderer<Data> { 

    private static final Border DEFAULT_NO_FOCUS_BORDER = new EmptyBorder(1, 1, 1, 1); 

    private JCheckBox checkBox; 
    private JLabel label; 

    public CustomListCellRenderer() { 
     setOpaque(false); 

     setLayout(new FlowLayout(FlowLayout.LEFT)); 

     setBorder(DEFAULT_NO_FOCUS_BORDER); 

     checkBox = new JCheckBox(); 
     label = new JLabel(); 

     checkBox.setOpaque(false); 

     add(checkBox); 
     add(label); 
    } 

    @Override 
    public Component getListCellRendererComponent(JList<? extends Data> list, Data value, int index, boolean isSelected, boolean cellHasFocus) { 
     checkBox.setSelected(value.isSelecetd()); 
     label.setIcon(new ImageIcon(value.getImage())); 
     label.setText(value.getText()); 
     Color fg = list.getForeground(); 
     if (isSelected) { 
      setBackground(list.getSelectionBackground()); 
      fg = list.getSelectionForeground(); 
     } 
     label.setForeground(fg); 
     setOpaque(isSelected); 
     Border border = null; 
     if (cellHasFocus) { 
      if (isSelected) { 
       border = UIManager.getBorder("List.focusSelectedCellHighlightBorder"); 
      } 
      if (border == null) { 
       border = UIManager.getBorder("List.focusCellHighlightBorder"); 
      } 
     } else { 
      border = DEFAULT_NO_FOCUS_BORDER; 
     } 
     setBorder(border); 
     return this; 
    } 

} 
+0

upvote for my little pony – BRHSM

+0

非常感谢! 此代码适合我。我编辑了一下,但它的工作原理!我太高兴了。谢谢 –

+0

你知道我看着这个问题并问我自己这个问题 - 有什么理由会让任何人不满吗?它在哪些方面不回答OP问题?怎样才能改善答案?由于没有提供新的答案,我只能假设:1 - 你不明白这个问题; 2-你不明白答案3-你不知道如何解决这个问题 – MadProgrammer