TitledBorder中的标题崩溃

时间:2011-04-21 13:15:07

标签: swing layout miglayout titled-border

我的TitledBorder标题比身体大。 它被减少,长度根据身体的最大长度设定。

假设我的身体中有一个标签TEST,其标题为TESTING TITLE的TitledBorder。 在这种情况下,标题会被缩小并显示为TESTI

我正在使用MigLayout。

任何方式都可以显示完整的标题而不管其中包含的内容是什么?

3 个答案:

答案 0 :(得分:2)

Border不会直接参与LayoutManager的尺寸评估(它们本身不是JComponent,而只是JComponent周围的装饰。

因此,确保TitledBorder中的标题完全可见的唯一方法是为其指定的面板设置最小尺寸(或者更确切地说是嵌入在该面板中的组件)。

在这种情况下,最小尺寸计算应基于TitledBorder的当前标题和Font用于绘制其标题的TitledBorder

老实说,我不确定,所有这些工作都值得写作。

根据TitledBorder中的确切组件,一个更简单的解决方案是使用JTextField.setColumns(n),其中n与标题相比足够大。

实际上,更好的方法是完全避免TitledBorder,正如Karsten Lentszch从JGoodies成名所建议的那样,并用彩色JLabel和水平{{1}替换它},它将完全参与布局,因此可用于大小计算。

答案 1 :(得分:2)

我发现添加适当宽度的水平支柱会强制面板调整大小以显示整个标题:

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

我确信可能有一种方法可以在运行时动态找到所需的宽度,但我只是以懒惰的方式进行:将其设置为覆盖我的TitledBorder标题文本大小的宽度。

答案 2 :(得分:1)

这对我很有用:

 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);