大家好,我在JList的条目中想加入一个JButton,但是加入按钮后,按钮把整个条目都给覆盖了,我想要的实现效果是按钮和图片等其他元素是并列排列的,不知道该如何实现呢,代码如下:
package jpaneldemo;import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.Vector;public class JList6
{
    public JList6()
    {
        String[] s = {"西瓜","苹果","草莓","香蕉","葡萄"};
        JFrame f = new JFrame("JList");
        Container contentPane = f.getContentPane();
        JList list1 = new JList(s);
        list1.setBorder(BorderFactory.createTitledBorder("您喜欢吃哪些水果?"));
        /*设置在JList中画上图像。在此参数中,我们产生一个CellRenderer对象,此对象实作了ListCellRenderer interface,
         *因此可以返回一个ListCellRenderer对象当作setCellRenderer()方法的参数.
         */
        list1.setCellRenderer(new CellRenderer());
        list1.setCellRenderer(new CellRendererButton());
        
        contentPane.add(new JScrollPane(list1));
        f.pack();
        f.show();
        f.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                    System.exit(0);
            }
        });
    }
    
    public static void main(String args[])
    {
        new JList6();
    }
}class CellRendererButton extends JButton implements ListCellRenderer
{
   /*类CellRenderer继承JLabel并实作ListCellRenderer.由于我们利用JLabel易于插图的特性,因此CellRenderer继承了JLabel
    *可让JList中的每个项目都视为是一个JLabel.
    */
CellRendererButton()
    {
        setOpaque(true);
    }
    /*从这里到结束:实作getListCellRendererComponent()方法*/
    public Component getListCellRendererComponent(JList list,
                                                  Object value,
                                                  int index,
                                                  boolean isSelected,
                                                  boolean cellHasFocus)
    {   
        /*我们判断list.getModel().getElementAt(index)所返回的值是否为null,例如上个例子中,若JList的标题是"你玩过哪
         *些数据库软件",则index>=4的项目值我们全都设为null.而在这个例子中,因为不会有null值,因此有没有加上这个判
         *断并没有关系.
         */
        if (value != null)
        {
            setText(value.toString());
            setIcon(new ImageIcon("C:\\im_away.png"));
        }
        if (isSelected) {
            setBackground(list.getSelectionBackground());
            setForeground(list.getSelectionForeground());
        }
        else {
            //设置选取与取消选取的前景与背景颜色.
            setBackground(list.getBackground());
            setForeground(list.getForeground());
        }
        return this;
    }    
}class CellRenderer extends JLabel implements ListCellRenderer
{
   /*类CellRenderer继承JLabel并实作ListCellRenderer.由于我们利用JLabel易于插图的特性,因此CellRenderer继承了JLabel
    *可让JList中的每个项目都视为是一个JLabel.
    */
    CellRenderer()
    {
        setOpaque(true);
    }
    /*从这里到结束:实作getListCellRendererComponent()方法*/
    public Component getListCellRendererComponent(JList list,
                                                  Object value,
                                                  int index,
                                                  boolean isSelected,
                                                  boolean cellHasFocus)
    {   
        /*我们判断list.getModel().getElementAt(index)所返回的值是否为null,例如上个例子中,若JList的标题是"你玩过哪
         *些数据库软件",则index>=4的项目值我们全都设为null.而在这个例子中,因为不会有null值,因此有没有加上这个判
         *断并没有关系.
         */
        if (value != null)
        {
            setText(value.toString());
            setIcon(new ImageIcon("C:\\im_away.png"));
        }
        if (isSelected) {
            setBackground(list.getSelectionBackground());
            setForeground(list.getSelectionForeground());
        }
        else {
            //设置选取与取消选取的前景与背景颜色.
            setBackground(list.getBackground());
            setForeground(list.getForeground());
        }
        return this;
    }    
}

解决方案 »

  1.   

            list1.setCellRenderer(new CellRenderer());
            list1.setCellRenderer(new CellRendererButton());这两句有问题,只需要设置一次就可以了,你设置了两次,当然第二次的把第一次的覆盖了
      

  2.   


    class CellRendererPanel extends JPanel implements ListCellRenderer {    private JLabel label;
        private JButton button;    CellRendererPanel() {
            this.setLayout(new GridLayout(1, 2));
            setOpaque(true);
            label = new JLabel();
            button = new JButton();
            this.add(label);
            this.add(button);
        }    public Component getListCellRendererComponent(JList list,
                                                      Object value,
                                                      int index,
                                                      boolean isSelected,
                                                      boolean cellHasFocus) {        if (value != null) {
                label.setText(value.toString());
                label.setIcon(new ImageIcon("C:\\temp\\icon.png"));
                button.setText(value.toString());
                button.setIcon(new ImageIcon("C:\\temp\\icon.png"));
            }
            if (isSelected) {
                setBackground(list.getSelectionBackground());
                setForeground(list.getSelectionForeground());
            } else {
                setBackground(list.getBackground());
                setForeground(list.getForeground());
            }
            return this;
        }
    }用这个Renderer替代你的2个Renderer试试。
      

  3.   

    hi,xiaoduan5267,你的代码确实有用呀,多谢了,我把代码修改了一下,出来的效果可以满足需要了,但还有一个问题,按钮点击不了了,鼠标放在上面的话,也没有按钮的那种浮动效果,修改的代码如下:
    package jpaneldemo;import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import java.util.Vector;public class JList6
    {
        public JList6()
        {
            String[] s = {"西瓜","苹果","草莓","香蕉","葡萄"};
            JFrame f = new JFrame("JList");
            Container contentPane = f.getContentPane();
            JList list1 = new JList(s);
            list1.setBorder(BorderFactory.createTitledBorder("您喜欢吃哪些水果?"));
            /*设置在JList中画上图像。在此参数中,我们产生一个CellRenderer对象,此对象实作了ListCellRenderer interface,
             *因此可以返回一个ListCellRenderer对象当作setCellRenderer()方法的参数.
             */
            list1.setCellRenderer(new CellRendererPanel());
            //list1.setCellRenderer(new CellRendererButton());
            
            contentPane.add(new JScrollPane(list1));
            f.pack();
            f.show();
            f.addWindowListener(new WindowAdapter() {
                public void windowClosing(WindowEvent e) {
                        System.exit(0);
                }
            });
        }
        
        public static void main(String args[])
        {
            new JList6();
        }
    }class CellRendererButton extends JButton implements ListCellRenderer
    {
       /*类CellRenderer继承JLabel并实作ListCellRenderer.由于我们利用JLabel易于插图的特性,因此CellRenderer继承了JLabel
        *可让JList中的每个项目都视为是一个JLabel.
        */
    CellRendererButton()
        {
            setOpaque(true);
        }
        /*从这里到结束:实作getListCellRendererComponent()方法*/
        public Component getListCellRendererComponent(JList list,
                                                      Object value,
                                                      int index,
                                                      boolean isSelected,
                                                      boolean cellHasFocus)
        {   
            /*我们判断list.getModel().getElementAt(index)所返回的值是否为null,例如上个例子中,若JList的标题是"你玩过哪
             *些数据库软件",则index>=4的项目值我们全都设为null.而在这个例子中,因为不会有null值,因此有没有加上这个判
             *断并没有关系.
             */
            if (value != null)
            {
                setText(value.toString());
                setIcon(new ImageIcon("C:\\im_away.png"));
            }
            if (isSelected) {
                setBackground(list.getSelectionBackground());
                setForeground(list.getSelectionForeground());
            }
            else {
                //设置选取与取消选取的前景与背景颜色.
                setBackground(list.getBackground());
                setForeground(list.getForeground());
            }
            return this;
        }    
    }class CellRenderer extends JLabel implements ListCellRenderer
    {
       /*类CellRenderer继承JLabel并实作ListCellRenderer.由于我们利用JLabel易于插图的特性,因此CellRenderer继承了JLabel
        *可让JList中的每个项目都视为是一个JLabel.
        */
        CellRenderer()
        {
            setOpaque(true);
        }
        /*从这里到结束:实作getListCellRendererComponent()方法*/
        public Component getListCellRendererComponent(JList list,
                                                      Object value,
                                                      int index,
                                                      boolean isSelected,
                                                      boolean cellHasFocus)
        {   
            /*我们判断list.getModel().getElementAt(index)所返回的值是否为null,例如上个例子中,若JList的标题是"你玩过哪
             *些数据库软件",则index>=4的项目值我们全都设为null.而在这个例子中,因为不会有null值,因此有没有加上这个判
             *断并没有关系.
             */
            if (value != null)
            {
                setText(value.toString());
                setIcon(new ImageIcon("C:\\im_away.png"));
                add(new JButton("111"));
            }
            if (isSelected) {
                setBackground(list.getSelectionBackground());
                setForeground(list.getSelectionForeground());
            }
            else {
                //设置选取与取消选取的前景与背景颜色.
                setBackground(list.getBackground());
                setForeground(list.getForeground());
            }
            return this;
        }    
    }class CellRendererPanel extends JPanel implements ListCellRenderer {    private JLabel label;
        private JButton button;
        private JButton button1;    CellRendererPanel() {
            //this.setLayout(new GridLayout(1, 2));
            setOpaque(true);
            label = new JLabel();
            button = new JButton();
            button.setPreferredSize(new Dimension(16,16));
            button1 = new JButton();
            button1.setPreferredSize(new Dimension(16,16));
            this.add(label);
            this.add(button);
            this.add(button1);
        }    public Component getListCellRendererComponent(JList list,
                                                      Object value,
                                                      int index,
                                                      boolean isSelected,
                                                      boolean cellHasFocus) {        if (value != null) {
                label.setText(value.toString());
                label.setIcon(new ImageIcon("C:\\im_away.png"));
                //button.setText(value.toString());
                button.setIcon(new ImageIcon("C:\\im_away.png"));
                button1.setIcon(new ImageIcon("C:\\im_away.png"));
            }
            if (isSelected) {
                setBackground(list.getSelectionBackground());
                setForeground(list.getSelectionForeground());
            } else {
                setBackground(list.getBackground());
                setForeground(list.getForeground());
            }
            return this;
        }
    }