我有一个标题大于正文的 TitledBorder。它被剪掉,长度根据身体的最大长度设置。
假设我在正文中有一个标签,TEST
它由 TitledBorder 包围,并带有 title TESTING TITLE
。在这种情况下,标题被删减并显示为TESTI
我正在使用 MigLayout 作为正文。
不管它包含什么内容,有什么方法可以显示完整的标题?
我有一个标题大于正文的 TitledBorder。它被剪掉,长度根据身体的最大长度设置。
假设我在正文中有一个标签,TEST
它由 TitledBorder 包围,并带有 title TESTING TITLE
。在这种情况下,标题被删减并显示为TESTI
我正在使用 MigLayout 作为正文。
不管它包含什么内容,有什么方法可以显示完整的标题?
Border
s 不直接参与 the 的 size 评估LayoutManager
(它们不是 aJComponent
本身,只是 a 周围的装饰品JComponent
)。
因此,确保 a 中的标题TitledBorder
完全可见的唯一方法是为其分配的面板(或者更确切地说是嵌入在该面板中的组件)设置最小尺寸。
在这种情况下,最小尺寸计算应基于您的当前标题TitledBorder
和Font
用于TitledBorder
绘制其标题的标题。
老实说,我不确定,所有这些工作都值得写。
根据包含在您的 中的确切组件TitledBorder
,一个更简单的解决方案是使用JTextField.setColumns(n)
与标题相比 n 足够大的地方。
实际上,更好的方法是完全避免,正如JGoodiesTitledBorder
名声中的 Karsten Lentzch 所建议的那样,将其替换为color 和 Horizo ntal ,这将完全参与布局并因此用于尺寸计算。JLabel
JSeparator
我发现添加适当宽度的水平支柱将强制面板调整大小,以便显示整个标题:
myPanel.add(Box.createHorizontalStrut(desiredWidth));
我确信可能有一种方法可以在运行时动态找到所需的宽度,但我只是用懒惰的方式来做:将其设置为覆盖我的 TitledBorder 标题文本大小的宽度。
这对我很有效:
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);