簡體   English   中英

當Icon為Null時,JLabel出現意外的Text-Alignment行為

[英]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源文件時,您將獲得所需的結果:

JLabel顯示預期的行為

但是,如果ICONS為N​​ull,則JLabel不會關注Text Placement參數:

JLable顯示意外行為

我看到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);

嘗試調整框架的大小,然后查看文本/圖標如何同時顯示在底部/左側。

因此,您需要考慮兩個方面:

  1. 相對於JLabel大小的文本/圖標
  2. 相對於彼此的文本/圖標。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM