2010-09-01 7 views
1

J'ai, le même problème avec deux composants JTextField et JComboBox, je suppose que la solution que je cherche serait le résoudre pour tous les composants.Redimensionner le composant Swing lorsque le contenu a changé dynamiquement

J'ai défini la taille des composants par défaut, donc leur taille correspond au contenu initial que je lui ai fourni. lorsque je modifie le contenu d'un composant pour qu'il dépasse la région du composant, je ne peux pas voir le texte entier, et j'aimerais que mon composant soit redimensionné pour qu'il corresponde au texte.

Comment puis-je accomplir cela?

Mise à jour:

Le pack() sur le cadre élargi que le champ de texte, comment puis-je faire la même chose et d'élargir la zone de liste déroulante?

Mise à jour:

private class ComboBoxRenderer extends JLabel implements ListCellRenderer { 
    private static final long serialVersionUID = 752379460716217273L; 
    Dimension maxSize=new Dimension(); 
    @Override 
    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { 
     setText(value.toString()); 
     Dimension size = getPreferredSize(); 
     if(maxSize.width<size.width) 
      maxSize.width=size.width; 
     if(maxSize.height<size.height) 
      maxSize.height=size.height; 

     resolutionDescriptor_ComboBox.setPreferredSize(maxSize); 
     return this; 
    } 

} 

cela fonctionne, pas très efficace, mais il est une première étape, chose est, il ne prend pas l'image du bouton dans des considérations de taille, si une partie du texte est encore non représenté, mais le composant est redimensionné, avez-vous des suggestions?

Adam.

Réponse:

Cela a fait le tour avec un pack(), pas revalidation nécessaire.

private class ComboBoxRenderer extends JLabel implements ListCellRenderer { 
    private static final long serialVersionUID = 752379460716217273L; 
    Dimension maxSize=new Dimension(); 
    @Override 
    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { 
     setText(value.toString()); 
     Dimension size = getPreferredSize(); 
     if(maxSize.width<size.width) { 
      maxSize.width=size.width; 
      resolutionDescriptor_ComboBox.setPrototypeDisplayValue(value.toString()); 
     } 
     if(maxSize.height<size.height) 
      maxSize.height=size.height; 

     return this; 
    } 

} 

assurez-vous de concevoir quelque chose de plus efficace alors ce ...

Mise à jour:

et il n'y a pas besoin pour le pack()!

Adam.

+0

bat la taille des composants dépendent de la mise en page de leur contenant. Quelle disposition utilisez-vous? – Istao

+0

La mise en page Free Design – TacB0sS

+0

Pas une bonne solution.Vous ne devez jamais définir/modifier une propriété d'un composant Swing dans le moteur de rendu. – camickr

Répondre

1

JComboBox a procédé setPrototypeDisplayValue(Object) qui est utilisé pour calculer la largeur préférée de composant sur la base de la longueur du paramètre. Essayez ça.

Et au lieu de pack() utiliser doLayout() ainsi que quelques revalidate() ou repaint()

+0

travaillé, je devais fournir la chaîne comme le prototype, Merci. – TacB0sS

+0

pack() est la bonne méthode à utiliser. Vous ne devriez pas utiliser doLayout(). doLayout peut augmenter la taille des composants, mais la taille de l'image ne changera pas, de sorte que les composants seront tronqués. – camickr

+0

il n'y a pas besoin d'utiliser le pack ou le doLayout, ça marche bien sans eux – TacB0sS

1

Faites un pack() sur le cadre

+0

il change la taille du champ de texte mais pas la zone de liste déroulante ... – TacB0sS

0

Pour redimensionner la zone de liste déroulante, vous pouvez essayer:

comboBox.setModel(comboBox.getModel()); 

Je crois que cela devrait faire la taille préférée de la zone de liste déroulante à recalculée. Bien sûr, vous devrez alors refaire le pack().

Edit:

Ajouté simple SSCCE montre que ceci fonctionne:

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

public class ComboBoxTest3 extends JFrame implements ActionListener 
{ 
    JComboBox comboBox; 
    JTextField textField; 

    public ComboBoxTest3() 
    { 
     String[] tabs = {"one", "two", "three", "four", "five", "six", "seven" }; 
     DefaultComboBoxModel model = new DefaultComboBoxModel(tabs); 
     comboBox = new JComboBox(model); 

     textField = new JTextField("hello"); 

     add(comboBox, BorderLayout.WEST); 
     add(textField, BorderLayout.EAST); 

     JButton button = new JButton("Pack"); 
     button.addActionListener(this); 
     add(button, BorderLayout.SOUTH); 
    } 

    public void actionPerformed(ActionEvent e) 
    { 
     textField.setText("hello there!"); 
     comboBox.addItem("some longer text"); 
     comboBox.setModel(comboBox.getModel()); 
     pack(); 
    } 

    public static void main(String[] args) 
    { 
     JFrame frame = new ComboBoxTest3(); 
     frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

} 
+0

Non, rien n'a changé, il est resté le même ... J'ai ajouté ceci avant le paquet() j'ai essayé plus tôt. Peut-être définir mon propre moteur de rendu et définir la nouvelle taille en fonction du composant le plus important dans la liste ... Je vais voir comment cela fonctionne. – TacB0sS

+0

Fonctionne bien pour moi. – camickr

Questions connexes