如何让JComboBox下拉列表比JComboBox本身更宽

时间:2010-10-19 15:01:57

标签: java swing

通过参考Multi Columns Combo Box for Swing的答案,我设法实现了3个多列JComboBox如下。

alt text

然而,这并不完美。我的意图是没有水平滚动条,如下所示。 alt text

我的问题是,我怎么能有一个比JComboBox本身更宽的JComboBox下拉列表?我只是想摆脱水平滚动条。然而,能够将3列放入单个列表中。

源代码为ResultSetCellRendererAjaxAutoCompleteJComboBox

2 个答案:

答案 0 :(得分:4)

我通过以下论坛Oracle Java Swing Forum

解决了我的问题

为了将来参考,我为所有感兴趣的人提供了完整可行的源代码。

AjaxAutoCompleteJComboBox.java

答案 1 :(得分:1)

我遇到了同样的问题,所以我创建了以下方法

 /**
     * 
     * @param box is the ComboBox that is about to show its own popup menu
     * @param metrics is used to calculate the width of your combo box's items
     */
    public static void adjustPopupWidth(JComboBox box,FontMetrics metrics) {
        if (box.getItemCount() == 0) {
            return;

        }
        Object comp = box.getUI().getAccessibleChild(box, 0);
        if (!(comp instanceof JPopupMenu)) {
            return;
        }


        //Find which option is the most wide, to set this width as pop up menu's preferred!
        int maxWidth=0;
        for(int i=0;i<box.getItemCount();i++){
            if(box.getItemAt(i)==null)
                continue;
            int currentWidth=metrics.stringWidth(box.getItemAt(i).toString());
            if(maxWidth<currentWidth)
                maxWidth=currentWidth;
        }
        JPopupMenu popup = (JPopupMenu) comp;
        JScrollPane scrollPane = (JScrollPane) popup.getComponent(0);
        Dimension size = scrollPane.getPreferredSize();
        // +20, as the vertical scroll bar occupy space too.
        size.width = maxWidth+20;
        scrollPane.setPreferredSize(size);
        scrollPane.setMaximumSize(size);
    }