在Jbutton中自动包装动态文本

时间:2015-09-16 08:37:57

标签: java swing user-interface jbutton word-wrap

我的Jbuttons有问题。

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

在这种情况下,很难不清楚文本在按钮中的长度,但我的按钮有一个固定的大小(因为图形和谐等等)。

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

示例:

BUTTON 1: "你好" - >您好短,无需换行即可打印。

BUTTON 2: "大家好" - >由于html标签,Hello Hello将自动包装成两行。

BUTTON 3: "你好g。" - >你好克。完全填充按钮的宽度。 HTML没有自动换行!。

现在,按钮3本身看起来非常蹩脚和过载。

因此,我需要一个解决方案来自动换行比按钮宽大或等于-4px的文本。

此外,如果文本不包含空格,则应该包含空格。

1 个答案:

答案 0 :(得分:0)

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

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

e.g:

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