package helloworld;import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.event.*;
import javax.swing.border.*;public class ListTest extends JFrame
{
  private JPanel jPanel1 = new JPanel();
  private JList jList1 = new JList(new Object[]{"a","b","c","d","e"});
  private CheckBoxRender render = new CheckBoxRender();
  private Border border1;  public static void main(String[] args)
  {
      ListTest t = new ListTest();
      t.setSize(400,300);
      t.show();
  }  public ListTest()
  {
    try
    {
      jbInit();
    }
    catch(Exception e)
    {
      e.printStackTrace();
    }
  }
  private void jbInit() throws Exception
  {
    border1 = BorderFactory.createBevelBorder(BevelBorder.LOWERED,Color.white,Color.white,new Color(124, 124, 124),new Color(178, 178, 178));
    jList1.setBorder(border1);
    jList1.setPreferredSize(new Dimension(250, 100));
    jList1.setCellRenderer(render);
    this.getContentPane().add(jPanel1, BorderLayout.CENTER);
    jPanel1.add(jList1, null);
  }
  class CheckBoxRender extends JCheckBox implements ListCellRenderer{
      public Component getListCellRendererComponent(JList list,Object value ,int row,boolean isSelected,boolean hasFocus) {
          setText(value.toString());
          if(isSelected) {
             setForeground(list.getSelectionForeground() );
             setBackground(list.getSelectionBackground());
          }
          else {
             setForeground(list.getForeground());
             setBackground(list.getBackground());
          }          setSelected(true);
          
          /**
           *   your code here 
           */
          return this;
      }
  }
}

解决方案 »

  1.   

    就是使用接口ListCellRenderer
    本来要贴代码的,被楼上的强了先
      

  2.   

    同意。建议多多理解MVC结构,就是说你的list里边可以保存一组数,这是由model来维护。那么这组数的显示是由ListCellRenderer来负责处理。
    完全可以作到你保存一个“羊头”,显示出来是个“狗肉”。
    由于默认的ListCellRenderer是扩展JLabel组件,而且他调用你的数据对象的toString把要显示的数据转换为string并以一个JLabel负责显示。你只要把自己的ListCellRenderer扩展自JCheckBox自然就实现了所说的问题。另外:我曾经这样做过,但是并不好看,原因就是前面的那个小框框。其实完全可以拿JLabel实现类似的视觉效果,由于Jlable可以设置Icon,你只要找一个漂亮的"对勾"的图片,当选中某一行数据的时候,就把该"对勾"显示出来,看上去和JCheckBox用户的理解基本是一样的,大家都会直到意思的.这样子做还是自己定义ListCellRenderer,可以扩展Default...
    只需要实现
    public Component getListCellRendererComponent(JList list,Object value ,int row,boolean isSelected,boolean hasFocus) 
    方法,
    并根据参数中isSelected和hasFocus来控制何时显示图标.
      

  3.   

    看看下面的代碼,很簡單的,別忘了給分    contentPane = (JPanel) this.getContentPane();
        contentPane.setLayout(borderLayout1);
        JCheckBox[] checkBoxArray=new JCheckBox[20];
        JList jls=new JList();
        JPanel jpn=new JPanel();
        jpn.setLayout(null);
        for(int i=0;i<20;i++){
          checkBoxArray[i]=new JCheckBox("Items"+i);
          jpn.add(checkBoxArray[i]);
          checkBoxArray[i].reshape(0,i*20+2,100,20);
        }
        jpn.setSize(100,20*20);
        jls.add(jpn);
        jls.setPreferredSize(new Dimension(100,20*20));
        JScrollPane jp=new JScrollPane(jls);
        jp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        contentPane.add(jp,BorderLayout.CENTER);
        this.setSize(new Dimension(400, 300));
        this.setTitle("Frame Title");
      }
      

  4.   

    bigbearcn(bigbearcn) 代码通过
    能不能把相应的事件也加上
    我要是实现的功能:1,mainframe中创建一个实例,myListTest
    2,点击mainframe中的一个jtextArea,则myListTest.setVisiable(true);
    3, 此时可以在myListTest中进行选择,
    4,当鼠标移开myListTest,myListTest.setVisiable(false)
       并将myListTest选中的check闲时到jtextArea,!