2010-10-19 11 views
5

En se référant à la réponse à Multi Columns Combo Box for Swing, je parviens à implémenter un JComboBox 3 colonnes multiples comme suit.Comment faire pour avoir JComboBox liste déroulante qui est plus large que le JComboBox lui-même

alt text

Cependant, ce n'est pas parfait. Mon intention est d'avoir quelque chose sans la barre de défilement horizontale, comme suit. alt text

Ma question est, comment puis-je avoir une liste déroulante JComboBox, qui est plus large que la JComboBox elle-même? Je veux juste me débarrasser de la barre de défilement horizontale. Pourtant, capable de tenir dans 3 colonnes dans une seule liste.

Le code source sont ResultSetCellRenderer et AjaxAutoCompleteJComboBox

Répondre

1

J'ai eu le même problème, donc je créé la méthode suivante

/** 
    * 
    * @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); 
    } 
Questions connexes