Вертикальное выравнивание JLabel не работает должным образом

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

Ответы

Ответ 1

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

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

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

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

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

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

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

Ответ 2

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