2009-03-18 7 views
4

Disons que j'ai un JButton, et je veux qu'il soit assez grand pour contenir une chaîne de 8 caractères "M", quelle que soit la chaîne assignée et la taille de la police, sans utiliser elipsis.S'assurer qu'un JButton peut contenir une chaîne d'une longueur donnée

Le JButton doit avoir exactement cette taille, ni plus, ni moins. Gestionnaire de mise en page en cours d'utilisation est GridBagLayout.

J'ai essayé d'écraser la méthode getPreferredSize() et d'effectuer un calcul en utilisant la chaîne et la police actuelle du système. Le calcul me rend une certaine valeur sensible, cependant, je n'ai aucune idée de comment définir la taille préférée de telle sorte que les frontières sont également considérées.

J'ai essayé d'obtenir les encarts du composant, mais ils sont tous des 0.

C'est le code de ma méthode:

public void getPreferredSize() { 
     Dimension d = super.getPreferredSize(); 

     // Geometry width indicates how many characters must fit 
     char[] pad = new char[propGeometryWidth]; 
     Arrays.fill(pad, 'M'); 
     String tmpTemplateString = new String(pad); 

     FontMetrics tmpMetrics = getFontMetrics(getFont()); 
     Rectangle2D tmpR2D = tmpMetrics.getStringBounds(tmpTemplateString, getGraphics()); 

     int tmpWidth = (int)tmpR2D.getWidth(); 
     int tmpHeight = (int)(tmpR2D.getHeight() * propGeometryHeight + tmpR2D.getHeight()); 

     // We need to take into consideration borders and padding! 
     Insets insets = getInsets(); 

     Dimension tmpSize = new Dimension(tmpWidth + insets.left + insets.right, tmpHeight + insets.top + insets.bottom); 
     return tmpSize; 
} 

J'ai le sentiment que cela pourrait être lié au fait que mon élément ne se réalise pas encore, mais je suis complètement incertain comment je pourrais résoudre ce problème . Est-ce que j'aborde ce problème du mauvais point de vue?

Répondre

2

Je pense que vous pouvez déjà le faire correctement. A partir du :

Si une bordure a été définie pour ce composant, renvoie les encarts de la bordure; sinon appelle super.getInsets.

Un fraîchement créé JButton me montre de java.awt.Insets[top=5,left=17,bottom=5,right=17] avec empiècements l'apparence par défaut et se sentir, et java.awt.Insets[top=4,left=16,bottom=4,right=16] avec le look de Windows et se sentir. Utilisez-vous un look personnalisé, peut-être?

1

J'ai trouvé la raison de mon problème. Le problème est que j'avais un panneau avec un JButton à l'intérieur, et j'ai écrasé la méthode sur le panneau (Il y a une hiérarchie de classes relativement complexe). Ensuite, bien sûr, les encarts pour le panneau sont tous mis à 0. Après avoir obtenu les encarts pour le bouton, comme indiqué par M. Mmyers, tout cela fonctionne très bien.

Questions connexes