2009-08-24 6 views
1

Le problème: J'ai une zone de liste modifiable qui doit être insérée dans un espace fixe dans le cadre d'une application Swing. Cependant, son contenu peut être assez long. Je voudrais que la boîte elle-même soit de taille fixe, tronquant le contenu. Lorsque la flèche vers le bas est cliquée, cependant, je voudrais qu'il ressemble à un HTML sélectionner et montrer une boîte qui est assez longue pour correspondre à l'entrée la plus longue que la liste déroulante. Le ListCellRenderer peut être le moyen d'aller sur celui-ci; Je ne suis pas sûr.JComboBox avec une plus grande largeur de liste déroulante

Il se peut aussi que j'ai besoin d'une sorte d'implémentation de javax.swing.plaf.basic.ComboPopup et de mon propre ComboBoxUI. J'ai parcouru le code SwingUtilities pour comprendre comment le DefaultListCellRenderer fait ses calculs. Il utilise un JLabel et le BasicLabelUI appelle SwingUtilities.layoutCompoundLabel (éventuellement dans la pile d'appels) qui effectue le découpage. BasicComboPopup, la seule mise en œuvre de ComboPopup dans le code Java 6 je fouillais dans, semblait déléguer à: JList.computeVisibleRect (Component c, Rectangle visibleRect)

Quelqu'un at-il fait cela avant? Des pointeurs?

Répondre

1

JComboBox par anonyme avec menu déroulant largeur variable. Notez qu'il s'agit uniquement de Metal LAF.

import java.awt.*; 
import java.util.*; 
import javax.swing.*; 
import javax.swing.plaf.metal.*; 
import javax.swing.plaf.basic.*; 

/** 
* @version 1.0 12/12/98 
* updated 2012-02-18 to include @Overrides and other Java needs 
*/ 
class SteppedComboBoxUI extends MetalComboBoxUI { 
    @SuppressWarnings("serial") 
@Override 
    protected ComboPopup createPopup() { 
    BasicComboPopup popup = new BasicComboPopup(comboBox) { 

     @Override 
    public void show() { 
     Dimension popupSize = ((SteppedComboBox)comboBox).getPopupSize(); 
     popupSize.setSize(popupSize.width, 
      getPopupHeightForRowCount(comboBox.getMaximumRowCount())); 
     Rectangle popupBounds = computePopupBounds(0, 
      comboBox.getBounds().height, popupSize.width, popupSize.height); 
     scroller.setMaximumSize(popupBounds.getSize()); 
     scroller.setPreferredSize(popupBounds.getSize()); 
     scroller.setMinimumSize(popupBounds.getSize()); 
     list.invalidate();    
     int selectedIndex = comboBox.getSelectedIndex(); 
     if (selectedIndex == -1) { 
      list.clearSelection(); 
     } else { 
      list.setSelectedIndex(selectedIndex); 
     }    
     list.ensureIndexIsVisible(list.getSelectedIndex()); 
     setLightWeightPopupEnabled(comboBox.isLightWeightPopupEnabled()); 

     show(comboBox, popupBounds.x, popupBounds.y); 
     } 
    }; 
    popup.getAccessibleContext().setAccessibleParent(comboBox); 
    return popup; 
    } 
} 


@SuppressWarnings("serial") 
public class SteppedComboBox extends JComboBox { 
    protected int popupWidth; 

    public SteppedComboBox(ComboBoxModel aModel) { 
    super(aModel); 
    setUI(new SteppedComboBoxUI()); 
    popupWidth = 0; 
    } 

    public SteppedComboBox(final Object[] items) { 
    super(items); 
    setUI(new SteppedComboBoxUI()); 
    popupWidth = 0; 
    } 

    @SuppressWarnings("unchecked") 
public SteppedComboBox(Vector items) { 
    super(items); 
    setUI(new SteppedComboBoxUI()); 
    popupWidth = 0; 
    } 


    public void setPopupWidth(int width) { 
    popupWidth = width; 
    } 

    public Dimension getPopupSize() { 
    Dimension size = getSize(); 
    if (popupWidth < 1) popupWidth = size.width; 
    return new Dimension(popupWidth, size.height); 
    } 
} 
Questions connexes