Java 在Jbutton中自动换行动态文本
我的按钮有问题 在我的应用程序中,您可以轻松更改ui语言,也可以轻松覆盖我的按钮的默认翻译 在这种情况下,不清楚按钮中的文本可以有多长,但是我的按钮有固定的大小(因为图形协调等等) 现在我的问题是,我还没有找到一个解决方案来包装一个带有内部按钮边距的文本 例如: 按钮1: “你好” ->Hello足够短,可以不使用换行符打印 按钮2: “大家好” ->由于html标记,Hello guys将自动包装为两行 按钮3: “你好,g。” ->你好,g。完全填充按钮的宽度。没有HTML自动换行 现在,按钮3本身看起来非常糟糕和过载 因此,我需要一个解决方案,以自动包装一个文本,这是更广泛或相等-4px比按钮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自动换行 现在,按
另外,如果文本太长,不包含空格的文本也应该被包装。解决这个问题的一个非常简单的方法是实用的方法,我写道 在调用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;
}