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

2024-05-27

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

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

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

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

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

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

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


我相信使用公共 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());
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何更改 JComboBox 下拉列表的宽度? 的相关文章

随机推荐