Я столкнулся с проблемой указания ширины html-элемента в JLabel и подумал, что запущу его здесь на флагштоке и посмотрю, есть ли у кого-нибудь какие-нибудь советы.
Когда я указываю ширину элемента, используя значение единицы «px», результирующий размер на самом деле составляет ~ 133%, тогда как, если я не использую единицу измерения или использую «pt», я получаю точный размер, который я указал.
В приведенном ниже примере, если вы измените «Ширина: 100 пикселей» на «Ширина: 100 пикселей», вы получите правильный размер.
Этот ответ 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);
}
}
Хорошо, я думаю, что нашел «причину» (или виновника) для значений пикселей масштабирования Java.
В реализации HTMLEditorKit есть класс CSS, который обрабатывает элементы CSS. Он имеет таблицу со значениями масштабирования для каждой поддерживаемой единицы. (начиная со строки 2843 в CSS.class)
Для «pt» это сопоставление 1-к-1. Для «px» это отображение от 1 до 1,3. Есть даже комментарий, в котором говорится:
// Not sure about 1.3, determined by experiementation.
На самом деле есть две таблицы сопоставления, где вторая используется, если включен режим w3c. У него есть режимы масштабирования, которые отстают от первой таблицы:
Для «pt» это разрешение 1 на экран/72 точки на дюйм. Для «px» это отображение 1-к-1.
Я не уверен, что активирует режим w3c, но остерегайтесь этой проблемы.
w3c mdoe включен
W3C_LENGTH_UNITS
docs.oracle.com/javase/7/docs/api/javax/swing/…