2010-07-02 8 views
0

HI,JComboBox.addItem pour les objets nuls

J'ai une JComboBox à laquelle j'ajoute mes objets personnalisés. Mais parfois l'objet ajouté est vide. Ainsi, lorsque la comboBox contient des éléments vides, elle s'effondre et devient très fine. Mais une fois peuplé, devient de taille norale. Quelqu'un peut-il s'il vous plaît suggérer quelque chose pour maintenir la hauteur de la JComboBox maintenue même si aucun élément ou élément vide n'a été ajouté.

privée finale JComboBox comboField = new JComboBox(); comboField.removeAllItems(); comboField.addItem (getFirstConfig()); comboField.addItem (getSecConfig());

Merci

+0

Je n'ai jamais vu une boîte combinée "mince", même avec un modèle vide. Publiez votre SSCCE (http://sscce.org) qui montre le problème. – camickr

+0

Utilisez-vous GroupLayout par hasard? –

Répondre

0

Juste ajouté une vérification que si les options pour le Jcombobox sont nulles, alors ajoutez une chaîne vide "". Cela empêche le ComboBox de s'effondrer.

0

Parlez-vous de la liste déroulante ou la boîte elle-même. Si c'est juste la case, ne pouvez-vous pas simplement définir une hauteur minimale?

Mise à jour: Basé sur votre commentaire, j'ai fait quelques expériences avec elle. Selon le gestionnaire de disposition que vous utilisez, le comportement de la taille des composants est différent. Une façon de travailler est d'envelopper votre zone de liste déroulante dans un panneau de disposition de flux et de définir la taille préférée, comme indiqué ci-dessous. Si cela ne vous aide toujours pas, dites-moi s'il vous plaît quel est votre gestionnaire de disposition.

Code

(une démo exécutable):

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

C'est le JComboBox lui-même qui s'effondre lorsque ses options sont nulles. Essayé de définir une hauteur minimale ainsi mais cela n'a pas fonctionné non plus. –

1

Vous pouvez le faire en définissant la taille minimale, mais la valeur correcte dépend police. Vous pouvez deviner la valeur, ou vous pouvez le définir à partir du addNotify avec de l'aide de FontMetrics.

J'ai généralement trouvé qu'il est plus facile de le faire en faisant le premier élément quelque chose comme: "--Sélectionner Config--", ou, si vous savez qu'il n'y a pas d'éléments à choisir: "- Aucune configuration disponible - »

mise à jour:

Puisque vous ne pouvez pas utiliser un espace réservé, vos alternatives dépendent du gestionnaire de mise en page et la LAF en cours d'utilisation.

Généralement, cela revient à définir la taille minimale et/ou préférée du composant JComponent. Il est inexact, mais je l'utilise généralement GridBagLayout et avoir de bons résultats avec cette approche:

@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; 
    } 

Remplacez la valeur minimale avec 100,20 qui travaillent pour vous.

+0

Je suis d'accord qu'ajouter --SelectConfig-- Malheureusement, selon les directives du client de ne pas utiliser d'autres options .. L'utilisation de DefaultComboBoxModel serait-elle une solution possible? Merci –

Questions connexes