問題很簡單。我創建了一個名爲「handler」的類,在其構造函數中它包含一個「c」參數,一個JComponent。在某個JComponent(最好是JPanel)上調用此構造函數時,將在鼠標的當前座標處繪製一個橢圓。這是源代碼:Graphics.drawOval上的NullPointerException
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
public class Handler implements MouseListener, MouseMotionListener {
Graphics g;
public Handler() {}
public Handler(JComponent c) {
if (c instanceof JPanel) {
g = c.getGraphics();
g.drawOval(mx, my, 5, 5);
}
if (c != null) {
c.addMouseListener(this);
c.addMouseMotionListener(this);
}
}
int mx, my;
public void mouseClicked(MouseEvent e) {
mx = e.getX();
my = e.getY();
}
public void mousePressed(MouseEvent e) {
mx = e.getX();
my = e.getY();
}
public void mouseReleased(MouseEvent e) {
mx = e.getX();
my = e.getY();
}
public void mouseExited(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseMoved(MouseEvent e) {
mx = e.getX();
my = e.getY();
}
public void mouseDragged(MouseEvent e) {}
}
然而,這個錯誤被拋出:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
。你們對此有任何想法?如果是這樣,請發佈解決方案。
編輯1
我做了一些新的東西。這是我的全部新代碼:
import javax.swing.*;
import java.awt.*;
public class Handler extends JPanel {
int mx = MouseInfo.getPointerInfo().getLocation().x;
int my = MouseInfo.getPointerInfo().getLocation().y;
public Handler(BorderLayout bl) {
this.setLayout(bl);
}
public void paintComponent(Graphics g23) {
Graphics2D g2 = (Graphics2D) g23;
g2.drawOval(mx, my, 30, 30);
}
}
我重新編寫了代碼。現在,它擴展了JPanel並作爲JPanel的替代品。因此,我沒有實例化一個新的JPanel,而是調用Handler的構造函數。它也實現了paintComponent,但橢圓還沒有被繪製。但是,它不會產生任何錯誤。
記住包含更多堆棧跟蹤? – mre
另外,你爲什麼得到'JComponent'的'Graphics'對象,然後在'paintComponent(...)'之外繪圖?您應該重寫'paintComponent(...)'並在其中執行繪圖。 – mre
你應該讓conisder讓你的類可以運行並從'javax.swing.SwingUtilities.invokeLater()'運行它。這會給你事件隊列的完整性。在常規編碼中使用'instanceof'不是最好的風格。 – ncmathsadist