2010-07-02 56 views
0

HI,JComboBox.addItem为null对象

我有一个JComboBox,我在其中添加了我的自定义对象项目。但有时添加的对象是空的。所以,当comboBox里面有空物品时,它会崩溃并变得非常薄。但一旦人口稠密,就成为了海拔高度。有人可以请建议semething来保持JComboBox的高度,即使没有项目或空项目添加。

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

谢谢

+0

我从来没有见过一个“薄”组合框,即使是一个空模型。张贴您的SSCCE(http://sscce.org)来证明问题。 – camickr 2010-07-02 16:08:44

+0

你是否在使用GroupLayout? – 2010-07-02 16:18:10

回答

0

刚刚添加了一个检查,如果Jcombobox的选项为空,则添加一个空字符串“”。这使ComboBox不会崩溃。

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(); 
      } 
     }); 
    } 
} 
+0

它的实际JComboBox本身在其选项为空时折叠。试图设置一个最低高度,但也没有工作。 – 2010-07-07 11:13:51

1

您可以通过设置最小尺寸做,但正确的值是字体依赖。您可以猜出价值,或者您可以从中设置它,并从FontMetrics获得一些帮助。

我发现通过使第一个项目类似于“--Select Config--”,或者如果您知道没有可供选择的项目,可以更容易地完成它:“ - 没有配置可用 - ”

更新:

因为你不能用一个占位符,您的选择取决于布局管理器和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。

+0

我同意添加--SelectConfig--不幸的是,在客户端指南中不使用anysuch选项..将使用DefaultComboBoxModel是一个可能的解决方案? 谢谢 – 2010-07-02 18:31:54