[英]JLabel unexpected Text-Alignment behaviour when Icon is Null
如果圖標為null,如何解決JLabel忽略放置指令的明顯限制?
我有一個使用JLabel來顯示帶有解釋性文本的圖標的應用程序,但有時JLabel僅包含文本,而沒有對應的Icon。
我對JLabel設置了對齊方式,如下所示:
label5.setHorizontalAlignment(JLabel.CENTER);
label5.setVerticalAlignment(JLabel.TOP);
label5.setHorizontalTextPosition(JLabel.CENTER);
label5.setVerticalTextPosition(JLabel.BOTTOM);
label5.setIconTextGap(-3);
當存在圖標時,所有這些都可以完美工作。 上方的圖標,下方的文字。
但是,如果Icon為null(由於指定位置缺少圖標源文件(gif / jpg等),或者因為故意將圖標設置為null),則文本不會顯示在底部,而是重置為標簽的頂部。
我認為這可能與我的否定IconTextGap有關,但是我已經能夠在標准Java JLabel示例程序中演示相同的行為(來自www.java2s.com/Code/Java/Swing-JFC/LabelTextPosition.htm )
import java.awt.Container;
import java.awt.GridLayout;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.border.Border;
import javax.swing.border.LineBorder;
public class LabelTextPos {
public static void main(String args[]) {
JFrame frame = new JFrame("Label Text Pos");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container content = frame.getContentPane();
content.setLayout(new GridLayout(2, 2));
Border border = LineBorder.createGrayLineBorder();
Icon warnIcon = new ImageIcon("Warning.gif");
JLabel label1 = new JLabel(warnIcon);
label1.setText("Left-Bottom");
label1.setHorizontalTextPosition(JLabel.LEFT);
label1.setVerticalTextPosition(JLabel.BOTTOM);
label1.setBorder(border);
content.add(label1);
JLabel label2 = new JLabel(warnIcon);
label2.setText("Right-TOP");
label2.setHorizontalTextPosition(JLabel.RIGHT);
label2.setVerticalTextPosition(JLabel.TOP);
label2.setBorder(border);
content.add(label2);
JLabel label3 = new JLabel(warnIcon);
label3.setText("Center-Center");
label3.setHorizontalTextPosition(JLabel.CENTER);
label3.setVerticalTextPosition(JLabel.CENTER);
label3.setBorder(border);
content.add(label3);
JLabel label4 = new JLabel(warnIcon);
label4.setText("Center-Bottom");
label4.setHorizontalTextPosition(JLabel.CENTER);
label4.setVerticalTextPosition(JLabel.BOTTOM);
label4.setBorder(border);
content.add(label4);
frame.setSize(300, 200);
frame.setVisible(true);
}
}
存在ICON源文件時,您將獲得所需的結果:
但是,如果ICONS為Null,則JLabel不會關注Text Placement參數:
我看到JLabel文檔說了setVerticalTextAlignment:
設置標簽文本相對於其圖像的垂直位置。
但是,從上面的屏幕快照中可以看到,Icon實際上為空,它似乎完全繞開了JLabel位置計算代碼。
在發布此消息之前,我進行了很多搜索,但找不到任何討論此特定問題的地方。
那么,是否存在已知或簡單的解決方案? 我相當確定我可以只顯示文本時創建一個新的 JLabel,而不是將現有JLabel上的圖標設置為Null,而沒有圖標的新JLabel可能會在所需的文本中顯示文本位置,但是當舊對象本質上在95%的時間內都在做我需要的工作時,我不希望創建新對象。
我還可以創建一個適當大小的透明圖標,以將文本保留在底部,但是同樣,這似乎有點不合常規。 建議?
是,
JLabel
的文本位置是相對於圖標的。 因此,如果其圖標為null
,則它將與中心對齊。 如果要解決此問題,則必須為JLabel
設置一個具有所需大小的空圖標。
您可以使用以下方法創建一個空的Icon
並將Icon
設置為JLabel
//use this method to set icon to the label
private void setIcon(JLabel label, Icon icon) {
if (icon == null) {
icon = getEmptyIcon();
}
label.setIcon(icon);
}
//crete an empty icon
private Icon getEmptyIcon() {
BufferedImage bufferedImage = new BufferedImage(24, 24, BufferedImage.TYPE_INT_ARGB);
return new ImageIcon(bufferedImage);
}
如果圖標為null,如何解決JLabel忽略放置指令的明顯限制?
您已設置屬性以控制文本/圖標相對於彼此的方式。
但是,您尚未設置屬性來控制文本/圖標相對於JLabel
本身的總空間的方式。
您需要設置文本的水平/垂直對齊方式。
默認值為CENTER
,這意味着文本/圖標在標簽空間內居中。
例如:
label1.setVerticalAlignment(JLabel.BOTTOM);
label1.setHorizontalAlignment(JLabel.LEFT);
嘗試調整框架的大小,然后查看文本/圖標如何同時顯示在底部/左側。
因此,您需要考慮兩個方面:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.