Java 在Jbutton中自动换行动态文本

Java 在Jbutton中自动换行动态文本,java,swing,user-interface,jbutton,word-wrap,Java,Swing,User Interface,Jbutton,Word Wrap,我的按钮有问题 在我的应用程序中,您可以轻松更改ui语言,也可以轻松覆盖我的按钮的默认翻译 在这种情况下,不清楚按钮中的文本可以有多长,但是我的按钮有固定的大小(因为图形协调等等) 现在我的问题是,我还没有找到一个解决方案来包装一个带有内部按钮边距的文本 例如: 按钮1: “你好” ->Hello足够短,可以不使用换行符打印 按钮2: “大家好” ->由于html标记,Hello guys将自动包装为两行 按钮3: “你好,g。” ->你好,g。完全填充按钮的宽度。没有HTML自动换行 现在,按

我的按钮有问题

在我的应用程序中,您可以轻松更改ui语言,也可以轻松覆盖我的按钮的默认翻译

在这种情况下,不清楚按钮中的文本可以有多长,但是我的按钮有固定的大小(因为图形协调等等)

现在我的问题是,我还没有找到一个解决方案来包装一个带有内部按钮边距的文本

例如:

按钮1: “你好” ->Hello足够短,可以不使用换行符打印

按钮2: “大家好” ->由于html标记,Hello guys将自动包装为两行

按钮3: “你好,g。” ->你好,g。完全填充按钮的宽度。没有HTML自动换行

现在,按钮3本身看起来非常糟糕和过载

因此,我需要一个解决方案,以自动包装一个文本,这是更广泛或相等-4px比按钮


另外,如果文本太长,不包含空格的文本也应该被包装。

解决这个问题的一个非常简单的方法是实用的方法,我写道

在调用super.paint(c,g)之前,只需在*ButtonUI#paint方法中调用它

e、 g:

这是我免费使用的格式化程序(也用于优化;)

private静态最终字符串STR_NEWLINE=“
”; 私有FontRenderContext FontRenderContext=新FontRenderContext(新仿射Transform(),true,true); 私有字符串getWrappedText(图形、抽象按钮、字符串str){ 如果(str!=null){ 字符串text=str.replaceAll(“,”).replaceAll(“,”); int width=button.getWidth(); 矩形2D stringBounds=button.getFont().getStringBounds(文本,fontRenderContext); 如果(!str.contains(str_NEWLINE)&&(width-5)<((双)stringBounds.getWidth()).intValue()){ 字符串newStr; if(str.contains(“”){ int lastIndex=str.lastIndexOf(“”); newStr=str.substring(0,lastIndex)+str_NEWLINE+str.substring(lastIndex); }否则{ int strLength=((str.length()/3)*2); newStr=str.substring(0,strLength)+str_NEWLINE+str.substring(strLength); } 返回新闻TR; } } 返回str; }
“在这种情况下,不清楚按钮中的文本可以有多长,但我的按钮有固定的大小(因为图形协调等)。”对GUI的该部分使用
GridLayout
。它用于计算显示最大值所需的空间,然后在所有其他组件上强制该大小。更一般地,请参见(这同样适用于任何支持HTML的
JComponent
)。
if (c instanceof AbstractButton) {
    String txt = button.getText();
    button.setText(getWrappedText(g, button, txt));
}
private static final String STR_NEWLINE = "<br />";
private FontRenderContext fontRenderContext = new FontRenderContext(new AffineTransform(), true, true);

private String getWrappedText(Graphics graphics, AbstractButton button, String str) {
    if( str != null ) {
        String text = str.replaceAll("<html><center>", "").replaceAll("</center></html>", "");
        int width = button.getWidth();
        Rectangle2D stringBounds = button.getFont().getStringBounds(text, fontRenderContext);
        if ( !str.contains(STR_NEWLINE) && (width-5) < ((Double)stringBounds.getWidth()).intValue()) {
            String newStr;
            if( str.contains(" ") ) {
                int lastIndex = str.lastIndexOf(" ");
                newStr = str.substring(0, lastIndex)+STR_NEWLINE+str.substring(lastIndex);
            } else {
                int strLength = ((str.length()/3)*2);
                newStr = str.substring(0, strLength)+STR_NEWLINE+str.substring(strLength);
            }
            return newStr;
        }
    }
    return str;
}