JLabel вертикальное выравнивание не работает, как ожидалось - PullRequest
17 голосов
/ 19 августа 2011
Font font = Font("Arial", Font.BOLD, 35);

JLabel label = new JLabel("57");
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.LINE_AXIS));
panel.add(label);

Это создает JLabel с дополнительным пробелом над и под ним. Я пытался setVerticalAlignment(SwingConstants.TOP), но это не работает. Опять же, я не хочу выравнивать JLabel по верху, но текст внутри JLabel должен быть выровнен по верху.

вот как выглядит мой ярлык enter image description here

Ответы [ 2 ]

23 голосов
/ 19 августа 2011

Текст в вашем ярлыке уже выровнен по верху. Даже если вы установите все три из:

label.setVerticalAlignment(JLabel.TOP);
label.setVerticalTextPosition(JLabel.TOP);
panel.setAlignmentY(TOP_ALIGNMENT);

вы все равно найдете этот пробел.

Проблема связана с метриками шрифта. Шрифт оставляет место для диакритических знаков, и, хотя английские цифры и даже буквы не содержат диакритических знаков на заглавных буквах, в Arial определенно содержится полный набор международных символов, в том числе более высоких, чем заглавные буквы, например, немецкие умлауты (ÄÖÜ) или символы с португальскими диакритическими знаками (ÁÂÃ).

Если вы хотите быстрое и простое решение, которое является хаком и может плохо масштабироваться на шрифтах и ​​платформах, вы можете использовать отрицательное значение на границе для компенсации метрик шрифта.

label.setBorder(BorderFactory.createEmptyBorder( -3 /*top*/, 0, 0, 0 ));

Если вы хотите исправить это «правильно», вам следует изучить пакет FontMetrics , так как он имеет много функций, которые могут быть полезны для вычисления фактической высоты и местоположения отображаемого текста, так что вы можете переместить всю строку на соответствующее количество пикселей.

6 голосов
/ 19 августа 2011

Стрелка на диаграмме указывает на разницу между номинальным значением глифа и максимальным значением , как описано в FontMetrics. Вы можете повозиться с setBorder(null); но для абсолютного контроля вы должны будете визуализировать глифы самостоятельно, как показано здесь . К счастью, цифровые символы большинства шрифтов имеют равномерный продвижение и восхождение .

...