class CboRenderer extends JCheckBox implements ListCellRenderer{ public CboRenderer(){
super(); }
@Override
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {
// TODO Auto-generated method stub
this.setText(value+"");
return this;
}
}cbo.setRenderer(new CboRenderer());我现在完成到这一步,下一步打算重写JComboBox那个点击完item就关闭下拉菜单的那个事件,但是我没有找到,请哪位高手指教下。谢谢了。

解决方案 »

  1.   

    额。找到了现成的代码了。import javax.swing.*;  
    import java.awt.event.*;  
    import java.awt.*;  
    import java.util.HashSet;  
    import java.util.Iterator;  
       
    public class JCheckBox_Renders_JComboBox extends JFrame {  
       
    JPanel buttonPanel;  
      
    private static final String BLANK =       "";  
    private static final String DOG =         "DOG";  
    private static final String CAT =         "CAT";  
    private static final String PIG =         "PIG";  
    private static final String RABBIT =      "RABBIT";  
    private static final String OX =          "OX";  
       
    private static final String [] animalOption =  
    {BLANK, DOG, CAT, PIG, RABBIT, OX};  
       
    CheckComboBox checkComboBox;  
      
    JButton button;  
      
    String excludeDest;  
      
    private HashSet instructionHashset=new HashSet();  
       
    private JButton get_button()  
    {  
    if(button == null)  
    {  
    button = new JButton("Print");  
    button.addActionListener(new ActionListener(){  
       
    public void actionPerformed(ActionEvent arg0) {  
      
    System.out.println(getAnimals());  
      
    }});  
    }  
    return button;  
    }  
      
    public JCheckBox_Renders_JComboBox() {  
    buttonPanel = new JPanel();  
       
    checkComboBox = new CheckComboBox();  
    checkComboBox.setPreferredSize(new Dimension(120, 20));  
      
    for(int i = 0; i < animalOption.length; i ++)  
    {  
    checkComboBox.addItem(animalOption[i]);  
    }  
    buttonPanel.setLayout(new BorderLayout());  
    buttonPanel.add(checkComboBox, BorderLayout.CENTER);  
    buttonPanel.add(get_button(), BorderLayout.EAST);  
       
    getContentPane().add(buttonPanel,BorderLayout.NORTH);  
       
    setDefaultCloseOperation(EXIT_ON_CLOSE);  
    setSize(300, 200);  
    setVisible(true);  
    }  
       
    public static void main(String args[])   
    {  
    JCheckBox_Renders_JComboBox fe = new JCheckBox_Renders_JComboBox();  
    }  
       
       
    class CheckComboBox extends JComboBox {  
    CheckRenderer renderer;  
       
    public CheckComboBox () {  
    renderer = new CheckRenderer();  
    setRenderer(renderer);  
    addActionListener(this);  
    }  
       
    public void actionPerformed(ActionEvent e) {  
    int sel = getSelectedIndex();  
       
    if (sel == 0) {  
    getUI().setPopupVisible(this, false);  
    }  
    else if (sel > 0 && sel < (animalOption.length)) {  
    renderer.cbl[sel].setSelected(renderer.cbl[sel].isSelected() ? false : true);  
    }  
      
      
    }  
       
    /** 
     * This method needs to be overriden so that the popuplist won't close 
     * when user selects one opion 
     */  
    public void setPopupVisible(boolean flag)  
    {  
    //Not code her prevents the populist from closing  
    }  
    }  
       
       
    class CheckRenderer extends JCheckBox implements ListCellRenderer {  
    public JCheckBox[] cbl = new JCheckBox[animalOption.length];  
    public CheckRenderer() {  
    setOpaque(true);  
       
    for(int i = 0; i < animalOption.length; i ++)  
    {  
    cbl[i] = new JCheckBox();  
    }  
       
    }  
    public Component getListCellRendererComponent(  
    JList list,  
    Object value,  
    int index,  
    boolean isSelected,  
    boolean cellHasFocus)  
    {  
       
    if (index > -1) {  
    cbl[index].setText(value.toString());  
    cbl[index].setBackground(isSelected ? Color.green : Color.white);  
    cbl[index].setForeground(isSelected ? Color.white : Color.black);  
      
    if(cbl[index].isSelected())  
    {  
    getInstructionHashset().add(value);  
    }  
    else  
    {  
    getInstructionHashset().remove(value);  
    }  
    return cbl[index];  
    }  
    return cbl[0];  
    }  
    }  
      
    public String getAnimals()  
    {  
    Iterator it=instructionHashset.iterator();  
    int i=0;  
    String temp="";  
    while(it.hasNext())  
    {  
    temp=String.valueOf(it.next());  
    if(i==0)  
    excludeDest=temp;  
    else  
    excludeDest=excludeDest+" "+temp;  
    i=i+1;  
    }  
    return excludeDest;  
    }  
      
    public HashSet getInstructionHashset() {  
    return instructionHashset;  
    }  
       
    }  
      

  2.   


    import javax.swing.*;  import java.awt.event.*;  
    import java.awt.*;  
    import java.util.HashSet;  
    import java.util.Iterator;  public class JCheckBox_Renders_JComboBox2 extends JFrame {   JPanel buttonPanel;   private static final String BLANK =       "妖怪";  
    private static final String DOG =         "狗";  
    private static final String CAT =         "猫";  
    private static final String PIG =         "猪";  
    private static final String RABBIT =      "RABBIT";  
    private static final String OX =          "OX";   private static final String [] animalOption =  
    {BLANK, DOG, CAT, PIG, RABBIT, OX};   CheckComboBox checkComboBox;   JButton button;   String excludeDest;   private HashSet instructionHashset=new HashSet();   private JButton get_button()  
    {  
    if(button == null)  
    {  
    button = new JButton("Print");  
    button.addActionListener(new ActionListener(){   public void actionPerformed(ActionEvent arg0) {  
    System.out.println(checkComboBox.renderer.label.getText());
    }});  
    }  
    return button;  
    }   public  JCheckBox_Renders_JComboBox2() {  
    buttonPanel = new JPanel();   checkComboBox = new CheckComboBox();  
    checkComboBox.setPreferredSize(new Dimension(120, 20));   for(int i = 0; i < animalOption.length; i ++)  
    {  
    checkComboBox.addItem(animalOption[i]);  
    }  
    buttonPanel.setLayout(new BorderLayout());  
    buttonPanel.add(checkComboBox, BorderLayout.CENTER);  
    buttonPanel.add(get_button(), BorderLayout.EAST);   getContentPane().add(buttonPanel,BorderLayout.NORTH);   setDefaultCloseOperation(EXIT_ON_CLOSE);  
    setSize(300, 200);  
    setVisible(true);  
    }   public static void main(String args[])   
    {  
    JCheckBox_Renders_JComboBox2 fe = new JCheckBox_Renders_JComboBox2();  
    }  
    class CheckComboBox extends JComboBox {
    boolean  flag =true;
    CheckRenderer renderer;   public CheckComboBox () {  
    renderer = new CheckRenderer();  
    setRenderer(renderer);  
    addActionListener(this);  
    }  
    StringBuffer sb = new StringBuffer();
    public void actionPerformed(ActionEvent e) { 
    int sel = getSelectedIndex();  
    if (flag) {  
    flag = false ;
    getUI().setPopupVisible(this, false);  
    }  
    else{  
    renderer.cbl[sel].setSelected(!renderer.cbl[sel].isSelected()); 
    this.updateUI();
    getUI().setPopupVisible(this, true);
    if(renderer.cbl[sel].isSelected()){
    if(!("".equals(sb.toString()))){
    sb.append("&");
    }
    sb.append(renderer.cbl[sel].getText());
    }else{
    int start = sb.lastIndexOf("&"+renderer.cbl[sel].getText());
    if(start == -1){
    start = sb.lastIndexOf(renderer.cbl[sel].getText());
    }
    int end = start + renderer.cbl[sel].getText().length()+1;
    sb.delete(start, end);
    }
    if("".equals(sb.toString())){
    renderer.label.setText("请选择");
    }else{
    renderer.label.setText(sb.toString());
    }

    }  
    }  
    /** 
     * This method needs to be overriden so that the popuplist won't close 
     * when user selects one opion 
     */  
    public void setPopupVisible(boolean flag)  
    {  
    //Not code her prevents the populist from closing 
    }
    }  
    class CheckRenderer extends JCheckBox implements ListCellRenderer {  
    public JCheckBox[] cbl = new JCheckBox[animalOption.length];  
    public CheckRenderer() {  
    setOpaque(true);   for(int i = 0; i < animalOption.length; i ++)  
    {  
    cbl[i] = new JCheckBox();  
    }   }  
    public final JLabel label = new JLabel("请选择");


    public Component getListCellRendererComponent(  
    JList list,  
    Object value,  
    int index,  
    boolean isSelected,  
    boolean cellHasFocus)  
    {  
    // System.out.println("-------------------------------");
    // if("".equals(value)){
    // }else {
    // label.setText(value+"");
    // }
    if (index > -1) {  
    cbl[index].setText(value.toString());  
    // cbl[index].setBackground(isSelected ? Color.green : Color.white);  
    // cbl[index].setForeground(isSelected ? Color.white : Color.black);   /*if(cbl[index].isSelected())  
    {  
    getInstructionHashset().add(value);  
    }  
    else  
    {  
    getInstructionHashset().remove(value);  
    }  */
    return cbl[index];  
    }  
    System.out.println("---------------------"+index);
    return label;  
    }  
    }   public String getAnimals()  
    {  
    Iterator it=instructionHashset.iterator();  
    int i=0;  
    String temp="";  
    while(it.hasNext())  
    {  
    temp=String.valueOf(it.next());  
    if(i==0)  
    excludeDest=temp;  
    else  
    excludeDest=excludeDest+" "+temp;  
    i=i+1;  
    }  
    return excludeDest;  
    }   public HashSet getInstructionHashset() {  
    return instructionHashset;  
    }  }  
     这是我改进的代码。