JComboBox.addItem用于null对象

时间:2010-07-02 15:49:25

标签: java swing jcombobox

HI,

我有一个JComboBox,我正在添加我的自定义对象项。但有时添加的对象是空的。因此,当comboBox中包含空项时,它会折叠并变得非常薄。但是一旦人口稠密,就变成了高度。即使没有添加任何项目或空项目,有人可以建议保持JComboBox的高度。

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

由于

3 个答案:

答案 0 :(得分:1)

您可以通过设置最小尺寸来完成,但正确的值取决于字体。您可以猜测该值,也可以在addNotify的帮助下从FontMetrics进行设置。

我一般认为通过制作第一个项目更容易:“ - 选择配置 - ”,或者,如果您知道没有可供选择的项目:“ - 没有配置可用 - - “

<强>更新

由于您无法使用占位符,因此您的备选方案取决于布局管理器和正在使用的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替换为适合您的最小值。

答案 1 :(得分: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();
            }
        });
    }   
}

答案 2 :(得分:0)

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