2010-07-02 57 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