如何更改 JComboBox 下拉列表的宽度?

2022-09-01 09:53:32

我有一个可编辑的,其中包含单个字母值的列表。因此,组合框非常小。JComboBox

每个字母都有一个特殊的含义,在很少使用的字母的情况下,用户有时并不清楚。因此,我创建了一个自定义,该自定义在下拉列表中显示每个字母的含义。ListCellRenderer

不幸的是,这个解释不适合下拉列表,因为它是小的,因为它与组合框具有相同的宽度。

有没有办法使下拉列表比组合框更宽?

这就是我想要实现的目标:

 ---------------------
| Small JCombobox | V |
 --------------------------------------------
| "Long item 1"                              |
 --------------------------------------------
| "Long item 2"                              |
 --------------------------------------------
| "Long item 3"                              |
 --------------------------------------------

我无法更改组合框的宽度,因为该应用程序是旧旧应用程序的再创造,其中某些内容必须与以前完全相同。(在这种情况下,组合框必须不惜一切代价保持其小尺寸)


答案 1

我相信使用公共API执行此操作的唯一方法是编写自定义UI(有个错误处理此问题)。

如果你只是想要一些快速而肮脏的东西,我发现这种方法可以使用实现细节来做到这一点(这里):

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

把它放在一个弹出式菜单列表器中,它可能对你有用。

或者,您可以使用第一个链接错误中的代码:

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

答案 2

这是Santhosh Kumar的一个很好的解决方案,无需弄乱UI和其他令人讨厌的东西!

http://www.jroller.com/santhosh/entry/make_jcombobox_popup_wide_enough

import javax.swing.*; 
import java.awt.*; 
import java.util.Vector; 

// got this workaround from the following bug: 
//      http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4618607 
public class WideComboBox extends JComboBox{ 

    public WideComboBox() { 
    } 

    public WideComboBox(final Object items[]){ 
        super(items); 
    } 

    public WideComboBox(Vector items) { 
        super(items); 
    } 

        public WideComboBox(ComboBoxModel aModel) { 
        super(aModel); 
    } 

    private boolean layingOut = false; 

    public void doLayout(){ 
        try{ 
            layingOut = true; 
                super.doLayout(); 
        }finally{ 
            layingOut = false; 
        } 
    } 

    public Dimension getSize(){ 
        Dimension dim = super.getSize(); 
        if(!layingOut) 
            dim.width = Math.max(dim.width, getPreferredSize().width); 
        return dim; 
    } 
}

推荐