2

我遇到了在 JLabel 中指定 html 元素的宽度的问题,我想我会在这里把它放在旗杆上,看看是否有人有任何建议。

当我使用“px”单位值指定元素的宽度时,结果大小实际上是 ~133%,而如果我不使用单位或使用“pt”,我会得到我指定的确切大小。

在下面的示例中,如果将“width: 100px”更改为“width:100pt”,您将获得正确的尺寸。

这个答案https://stackoverflow.com/a/6257861/131795似乎是相关的,并且 72 dpi 调整似乎与我在示例中看到的不匹配相匹配。

我可能在这里对一段古老的代码感到愤怒,但是为什么要转换绝对 px 值而将 pt 值视为绝对值?

public class test {
    public static void main(String args[]) {
        JFrame frame = new JFrame();

        JLabel label = new JLabel("<html><div style='width: 100px; background-color: red;'>test</div>");
        frame.getContentPane().add(label);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(500, 200);
        frame.setVisible(true);
    }
}
4

1 回答 1

1

好的,我想我已经找到了 java 缩放像素值的“原因”(或罪魁祸首)。

在 HTMLEditorKit 实现中,有一个处理 CSS 内容的 CSS 类。它有一个表格,其中包含每个受支持单位的缩放值。(从 CSS.class 的第 2843 行开始)

对于“pt”,它是一对一的映射。对于“px”,它的 1 到 1.3 映射。甚至有评论说:

// 不确定 1.3,由实验确定。

实际上有两个映射表,如果打开 w3c 模式,则使用第二个映射表。它具有从第一个表向后的缩放模式:

对于“pt”,它是 1-to-screenres/72dpi。对于“px”,它的 1 对 1 映射。

我不确定是什么激活了 w3c 模式,但请注意这个问题。

于 2019-05-30T16:49:02.773 回答