Question

J'ai, le même problème avec deux composants JTextField et JComboBox, je suppose que la solution que je suis à la recherche résoudrait pour tous les composants.

J'ai définir la taille des composants par défaut ainsi leur taille Tournure le contenu initial que je lui est fournie. quand je change le contenu d'un composant dépasse la région du composant, je ne peux pas voir tout le texte, et je voudrais que mon composant à redimensionner pour ajuster le 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, donc une partie du texte est toujours non représentée, mais les redimensionne composants, avez-vous des suggestions?

Adam.

Réponse:

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.

Était-ce utile?

La solution

JComboBox a setPrototypeDisplayValue(Object) méthode qui est utilisée pour la largeur préférée de composant de calcul en fonction de la longueur du paramètre. Essayez cela.

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

Autres conseils

Faites un pack () sur le cadre

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 aurez alors besoin de faire le pack () à nouveau.

Edit:

Ajout d'un simple SSCCE qui montre ce travaux:

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

}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top