我有一个带有TitledBorder的JPanel,但是面板的内容比边框中的标题窄,标题被截断。 我正在使用BoxLayout作为JPanel,如图所示here注意手动设置宽度。我尝试根据TitledBorder getMinimumSize()函数设置面板的最小,最大和首选宽度以及其组件的宽度,但都不起作用。唯一有效的方法是使用盒式填料,但这会引入不希望的压痕。
任何方式都可以显示完整的标题而不管其中包含的内容是什么?
this.jpCases.setLayout(new javax.swing.BoxLayout(this.jpCases, javax.swing.BoxLayout.LINE_AXIS));
List<Category> categories = db.getCategories();
for (Category cat : categories) {
JPanel jp = new JPanel();
TitledBorder tb = BorderFactory.createTitledBorder(cat.getDescription());
jp.setBorder(tb);
jp.setLayout(new BoxLayout(jp, BoxLayout.Y_AXIS));
jp.setAlignmentY(Component.TOP_ALIGNMENT);
jp.setAlignmentX(Component.LEFT_ALIGNMENT);
List<Case> cases = db.getCasesByCategoryId(cat.getId());
for (Case c : cases) {
JRadioButton jrbCase = new JRadioButton();
jrbCase.setText(c.getDescription());
jrbCase.setToolTipText(c.getText());
jrbCase.setMaximumSize(tb.getMinimumSize(jp));
bgCases.add(jrbCase);
jp.add(jrbCase);
}
//jp.add(new Box.Filler(tb.getMinimumSize(jp), tb.getMinimumSize(jp), tb.getMinimumSize(jp)));
this.jpCases.add(jp);
}
答案 0 :(得分:2)
计算所需宽度怎么样:
JRadioButton jrb = new JRadioButton();
int width = (int) SwingUtilities2.getFontMetrics( jrb, jrb.getFont() ).getStringBounds( cat.getDescription(), null ).getWidth();
for (Case c : cases) {
JRadioButton jrbCase = new JRadioButton();
jrbCase.setText(c.getDescription());
jrbCase.setToolTipText(c.getText());
jrbCase.setPreferredSize( new Dimension( width, jrbCase.getPreferredSize().height ) );
bgCases.add(jrbCase);
jp.add(jrbCase);
}
答案 1 :(得分:0)
我通过在面板的顶部(或底部)添加标签(BoxLayout.Y_AXIS)来“解决”它。标签仅包含导致标题宽度相同(或更大)的空格。 (使用与标题不可见的文本相同的标签不能解决它。)
答案 2 :(得分:0)
这对我很有用:
JPanel aPanel = new JPanel(){
@Override
public Dimension getPreferredSize(){
Dimension d = super.getPreferredSize();
Border b = this.getBorder();
if(b == null) return d;
if(!(b instanceof TitledBorder)) return d;
TitledBorder tb = (TitledBorder)b;
if(tb.getTitle() == null) return d;
int insets = 2 * (tb.getBorderInsets(this).left + tb.getBorderInsets(this).right);
double minWidth = this.getFontMetrics(tb.getTitleFont()).stringWidth(tb.getTitle()) + insets;
if(d.getWidth() > minWidth) return d;
return new Dimension((int)minWidth, d.height);
}
};