在 Jbutton 中自动换行动态文本

Wrap dynamic text automatically in Jbutton

我的 Jbutton 有问题。

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

在这种情况下,非常不清楚按钮中的文本可以有多长,但我的按钮具有固定大小(因为图形和谐等等)。

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

示例:

按钮 1: "Hello" -> Hello 足够短,无需换行即可打印。

按钮 2: "Hello guys" -> 由于 html 标签,Hello guys 将自动换行。

按钮 3: "Hello g." -> 你好克。正好填满按钮的宽度。 HTML!.

没有自动换行

现在,按钮 3 本身看起来很糟糕而且过载。

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

此外,不包含空格的文本如果太长也应换行。

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

只需在您的 *ButtonUI #paint 方法中调用它,然后再调用 super.paint(c,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;
}