1

我创建了一个扩展 JLabel 类的类。这个类本质上使我将相关的 IconImage 附加到我的 JLabel 并正确调整它的大小变得“更好”。

当我通过代码创建一个新的 JLabel 时,我现在通过代码来完成它。something = new MyClass("message", 1); 对于上面的代码,我已经准备好MyClass(String msg, int type) {}构造函数。在这个构造函数中,我希望能够获得用户指定的文本的宽度。如果该宽度超过某个值,300px那么我想插入一个换行符(基本上根据最大宽度使 JLabel 自动换行)。

我已经删除了下面代码中将图像添加到 JLabel 的部分,因为这与问题无关——我创建了一个单独的类来处理这个问题,它已经可以工作了。

package org.me.myimageapp;

import javax.swing.JLabel;

/**
 *
 * @author Jordan
 */
public class chatBubble extends JLabel {

public static final int BUBBLE_TO_USER = 1;
public static final int BUBBLE_FROM_USER = 2;

chatBubble(String message, int bubble_type) {
    if ( (bubble_type!=1) && (bubble_type!=2) ) {
        return;
    }

    this.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
    this.setText(message);
    this.setVisible(true);
    System.out.println("WIDTH: "+this.getSize().toString()); //WIDTH: java.awt.Dimension[width=0,height=0]

}

}

当我运行此代码时,它会返回“WIDTH:java.awt.Dimension[width=0,height=0]”,就像我在评论中放置的那样。

有什么方法可以在构造函数中获取 JLabel 的宽度?JLabel 还有什么方法可以让我自动换行吗?

4

2 回答 2

5

在渲染之前,任何 Swing 组件的大小都将为零,这是没有办法的。您可以通过使用FontMetrics 类来估计文本的大小(查看 API 的链接)。

还有一些可用于通过使用 HTML 在 JLabel 中自动换行的方法

编辑 1
关于您的问题:

你认为最好的估计方法是什么?比如计算字符并乘以平均字符宽度?

我不知道,因为我没有使用过 FontMetrics。我建议您玩一下它,看看您能想出什么,并在这个论坛的答案中搜索它的用途。

关于我的第二个解决方案,请在此处查看我对问题的回答:word-wrap-in-jlist-items

于 2011-11-30T19:29:41.693 回答
2

您可以使用 html 在标签的文本中获取换行符:

"<html>first line <br>second line"

但是,您无法在构造函数中获取任何摆动组件的大小。

于 2011-11-30T19:33:12.920 回答