匿名的 JComboBox,具有可变宽度的下拉菜单。请注意,这只是金属 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);
}
}