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

新手上路,请多包涵

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

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

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

有什么办法可以使下拉列表比组合框宽?

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

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

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

原文由 Daniel Rikowski 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

我相信使用公共 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);
}

把它放在 PopupMenuListener 中,它 可能 对你有用。

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

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

原文由 Michael Myers 发布,翻译遵循 CC BY-SA 2.5 许可协议

这是 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;
    }
}

原文由 Shlomi 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题