我相信使用公共 API 执行此操作的唯一方法是编写自定义 UI(有two https://bugs.java.com/bugdatabase/view_bug?bug_id=4880218 bugs https://bugs.java.com/bugdatabase/view_bug;jsessionid=b0c3d5c7ecf91ffffffffc9ef87cbec542a2?bug_id=4618607处理这个)。
如果你只是想要一些快速而肮脏的东西,我发现这种方法可以使用实现细节来做到这一点(here http://forums.java.net/jive/message.jspa?messageID=61267):
public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
JComboBox box = (JComboBox) e.getSource();
Object comp = box.getUI().getAccessibleChild(box, 0);
if (!(comp instanceof JPopupMenu)) return;
JComponent scrollPane = (JComponent) ((JPopupMenu) comp).getComponent(0);
Dimension size = new Dimension();
size.width = box.getPreferredSize().width;
size.height = scrollPane.getPreferredSize().height;
scrollPane.setPreferredSize(size);
// following line for Tiger
// scrollPane.setMaximumSize(size);
}
把这个放在一个PopupMenuListener http://java.sun.com/javase/6/docs/api/javax/swing/event/PopupMenuListener.html and it might为你工作。
或者您可以使用来自第一个链接的错误 https://bugs.java.com/bugdatabase/view_bug?bug_id=4880218:
class StyledComboBoxUI extends BasicComboBoxUI {
protected ComboPopup createPopup() {
BasicComboPopup popup = new BasicComboPopup(comboBox) {
@Override
protected Rectangle computePopupBounds(int px,int py,int pw,int ph) {
return super.computePopupBounds(
px,py,Math.max(comboBox.getPreferredSize().width,pw),ph
);
}
};
popup.getAccessibleContext().setAccessibleParent(comboBox);
return popup;
}
}
class StyledComboBox extends JComboBox {
public StyledComboBox() {
setUI(new StyledComboBoxUI());
}
}