Redimensionner composant Swing lorsque le contenu a changé dynamiquement
-
26-09-2019 - |
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.
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 );
}
}