Swing 标题边界中的标题崩溃

Swing 标题边界中的标题崩溃,swing,layout,miglayout,titled-border,Swing,Layout,Miglayout,Titled Border,我有一个标题边框,标题比身体大。 将其切割,并根据身体的最大长度设置长度 假设我在正文中有一个标签,上面写着TEST,它被titleBorder包围,titleTESTING title。 在这种情况下,标题被缩减并显示为TESTI 我用的是MigLayout 是否有任何方式可以显示完整标题,而不考虑其包含的内容?Borders不直接参与LayoutManager的大小评估(它们本身不是JComponent,只是围绕JComponent的装饰) 因此,确保标题边框中的标题完全可见的唯一方法是为其

我有一个标题边框,标题比身体大。 将其切割,并根据身体的最大长度设置长度

假设我在正文中有一个标签,上面写着
TEST
,它被titleBorder包围,title
TESTING title
。 在这种情况下,标题被缩减并显示为
TESTI

我用的是MigLayout


是否有任何方式可以显示完整标题,而不考虑其包含的内容?

Border
s不直接参与
LayoutManager
的大小评估(它们本身不是
JComponent
,只是围绕
JComponent
的装饰)

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

在这种情况下,最小尺寸计算应基于
标题边框的当前标题以及
标题边框绘制标题时使用的
字体

老实说,我不确定这些作品是否值得一写

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


实际上,更好的方法是完全避免标题边界,正如Karsten Lentszch在《名人》中所建议的那样,用彩色的标签和水平的分隔符代替,这将完全参与布局,因此用于尺寸计算。

边框
s不直接参与
布局管理器
的尺寸评估(它们本身不是
JComponent
,只是围绕
JComponent
的装饰)

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

在这种情况下,最小尺寸计算应基于
标题边框的当前标题以及
标题边框绘制标题时使用的
字体

老实说,我不确定这些作品是否值得一写

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


实际上,更好的方法是完全避免标题边界,正如Karsten Lentszch在《名人》中所建议的那样,用彩色的标签和水平的分隔符代替,这将完全参与布局,因此用于尺寸计算。

我发现,添加适当宽度的水平支柱将迫使面板调整大小,以便显示整个标题:

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

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

我发现,添加适当宽度的水平支柱将迫使面板调整大小,以便显示整个标题:

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

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

这对我很有效:

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

这对我来说很有效:

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

我同意你的观点,但谁知道可能有更好的方法呢?是的,请参阅我的编辑,在面板中对组件进行分组的推荐方法是使用JLabel和JSepator,而不是标题边框。同意,但我必须使用边框。无论如何,对于这样一个有用的信息和想法,Thanx:)我同意你的看法,但谁知道可能有更好的方法呢?是的,请参阅我的编辑,在面板中对组件进行分组的推荐方法是使用JLabel和JSepator,而不是标题边框。同意,但我必须使用边框。无论如何,对于这样一个有用的信息和想法,Thanx:)