public class CheckBoxList extends JList {
    
     public CheckBoxList(){
     super();
     initCheckBox();
     }
    
     public CheckBoxList(final Vector<?> listData){
     super(listData);
     initCheckBox();
     }
    
     public CheckBoxList(final Object[] listData){
     super(listData);
     initCheckBox();
     }
    
     public CheckBoxList(ListModel dataModel){
     super(dataModel);
     initCheckBox();
     }
    
     private void initCheckBox() {
     this.setCellRenderer(new CheckBoxRenderer());
     this.setUI(new CheckBoxListUI());
     }
    
     class CheckBoxRenderer extends JCheckBox implements           ListCellRenderer {
     public Component getListCellRendererComponent(
     JList list,
     Object value,
     int index,
     boolean isSelected,
     boolean cellHasFocus) {
    
     this.setSelected(isSelected);
     this.setText(value.toString());
     return this;
     }
     }
    
     class CheckBoxListUI extends BasicListUI implements MouseInputListener {
     protected MouseInputListener createMouseInputListener() {
     return this;
     }
    
     public void mouseClicked(MouseEvent e) {
    
     }
    
     public void mousePressed(MouseEvent e) {
     int row = CheckBoxList.this.locationToIndex(e.getPoint());
    
     boolean temp = CheckBoxList.this.getSelectionModel().isSelectedIndex(row);
    
     if (!temp) {
     CheckBoxList.this.addSelectionInterval(row, row);
     } else {
     CheckBoxList.this.removeSelectionInterval(row,row);
     }
    
     }
    
     public void mouseReleased(MouseEvent e) {
    
     }
    
     public void mouseEntered(MouseEvent e) {
    
     }
    
     public void mouseExited(MouseEvent e) {
    
     }
    
     public void mouseDragged(MouseEvent e) {
    
     }
    
     public void mouseMoved(MouseEvent e) {
    
     }
     }
    
    
    }短短几行就变成了CheckBoxList了
这就是swing的灵活性

解决方案 »

  1.   

    CheckBoxList我一般都这么搞,呵呵:import java.awt.BorderLayout;import javax.swing.*;public class T {
    public static void main(String[] args) {
    Box p = Box.createVerticalBox();
    for (int i = 0; i < 10; i++) {
    p.add(new JCheckBox("Item" + (i+1)));
    }

    JFrame f = new JFrame();
    f.getContentPane().add(new JScrollPane(p), BorderLayout.CENTER);
    f.pack();
    f.setLocationRelativeTo(null);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setVisible(true);
    }
    }
      

  2.   

    实际上你这样只适合数据很少,且固定的情况。而且也很难作为一个独立模块来用!如果一个列表有100个数据,你就要new 100 个JCheckBox!而且无法使用JList所有好处!
      

  3.   

    如果一个列表有100个数据,你就要new 100 个JCheckBox!
    --------------------
    什么程序这么BT,需要那么多checkbox啊?
      

  4.   

    我认为楼主写得非常好,真的.而且那个星星写得很好.
    我也认为这可以成为一个组件.会有用处的.
    但是这还没有办法很好的证明Swing什么,我只是想到我的SDK.PS:还有一点不好,你怎么不散点分啊?
      

  5.   

    提示有错误
    "No enclosing instance of the type CheckBoxList is accessible in scope"
      

  6.   

    个人见解.这个东西你要重写UI是不是太隆重了? 如果需要切换LookAndFeel不是废掉?
    不如直接在List上添加MouseListener更简单....而且renderer里面的isSelected是item有没有被选择, 和CheckBox是不是isSelected不是一个概念吧?