0

你好,

我有一个 JComboBox,我正在向其中添加我的自定义对象项。但有时添加的对象是空的。因此,当组合框中有空项目时,它会折叠并变得非常薄。但是一旦人满为患,就变成了正常的高度。有人可以建议一些东西来保持 JComboBox 的高度,即使没有添加任何项目或空项目。

private final JComboBox comboField = new JComboBox (); comboField.removeAllItems(); comboField.addItem(getFirstConfig()); comboField.addItem(getSecConfig());

谢谢

4

3 回答 3

1

您可以通过设置最小尺寸来做到这一点,但正确的值取决于字体。您可以猜测该值,也可以在 的addNotify帮助下从中设置它FontMetrics

我通常发现通过使第一个项目更容易做到这一点:“--Select Config--”,或者,如果您知道没有可供选择的项目:“--No Configs Available--”

更新:

由于您不能使用占位符,因此您的替代方案取决于布局管理器和使用的 LAF。

大多数情况下,这相当于设置 JComponent 的最小和/或首选大小。这是不准确的,但我通常使用GridBagLayout这种方法并取得良好的效果:

    @Override
    public void addNotify() {
        super.addNotify();
        combo.setMinimumSize(atLeast(combo.getMinimumSize(), 100, 20));
        combo.setPreferredSize(atLeast(combo.getPreferredSize(), 100, 20));
    }

    private Dimension atLeast(Dimension d, int minWidth, int minHeight) {
        d.width = Math.max(minWidth, d.width);
        d.height = Math.max(minHeight, d.height);
        return d;
    }

将 100,20 替换为适合您的最小值。

于 2010-07-02T16:33:33.887 回答
0

您是在谈论下拉列表还是框本身。如果只是盒子,你不能在上面设置一个最小高度吗?

更新:根据您的评论,我做了一些实验。根据您使用的布局管理器,组件大小的行为是不同的。它可能起作用的一种方法是将组合框包装在流布局面板中并设置首选大小,如下所示。如果这仍然没有帮助,请告诉我您的布局管理器是什么。

代码(可执行演示):

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

public class JComboBoxTest {
    private static JComboBox combo;
    private static String[] labelStrs = new String[5];

    private static void createAndShowGUI() {
        final JFrame frame = new JFrame("test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        for (int i = 0; i < 5; i += 1) {
            labelStrs[i] = "I am label #" + i;
        }

        combo = new JComboBox(labelStrs);

        //------------------------------------------------
        combo.setPreferredSize(new Dimension(100, 20));
        //------------------------------------------------

        JButton remove = new JButton("remove");
        remove.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                combo.removeAllItems();
                frame.repaint();
            }
        });

        JButton add = new JButton("add");
        add.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                for (int i = 0; i < 5; i += 1) {
                    combo.addItem(labelStrs[i]);
                }
                frame.repaint();
            }
        });

        Panel container = new Panel();
        Panel wrapper = new Panel();
        Panel btns = new Panel();

        container.setLayout(new FlowLayout());
        container.add(combo);
        wrapper.add(container); 
        btns.add(remove);
        btns.add(add);

        frame.getContentPane().setLayout(new BorderLayout());
        frame.getContentPane().add(wrapper, BorderLayout.CENTER);
        frame.getContentPane().add(btns, BorderLayout.SOUTH);

        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }   
}
于 2010-07-02T15:55:45.393 回答
0

刚刚添加了一个检查,如果 Jcombobox 的选项为空,则添加一个空字符串“”。这可以防止 ComboBox 折叠。

于 2010-07-07T11:15:46.617 回答