JLabel宽度始终在构造函数中返回0.然后,如果宽度超过X值,插入换行符?

1 java swing jlabel fontmetrics

我创建了一个扩展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]

}

}
Run Code Online (Sandbox Code Playgroud)

当我运行此代码时,它返回"WIDTH:java.awt.Dimension [width = 0,height = 0]",就像我放在评论中一样.

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

Hov*_*els 5

任何Swing组件的大小都将为零,直到它被渲染,没有办法解决.您可以通过使用FontMetrics类来估计文本的大小(查看API的链接).

还有一些kludges可以通过使用HTML在JLabel中获得自动换行

编辑1
关于您的问题:

您认为最好的估算方法是什么?像计算字符和乘以平均字符宽度的东西?

我不知道因为我没有使用FontMetrics.我建议玩一些,看看你能想出什么,并在这个论坛上搜索它的答案.

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