簡體   English   中英

從我的JButton獲取字體時發生NullPointerException

[英]NullPointerException while getting font from my JButton

我想創建一個按鈕,該按鈕將自動調整大小,而其中的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() returns null and then 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)

長話短說:
super(txt)更改為

super();
setText(txt);

簡短說明
正如堆棧跟蹤指示的那樣,調用super(txt) (帶有String參數)會在某個時候調用AbstractButtoninit方法:

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

如您所見, 如果 text參數不為null ,則調用方法setText 但是,您覆蓋的setText方法需要設置Font(目前尚未設置)。

因此,首先調用無參數構造函數( super() ),使傳遞給inittext參數為null ,從而避免了問題。 只有 super()返回(此時已正確設置Font)之后,才可以顯式調用setText(txt)並確保一切正常。

(長話短說加上幸福的結局!)

問題在於,顯然是在初始化font字段之前,從JButton的構造函數調用了setText() 對於Swing員工而言,這是不好的編碼習慣,但是如果getFont() == null則什么也不做就可以解決。

暫無
暫無

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

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