使用HTML的JLabel不能正确设置宽度

4

我在尝试使用HTML div标签设置JLabel的宽度。

请考虑以下代码:

import javax.swing.*;

public class Xyzzy extends JFrame{
    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                Xyzzy frame = new Xyzzy();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                frame.setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.PAGE_AXIS));

                String s = "x ";
                for (int i=0; i<200; ++i)
                    s += "x ";

                JLabel jl = new JLabel("<html><div style=\"width: 300px;\">" + s + "</div></html>");

                frame.add(jl);

                frame.setSize(600, 600);
                frame.setVisible(true);
            }
        });
    }
}

我本以为JLabel应该是300像素宽,但实际上它大约有390像素宽。如果我将宽度规范更改为200像素,那么得到的标签大约有260像素宽。

我做错了什么?


我不知道它是否总是正确的,但在你的情况下,尺寸始终比给定的宽度大30%,尝试使用float size = 300 / 1.3f; JLabel jl = new JLabel("<html><div style=\"width:" + size + "px;\">"+ s +"</div></html>");这样大小将为300px。这是一个奇怪的解决方法,我不确定它是否总是有效,所以我只是把它放在注释中。 - alain.janinm
3个回答

5

如果JLabel中的HTML已经过时,我该如何使文本换行?根据此链接,HTML是正确的方法。 - oz1cz
1
@ClausTøndering,JLabel中没有HTML并不过时,现在过时和不正确的是文章和部分描述。 - alain.janinm

3
你正在设置HTML中文本的宽度,而不是JLabel的宽度。使用setPreferredSize方法来设置JLabel的宽度。
frame.pack();

Dimension d = label.getSize();
d.width = width;
label.setPreferredSize(d);

虽然最好是让 JLabel 自动调整大小以适应文本,就像您所看到的那样。


get/setPreferredSize与我正在使用的布局不兼容。此外,我仍需要<html> ... </html>标记以强制JLabel中的文本换行。 - oz1cz
1
@Claus Tøndering:在使用尺寸之前,您必须使框架布局正确。我已经修复了我的答案中的一个错误。 - Gilbert Le Blanc

0
吉尔伯特,我加入了你的代码,得到了这个结果:
import javax.swing.*;
import java.awt.*;

public class Xyzzy extends JFrame{
    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                Xyzzy frame = new Xyzzy();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                frame.setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.PAGE_AXIS));

                String s = "x ";
                for (int i=0; i<200; ++i)
                    s += "x ";

                JLabel jl = new JLabel("<html>" + s + "</html>");

                frame.add(jl);
                frame.pack();

                Dimension d = jl.getSize();
                d.width = 200;
                jl.setPreferredSize(d);

                frame.setSize(600, 600);

                frame.setVisible(true);
            }
        });
    }
}

这根本不起作用。我还尝试过去掉HTML标签和frame.setSize(600,600),但都没有达到我想要的效果:一个宽度为200像素并已调整其高度的JLabel。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接