在 Java Swing 中扩展 JLabel 以使用给定的字体(扩展 类 中的超级用法)

Extending JLabel in Java Swing to use a given font (super usage in extended classes)

我正在尝试创建一个继承 JLabel 的新 class JXLabel。不同之处在于,此扩展 class 将为标签分配默认字体。

如果我试试这个:

public class JXLabel extends JLabel {

    Font f = new Font("Segoe UI", Font.PLAIN, 6);

    public JXLabel() {    
        super();
        this.setFont(f);
    }  

    public JXLabel(Icon icon) {
        super(icon);
        this.setFont(f);
    }  

    public JXLabel(Icon icon, int horizontalAlignment) {
        super(icon, horizontalAlignment);
        this.setFont(f);
    }  

    public JXLabel(String text) {
        super(text);
        this.setFont(f);
    }  

    public JXLabel(String text, Icon icon, int horizontalAlignment) {
        super(text, icon, horizontalAlignment);
        this.setFont(f);
    }  

    public JXLabel(String text, int horizontalAlignment) {
        super(text, horizontalAlignment);
        this.setFont(f);
    }  
}

我希望创建为 JXLabel 的新标签具有此默认字体,但它们没有。

如果我创建一个常规 JLabel 并执行:

myLabel.setFont(new Font("Segoe UI", Font.PLAIN, 6));

有效。关于扩展 class 有什么问题的提示?谢谢。

这是上述代码的 MCVE,测试断言一种方式有效,而另一种方式无效。在这里,它通过设置标准字体 JLabel 或使用 JXLabel 来工作。

看看你能不能:

  1. 在您的机器上确认结果
  2. 如果按预期运行,请查找原始代码中的差异。

import java.awt.*;
import javax.swing.*;

public class JXLabelTest {

    public static void main(String[] args) {
        Runnable r = () -> {
            String s = "The quick brown fox jumps over the lazy dog";
            JLabel myLabel = new JLabel(s);
            myLabel.setFont(new Font("Segoe UI", Font.PLAIN, 6));
            JOptionPane.showMessageDialog(null, myLabel);
            JOptionPane.showMessageDialog(null, new JXLabel(s));
        };
        SwingUtilities.invokeLater(r);
    }
}

class JXLabel extends JLabel {

    Font f = new Font("Segoe UI", Font.PLAIN, 6);

    public JXLabel() {    
        super();
        this.setFont(f);
    }  

    public JXLabel(Icon icon) {
        super(icon);
        this.setFont(f);
    }  

    public JXLabel(Icon icon, int horizontalAlignment) {
        super(icon, horizontalAlignment);
        this.setFont(f);
    }  

    public JXLabel(String text) {
        super(text);
        this.setFont(f);
    }  

    public JXLabel(String text, Icon icon, int horizontalAlignment) {
        super(text, icon, horizontalAlignment);
        this.setFont(f);
    }  

    public JXLabel(String text, int horizontalAlignment) {
        super(text, horizontalAlignment);
        this.setFont(f);
    }  
}