I've a TitledBorder having title larger than the body.
Its get cut down and the length sets as per the maximum length of the body.
Suppose I have a label in the body saying TEST
and its enclosed by TitledBorder having title TESTING TITLE
.
In this case the title is cut down and displayed as TESTI
I'm using MigLayout for the body.
Any way to the show the full title irrespective to the content it contains?
Border
s don't directly participate in size evaluation by the LayoutManager
(they are not a JComponent
themselves but just decorations around a JComponent
).
Hence the only way to ensure that the title in a TitledBorder
is completely visible is to enfore a minimum size for the panel it is assigned (or rather for components embedded in that panel).
Minimum size calculation should in this case be based on the current title of your TitledBorder
and the Font
used by TitledBorder
to paint its title.
To be honest, I am not sure, all this work is worth writing.
Based on the exact components comntained inside your TitledBorder
, a simpler solution would be to use JTextField.setColumns(n)
where n is big enough compared with the title.
Actually a better way would be to avoid TitledBorder
altogether, as suggested by Karsten Lentszch from the JGoodies fame, and replace it with a colored JLabel
and a horizontal JSeparator
, that would fully participate in the layout and hence be used for size computation.
I have found that adding a Horizontal Strut of an appropriate width will force the panel to resize so that it shows the entire title:
myPanel.add(Box.createHorizontalStrut(desiredWidth));
I'm sure there is probably a way to dynamically find the desired width at runtime, but I just do it the lazy way: set it to a width that covers the size of my TitledBorder title text.
This works well for me:
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);