2011-04-21 1 views
0

J'ai TitledBorder ayant un titre plus grand que le corps. Son être coupé et la longueur définie selon la longueur maximale du corps. Supposons que j'aie une étiquette dans le corps indiquant TEST et qu'elle soit entourée par TitledBorder ayant le titre TESTING TITLE. Dans ce cas, le titre est coupé et affiché comme TESTITitre collapse dans TitledBorder

J'utilise MigLayout pour le corps.

Y a-t-il moyen d'afficher le titre complet quel que soit le contenu qu'il contient?

+0

Êtes-vous fixer de Insets? – u449355

Répondre

2

Border s ne participent pas directement à l'évaluation de la taille du LayoutManager (ils ne sont pas eux-mêmes JComponent mais juste les décorations autour d'un JComponent). Par conséquent, la seule façon de s'assurer que le titre d'un TitledBorder est complètement visible est de prévoir une taille minimale pour le panneau auquel il est affecté (ou plutôt pour les composants incorporés dans ce panneau).

Calcul de la taille minimum devrait dans ce cas être fondée sur le titre actuel de votre TitledBorder et le Font utilisé par TitledBorder pour peindre son titre.

Pour être honnête, je ne suis pas sûr, tout ce travail vaut la peine d'écrire. Basé sur les composants exacts trouvés dans votre TitledBorder, une solution plus simple serait d'utiliser JTextField.setColumns(n) où n est assez grand par rapport au titre.

En fait, une meilleure façon serait d'éviter TitledBorder tout à fait, comme suggéré par Karsten Lentszch de la renommée JGoodies, et le remplacer par un couleur JLabel et un JSeparator horizontal, qui participeraient pleinement à la mise en page et donc d'être utilisés pour la taille calcul.

+0

Merci pour l'information. Laissez-moi juste essayer – Rites

+0

Je suis d'accord avec vous, mais qui sait peut-être il ya une meilleure façon – Rites

+0

Oui, vous avez raison, voir ma modification, une façon recommandée de regrouper les composants dans un panneau sont d'utiliser un JLabel et un JSeparator, plutôt que un TitledBorder. – jfpoilpret

2

J'ai trouvé que l'ajout d'une jambe de force horizontale d'une largeur appropriée forcera le panneau à redimensionner afin qu'il affiche le titre entier:

myPanel.add(Box.createHorizontalStrut(desiredWidth)); 

Je suis sûr qu'il ya probablement un moyen de trouver dynamiquement la la largeur désirée à l'exécution, mais je fais juste la manière paresseuse: le placer à une largeur qui couvre la taille de mon titre TitledBorder.

1

Cela fonctionne bien pour moi:

final String myPanelTitle = UIManager.getString("myPanel_title"); 
final Border myPanelBorder = BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.GREEN), myPanelTitle); 
JPanel myPanel = new JPanel(){ 
     @Override 
     public Dimension getPreferredSize(){ 
      Dimension d = super.getPreferredSize(); 
      int insets = 2 * (myPanelBorder.getBorderInsets(this).left + myPanelBorder.getBorderInsets(this).right); 
      double minWidth = this.getFontMetrics(this.getFont()).stringWidth(myPanelTitle) + insets; 
      if(d.getWidth() > minWidth) 
       minWidth = d.getWidth(); 
      return new Dimension((int)minWidth, d.height); 
     } 
}; 
myPanel.setBorder(myPanelBorder);