问问大家 我想在JList中加入那种既有字符串,又有图片,就是说一个对象里有名字和图片,然后加入到JList中,可以吗?我不知道怎么做?谁知道可以说说吗?谢谢

解决方案 »

  1.   

    用JList的绘制器就可以了,用JLable做为JList里面一个Item的绘制对象
      

  2.   

    就是说图片文字都放入JLable中,再加入到JList中吗
      

  3.   

    哦昨天找拉下知道拉是这样 做的 可又有个新的问题 
    就是说我做的程序是个网络聊天的,在客户端,险要输入帐号,密码和妮称,并且要选择图象
    才可以进入,所选择的图象和后来进去的妮称对应,也就是在JList中的一行里面。
    可以用下面的程序,只可以实现表头到表尾的依次赋予图片,实现不了跟前面选择的图片对应
    请问我可以选择对那个具体的行数赋予图片吗?而不是重头到尾一次赋予。
    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());
            
            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 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(".\\icons\\fruit"+(index+1)+".jpg"));
            }
            if (isSelected) {
                setBackground(list.getSelectionBackground());
                setForeground(list.getSelectionForeground());
            }
            else {
                //设置选取与取消选取的前景与背景颜色.
                setBackground(list.getBackground());
                setForeground(list.getForeground());
            }
            return this;
        }    
    }
      

  4.   

    我以前写过一段代码,现在帖出来。
    下面是渲染器,和你上面的差不多,但是它的数据(列表框的数据不直接提供)/*
     * UserList渲染器
     */
    public class UserListCellRenderer extends JLabel implements ListCellRenderer { public Component getListCellRendererComponent(JList list, Object value,
    int index, boolean isSelected, boolean hasFocus) {

                      //这里就是列表框的数据,其中UserListData是我自己定义的一个类,刚下面.
    UserListData data = (UserListData) value;   

                      /*
     * 在JLabel上放上图标和字符串
     * 并设置文本在右边,以及两者的间距
     */
    setText(data.getText());
    setIcon(data.getIcon());
    setHorizontalTextPosition(SwingConstants.RIGHT);
    setIconTextGap(5);
    setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 5));

    /*
     * 设置项目被选中时的颜色
     */
    if (isSelected) {
    setBackground(list.getSelectionBackground());
    setForeground(list.getSelectionForeground());
    } else {
    setBackground(list.getBackground());
                setForeground(list.getForeground());
    }

    setEnabled(list.isEnabled());
            setFont(list.getFont());
            setOpaque(true); return this;
    }}
    /*
     * 一个UserListData代表列表框中一行
     * 由一个图标和一个字符串组成
     */
    public class UserListData {
    private Icon icon;
    private String text;

    public UserListData(String text, Icon icon) {
    this.text = text;
    this.icon = icon;
    }

    public String getText() {
    return text;
    }

    public void setText(String text) {
    this.text = text;
    }

    public Icon getIcon() {
    return icon;
    }

    public void setIcon(Icon icon) {
    this.icon = icon;
    }
    }OK,下面看看列表框的产生吧
    /* 
     * UserList是一个JList
     * 它显示用户列表
     */
    public class UserList extends JList {
    UserListData[] data;

    public UserList() {
    init();
    }

    private void init() {
    String[] texts = new String[6];

             texts[0] = "笨笨(21506431)";
    texts[1] = "笨笨(21506431)";
    texts[2] = "笨笨(21506431)";
    texts[3] = "笨笨(21506431)";
    texts[4] = "笨笨(21506431)";
    texts[5] = "笨笨(21506431)";
    ImageIcon icon = new ImageIcon(
    getClass().getResource("img/face.gif"));

    data = new UserListData[6];

    for (int i = 0; i < texts.length; ++i) {
    data[i] = new UserListData(texts[i], icon);
    }

    this.setCellRenderer(new UserListCellRenderer());
    setListData(data);
    }
    }当然,我由于时间问题,上面的就不改了,这是我以前写的一个小demo,没有什么实际用处,但能说明这个问题。