[java] 如何更改JComboBox下拉列表的寬度?



Answers

我有點像Santhosh Kumar的WideComboBox

Question

我有一個可編輯的JComboBox ,其中包含單個字母值的列表。 因此,組合框非常小。

每個字母都有一個特殊的含義,在很少使用字母的情況下,有時用戶不清楚。 因此我創建了一個自定義ListCellRenderer ,它顯示了下拉列表中每個字母的含義。

不幸的是,這種解釋不適用於下拉列表,因為它很小,因為它具有與組合框相同的寬度。

有沒有辦法讓下拉列表比組合框更寬?

這就是我想要實現的目標:

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

我無法改變組合框的寬度,因為應用程序是舊的遺留應用程序的重新創建,其中某些東西必須與之前完全一樣。 (在這種情況下,組合框必須不惜一切代價保持它的小尺寸)




您可能想要使用setSize()方法。

combo.setSize(200, combo.getPreferredSize().height);



這是tutiez一個很好的解決方案。

在設置彈出列表的維度之前,它從中獲取最大項目併計算完全顯示它所需的寬度。

public class WiderDropDownCombo extends JComboBox {

    private String type;
    private boolean layingOut = false;
    private int widestLengh = 0;
    private boolean wide = false;

    public WiderDropDownCombo(Object[] objs) {
        super(objs);
    }

    public boolean isWide() {
        return wide;
    }

    // Setting the JComboBox wide
    public void setWide(boolean wide) {
        this.wide = wide;
        widestLengh = getWidestItemWidth();

    }

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

    public int getWidestItemWidth() {

        int numOfItems = this.getItemCount();
        Font font = this.getFont();
        FontMetrics metrics = this.getFontMetrics(font);
        int widest = 0;
        for (int i = 0; i < numOfItems; i++) {
            Object item = this.getItemAt(i);
            int lineWidth = metrics.stringWidth(item.toString());
            widest = Math.max(widest, lineWidth);
        }

        return widest + 5;
    }

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

    public String getType() {
        return type;
    }

    public void setType(String t) {
        type = t;
    }

    public static void main(String[] args) {
        String title = "Combo Test";
        JFrame frame = new JFrame(title);

        String[] items = {
                "I need lot of width to be visible , oh am I visible now",
                "I need lot of width to be visible , oh am I visible now" };
        WiderDropDownCombo simpleCombo = new WiderDropDownCombo(items);
        simpleCombo.setPreferredSize(new Dimension(180, 20));
        simpleCombo.setWide(true);
        JLabel label = new JLabel("Wider Drop Down Demo");

        frame.getContentPane().add(simpleCombo, BorderLayout.NORTH);
        frame.getContentPane().add(label, BorderLayout.SOUTH);
        int width = 200;
        int height = 150;
        frame.setSize(width, height);
        frame.setVisible(true);

    }
}

上面的代碼已經成為快速測試的主要內容。 但請注意,如果您想要垂直滾動,可以將下面的語句調整為大約20

return widest + 5;

希望它對將來參考有用!




Related