2009-08-24 9 views
1

Das Problem: Ich habe eine Combo-Box, die als Teil einer Swing-Anwendung in einen festen Platz passen muss. Der Inhalt kann jedoch ziemlich lang sein. Ich möchte, dass die Box selbst eine feste Größe hat und den Inhalt abschneidet. Wenn der Abwärtspfeil angeklickt wird, möchte ich, dass es sich ähnlich wie eine HTML-Auswahl verhält und ein Feld anzeigt, das lang genug ist, um den längsten Eintrag als Drop-Down zu verwenden. Der ListCellRenderer könnte der Weg sein, auf diesem zu gehen; Ich bin mir nicht sicher.JComboBox mit größerer Drop-Down-Breite

Es kann auch sein, dass ich eine Art von Implementierung von javax.swing.plaf.basic.ComboPopup und meine eigene ComboBoxUI brauche. Ich habe den SwingUtilities-Code durchforstet, um zu verstehen, wie der DefaultListCellRenderer seine Berechnungen durchführt. Es verwendet ein JLabel, und das BasicLabelUI ruft SwingUtilities.layoutCompoundLabel (eventuell im Aufruf-Stack) auf, das den Clipping ausführt. BasicComboPopup, die einzige Implementierung von ComboPopup im Java 6-Code, den ich durchforstete, schien zu delegieren: JList.computeVisibleRect (Komponente c, Rectangle visibleRect)

Hat jemand das schon mal gemacht? Irgendwelche Zeiger?

Antwort

1

JComboBox von anonym mit Drop-Down mit variabler Breite. Beachten Sie, dass dies nur Metal LAF ist.

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); 
    } 
}