2010-10-19 14 views
5

Al referirme a la respuesta al Multi Columns Combo Box for Swing, logro implementar un 3 columnas JComboBox de la siguiente manera.Cómo tener lista desplegable de JComboBox que es más ancha que JComboBox en sí

alt text

Sin embargo, esto no es perfecto. Mi intención es tener algo sin la barra de desplazamiento horizontal, como se muestra a continuación. alt text

Mi pregunta es, ¿cómo puedo tener una lista desplegable de JComboBox, que es más ancha que la JComboBox misma? Solo quiero deshacerme de la barra de desplazamiento horizontal. Sin embargo, puede caber en 3 columnas en una sola lista.

El código fuente son ResultSetCellRenderer y AjaxAutoCompleteJComboBox

Respuesta

1

que tenían el mismo problema, por lo que creó el siguiente método

/** 
    * 
    * @param box is the ComboBox that is about to show its own popup menu 
    * @param metrics is used to calculate the width of your combo box's items 
    */ 
    public static void adjustPopupWidth(JComboBox box,FontMetrics metrics) { 
     if (box.getItemCount() == 0) { 
      return; 

     } 
     Object comp = box.getUI().getAccessibleChild(box, 0); 
     if (!(comp instanceof JPopupMenu)) { 
      return; 
     } 


     //Find which option is the most wide, to set this width as pop up menu's preferred! 
     int maxWidth=0; 
     for(int i=0;i<box.getItemCount();i++){ 
      if(box.getItemAt(i)==null) 
       continue; 
      int currentWidth=metrics.stringWidth(box.getItemAt(i).toString()); 
      if(maxWidth<currentWidth) 
       maxWidth=currentWidth; 
     } 
     JPopupMenu popup = (JPopupMenu) comp; 
     JScrollPane scrollPane = (JScrollPane) popup.getComponent(0); 
     Dimension size = scrollPane.getPreferredSize(); 
     // +20, as the vertical scroll bar occupy space too. 
     size.width = maxWidth+20; 
     scrollPane.setPreferredSize(size); 
     scrollPane.setMaximumSize(size); 
    }