import java.awt.*;
import javax.swing.*;public class Test extends JFrame{
    
    public Test(){
        
        int number = 15;
        JPanel mainPanel = new JPanel();
        mainPanel.setLayout(new BorderLayout());
        
        JLabel[] label = new JLabel[number];
        for(int i = 0; i < number; i++){
            if(i % 2 == 0){
                label[i] = new JLabel("123gfdgdg");
            }else{
                label[i] = new JLabel("你好吗?");
            }
            label[i].setOpaque(false);
        }
        JList list = new JList(label);
        list.setCellRenderer(new MyCellRenderer());
        JScrollPane scrollPane = new JScrollPane(list);
        mainPanel.add(scrollPane,BorderLayout.CENTER);
        
        this.setPreferredSize(new Dimension(350,300));
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        getContentPane().add(mainPanel);
        pack();
        setVisible(true);
        
    }
    
    public static void main(String[] args){
        
        new Test();
    }
    
    private class MyCellRenderer extends JPanel implements ListCellRenderer  {
        
         public Component getListCellRendererComponent(JList list,
                                                       Object value,
                                                       int index,
                                                       boolean isSelected,
                                                       boolean cellHasFocus) {
             
                 setOpaque(false);
                 setLayout(new BorderLayout());
                 add((JLabel)value);
             
             
             if(isSelected){
                 setBackground(list.getSelectionBackground()); 
             }else{
                 setBackground(list.getBackground());
             }
             return this;
         }
     }    
}
为什么显示出来的字体会重在一起的?

解决方案 »

  1.   

    import java.awt.BorderLayout;
    import java.awt.Component;
    import java.awt.Dimension;import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JList;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.ListCellRenderer;public class Test extends JFrame{
        
        public Test(){
            
            int number = 15;
            JPanel mainPanel = new JPanel();
            mainPanel.setLayout(new BorderLayout());
            
            String[] label = new String[number];
            for(int i = 0; i < number; i++){
                if(i % 2 == 0){
                    label[i] = new String("123gfdgdg");
                }else{
                    label[i] = new String("Hello");
                }
               
            }
            JList list = new JList(label);
            list.setCellRenderer(new MyCellRenderer());
            JScrollPane scrollPane = new JScrollPane(list);
            mainPanel.add(scrollPane,BorderLayout.CENTER);
            
            this.setPreferredSize(new Dimension(350,300));
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            getContentPane().add(mainPanel);
            pack();
            setVisible(true);
            
        }
        
        public static void main(String[] args){
            
            new Test();
        }
        
        private class MyCellRenderer extends JLabel implements ListCellRenderer  {
            
             public Component getListCellRendererComponent(JList list,
                                                           Object value,
                                                           int index,
                                                           boolean isSelected,
                                                           boolean cellHasFocus) {
                 
                     setOpaque(false);
                     setLayout(new BorderLayout());
                     
                     setText(value.toString());
                 
                 
                 if(isSelected){
                     setBackground(list.getSelectionBackground()); 
                 }else{
                     setBackground(list.getBackground());
                 }
                 return this;
             }
         }    
    }
      

  2.   

    把你的MyCellRenderer换成我的就可以了,注意红色部分!!!private class MyCellRenderer extends JPanel implements ListCellRenderer
        {
            private JLabel label = new JLabel();
            public Component getListCellRendererComponent(JList list,
                    Object value,
                    int index,
                    boolean isSelected,
                    boolean cellHasFocus)
            {            setOpaque(false);
                setLayout(new BorderLayout());
                this.label.setText(((JLabel) value).getText());
                add(this.label);

                if (isSelected)
                {
                    setBackground(list.getSelectionBackground());
                }
                else
                {
                    setBackground(list.getBackground());
                }            return this;
            }
        }
      

  3.   

    谢谢楼上两位兄弟,但问题是一楼的duhongltz,我是想将一个panel加到list里面,然后在里面在放几个图片和标签 ,就一个标签加入去布局不漂亮,三楼的chenkangwan如果用你这种方法的话那么if(isSelected)设置颜色那段就没反应了,我也试过你这种方法,如果单是为了设置颜色另加一个监听器好像有点夸张,想用回这个类里面的接口,不知有没更好的方法。
      

  4.   

    if (i % 2 == 0)
    {
    label[i] = new JLabel("123gfdgdg");
    }
    else
    {
    label[i] = new JLabel("                              你好吗?");
    }
    label[i].setOpaque(false);
    加点空格就好了,标签和内容覆盖了
      

  5.   

    import java.awt.BorderLayout;
    import java.awt.Component;
    import java.awt.Dimension;import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JList;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.ListCellRenderer;public class Test extends JFrame{
        
        public Test(){
            
            int number = 15;
            JPanel mainPanel = new JPanel();
            mainPanel.setLayout(new BorderLayout());
            JPanel[] panels = new JPanel[number];
            JLabel[] label = new JLabel[number];
            for(int i = 0; i < number; i++){
                if(i % 2 == 0){
                    label[i] = new JLabel("123gfdgdg");
                }else{
                    label[i] = new JLabel("Hello");
                }
                label[i].setOpaque(false);
                panels[i] = new MyPanel();
                panels[i].add(label[i]);
            }
            JList list = new JList(panels);
            //list.setCellRenderer(new MyCellRenderer());
            JScrollPane scrollPane = new JScrollPane(list);
            mainPanel.add(scrollPane,BorderLayout.CENTER);
            
            this.setPreferredSize(new Dimension(350,300));
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            getContentPane().add(mainPanel);
            pack();
            setVisible(true);
            
        }
        
        public static void main(String[] args){
            
            new Test();
        }
        
    //    private class MyCellRenderer extends JPanel implements ListCellRenderer  {
    //        
    //         public Component getListCellRendererComponent(JList list,
    //                                                       Object value,
    //                                                       int index,
    //                                                       boolean isSelected,
    //                                                       boolean cellHasFocus) {
    //             
    //                 setOpaque(false);
    //                 setLayout(new BorderLayout());
    //                 add((JLabel)value);
    //
    //                 
    //             
    //             
    //             if(isSelected){
    //                 setBackground(list.getSelectionBackground()); 
    //             }else{
    //                 setBackground(list.getBackground());
    //             }
    //             return this;
    //         }
    //     }
        private class MyPanel extends JPanel{
         MyPanel(){
         super();
         }
         public String toString(){
         JLabel label = (JLabel)getComponent(0);
         return label.getText();
         }
        }    
    }
    看看符合你的要求不。不过你要在panel中加其他组件 还要用到 renderer.
      

  6.   

    嗯嗯,多谢duhongltz。我就是想在加到list的panel里面加入另外一个panel和几个label,还是要用到renderer。请问duhongltz能否再给点提示,谢谢你了!