2011-08-18 78 views
15
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中的文本應該對齊到頂端。JLabel垂直對齊不按預期方式工作

這裏是我的標籤看起來像 enter image description here

+0

忘了一行。 label.setFont(字體); – arpanoid

+0

可能的原因是某些符號會向上延伸得比數字更遠,並且標籤內的文本對齊與標籤的大小相結合必須考慮多個字體度量標準。 http://upload.wikimedia.org/wikipedia/commons/3/39/Typography_Line_Terms.svg不是你的問題的答案,但它可能有幫助。 –

+0

+1用於包含圖片;另外,不要忽視['RenderingHints']的價值(http://download.oracle.com/javase/6/docs/api/java/awt/RenderingHints.html)。 – trashgod

回答

19

您標籤中的文字實際上已與頂部對齊。即使你設置的所有三個:

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

你仍然會發現差距。

問題與font-metrics有關。字體爲變音符號留出空間,雖然英文數字甚至字母不包含大寫字母的變音符號,但Arial絕對包含全部的國際字符,包括高於大寫字母的字符,例如德語變音符號(ÄÖÜ)或字符含有葡萄牙變音符號(ÁÂà)。

如果您想要一個快速簡便的解決方案,它可能無法在字體和平臺上很好地擴展,您可以在邊框上使用負值來補償字體指標。

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

如果你要修復它「正確」你應該看看學習有關FontMetrics包,因爲它有很多功能可能是有用的計算文本的實際高度和位置被顯示,使得您可以通過適當的像素數來移動整個字符串。

+0

+1您可以評論此解決方法的相對安全性嗎? – trashgod

+0

+1,尼斯黑客。我不知道你可以使用負值。 :D – mre

+0

謝謝..這確實有效。凌亂,但....... – arpanoid

5

箭頭在圖指向字形的名義上升最大上升之間的差異,如FontMetrics討論。你可以修改setBorder(null);但是對於絕對控制,您必須自己渲染字形,如here所示。幸運的是,大多數字體的數字字形具有統一的高級上升

+2

即使你做\t'FontMetrics fontMetrics = label.getFontMetrics(font); int offset = fontMetrics.getMaxAscent() - fontMetrics.getAscent(); System.out.println(offset);'用字體設置爲Arial的示例代碼,你會得到零的差異。這實際上是一個已知的bug(http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6623223),它可能不會被修復,因爲它會破壞向後兼容性並被標記爲如此低的優先級。 –

+0

很好的參考,謝謝!更新。 – trashgod