【问题标题】:NullPointerException while getting font from my JButton从我的 JButton 获取字体时出现 NullPointerException
【发布时间】:2013-05-24 15:39:40
【问题描述】:

我想创建一个按钮,它会自动调整大小,而其中的string 无法显示(太大)。

我得到了类似的东西:

public class ResizingButton extends JButton {
    public ResizingButton(String txt) {
        super(txt);
        addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                setText(JOptionPane.showInputDialog("Text"));
            }
        });
    }

    @Override
    public void setText(String arg0) {
        super.setText(arg0);
        FontMetrics metrics = getFontMetrics(getFont());//nullPointerException !!!
        int width = metrics.stringWidth(getText());
        int height = metrics.getHeight();
        Dimension newDimension = new Dimension(width + 40, height + 10);
        setPreferredSize(newDimension);
        setBounds(new Rectangle(getLocation(), getPreferredSize()));
    }
}

我想使用那个类:

public class Zadanie2 extends JFrame {
    public Zadanie2() {
        createGUI();
    }

    private void createGUI() {
        setSize(200, 80);
        //setLayout(new GridLayout());
        add(new ResizingButton("tekst"));
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {
    new Zadanie2();
    }
}

但是我在setText() 方法中得到空指针异常?为什么会发生这种情况,我该如何修复它? getFont() 返回 null 然后getFontMetrics(null) 抛出异常。

堆栈跟踪:

Exception in thread "main" java.lang.NullPointerException
    at java.util.concurrent.ConcurrentHashMap.hash(Unknown Source)
    at java.util.concurrent.ConcurrentHashMap.get(Unknown Source)
    at sun.font.FontDesignMetrics.getMetrics(Unknown Source)
    at sun.swing.SwingUtilities2.getFontMetrics(Unknown Source)
    at javax.swing.JComponent.getFontMetrics(Unknown Source)
    at ResizingButton.setText(ResizingButton.java:26)
    at javax.swing.AbstractButton.init(Unknown Source)
    at javax.swing.JButton.<init>(Unknown Source)
    at javax.swing.JButton.<init>(Unknown Source)
    at ResizingButton.<init>(ResizingButton.java:13)
    at Zadanie2.createGUI(Zadanie2.java:14)
    at Zadanie2.<init>(Zadanie2.java:8)
    at Zadanie2.main(Zadanie2.java:20)

【问题讨论】:

  • 运行您的代码,我在 getFontMetrics() 中看到 NullPointerException,而不是在 getFont() 中。你能发布异常堆栈跟踪吗?
  • @CyrilleKa 你是对的 getFont() 返回 null 然后 getFontMetrics(null) 抛出异常
  • 我觉得可能和stackoverflow.com/questions/9014135/…有关 只要JButton没有“显示”(附在你的JFrame上),一些图形相关的方法就不能正常工作了。

标签: java swing nullpointerexception jbutton


【解决方案1】:

长话短说:
super(txt) 更改为

super();
setText(txt);

简短说明
正如堆栈跟踪所示,调用super(txt)(带有字符串参数)在某个时刻调用AbstractButtoninit 方法:

protected void init(String text, Icon icon) {
    if (text != null) {
        setText(text);
    }
    ...

如您所见,IF text 参数不是 null,方法 setText 被调用。但是您覆盖的 setText 方法需要设置字体(此时尚未设置)。

因此,首先调用无参数构造函数 (super()),导致传递给 inittext 参数为 null,从而避免了该问题。只有之后 super() 返回(此时字体已正确设置),明确调用setText(txt) 是否安全且一切正常。

(长话短说加上大团圆结局!)

【讨论】:

  • 对,这比我的回答更聪明。
  • 长话短说 :)。我的意思是简短的版本足够清楚。谢谢。
【解决方案2】:

问题是setText() 是从JButton 的构造函数调用的,显然是在font 字段初始化之前。对于 Swing 人员来说,这是一种糟糕的编码习惯,但如果 getFont() == null 不做任何事情,您就可以解决它。

【讨论】:

    猜你喜欢
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多