[英]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參數)會在某個時候調用AbstractButton
的init
方法:
protected void init(String text, Icon icon) {
if (text != null) {
setText(text);
}
...
如您所見, 如果 text
參數不為null
,則調用方法setText
。 但是,您覆蓋的setText
方法需要設置Font(目前尚未設置)。
因此,首先調用無參數構造函數( super()
),使傳遞給init
的text
參數為null
,從而避免了問題。 只有在 super()
返回(此時已正確設置Font)之后,才可以顯式調用setText(txt)
並確保一切正常。
(長話短說加上幸福的結局!)
問題在於,顯然是在初始化font
字段之前,從JButton
的構造函數調用了setText()
。 對於Swing員工而言,這是不好的編碼習慣,但是如果getFont() == null
則什么也不做就可以解決。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.