2011-07-10 66 views
-4

問題很簡單。我創建了一個名爲「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,但橢圓還沒有被繪製。但是,它不會產生任何錯誤。

+3

記住包含更多堆棧跟蹤? – mre

+2

另外,你爲什麼得到'JComponent'的'Graphics'對象,然後在'paintComponent(...)'之外繪圖?您應該重寫'paintComponent(...)'並在其中執行繪圖。 – mre

+1

你應該讓conisder讓你的類可以運行並從'javax.swing.SwingUtilities.invokeLater()'運行它。這會給你事件隊列的完整性。在常規編碼中使用'instanceof'不是最好的風格。 – ncmathsadist

回答

2

這是因爲傳遞給處理程序的圖形組件是一個未實現的組件,所以getGraphics()返回null。如果組件在屏幕上不可見,則它不會有圖形對象,因此它必須首先可見才能使用。我將此代碼添加到main()方法,並要求你的示例代碼和它的工作:

public static void main(String[] args){ 
    JPanel jpanel = new JPanel(); 
    JFrame jframe = new JFrame(); 
    jframe.add(jpanel); 
    jframe.setVisible(true); 
    jpanel.setVisible(true); 
    Handler handler = new Handler(jpanel); 
} 
+0

是否將遊戲添加到JFrame?什麼類型的BotGUI? – Jason

+1

camickr的解決方案是正確的。 –

2

我已經徹底地研究這個問題,並沒有發現任何解決方案,

閱讀從部分關於Custom Painting.的Swing教程。

您不應該使用getGraphics()方法。這種繪畫不是永久的。一旦Swing確定組件需要重新繪製,您將失去繪畫。

如果您需要更多幫助,請在此發佈您的SSCCE。我們沒有時間通過​​在網絡上追蹤代碼片段來猜測你的代碼是什麼。

+4

@OmerEltoum:camickr的回答在哪裏侮辱或貶低你?如果你擺脫了態度,而是傾聽camickr的建議,你可能會學到一些東西。 –

1

您還沒有提到處理程序是如何創建的。此外,mx,my的值在Mouse is Clicked, Pressed or released之後被初始化。如果您的處理程序類在這些事件發生之前被調用,並因此mx,my爲空?你檢查過了嗎?

+0

沒有drawOval顯示正確。同樣,你沒有展示如何使用Handler類,同樣,SSCCE會回答這個問題。 –

+0

@Omer:它給了什麼錯誤(如果有的話)? NullPointerException是否解決? – Logan