java - JLabel 宽度在构造函数中始终返回 0。那么如果宽度超过X值,插入一个换行符?

标签 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]

}

}

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

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

最佳答案

任何 Swing 组件的大小在被渲染之前都将为零,没有办法解决这个问题。您可以使用 FontMetrics class 来估计文本的大小(查看 API 链接)。

还有一些技巧可以让您使用 HTML 在 JLabel 中自动换行

编辑 1
关于您的问题:

What would you suggest being the best way to estimate it? Something like counting the characters and the multiplying by an average character width?

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

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

关于java - JLabel 宽度在构造函数中始终返回 0。那么如果宽度超过X值,插入一个换行符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8331727/

相关文章:

java - 在页面加载 jsp 上运行方法

java - OpenGL ES、onDrawFrame 性能

java - 从数组更新 JPanel

java - JLayeredPane 不更新 JLabel 的移动

java - 显示 JLabel 运动

java - 有没有一种简单的方法可以通过java从DynamoDB中获取第N页的项目?

java - 编辑 javafx 属性上的 getValue() - 监听器未通知

java - Tab 键无法为 JTable 转移焦点

java - 使用 ResultSetTableModel 删除 JTable 选中的行

java - 如何在 Swing 中使用 HTML