2013-02-10 63 views
0

我試着用Graphics類畫一條線,然後把它的JFrame對象中:畫一條線混合Swing和AWT

import java.awt.*; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 

class Window 
{ 
    private JFrame frame; 
    private Graphics g; 

    public void Window() 
    { 
     frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLocation(15, 0); 
     frame.setSize(600, 200); 
     frame.setVisible(true); 

    }   

    public void DrawCross() 
    { 

     g.setColor(Color.BLACK); 
     g.drawLine(300,0, 200, 0); 
     frame.paint(g); 
    }   

}  

...

run: 
Exception in thread "main" java.lang.NullPointerException 
    at Window.DrawCross(Window.java:33) 
    at Main.main(main.java:21) 
Java Result: 1 
BUILD SUCCESSFUL (total time: 0 seconds) 

我在哪裏錯了以及如何解決我的錯誤?初始化抽象的Graphics類對象是不可能的。

+0

作爲一個抽象類,我想你可以只是擴展它,並初始化自己的圖形類。 – 2013-02-10 00:20:33

+0

賴梅斯是正確的。您可能還想查看[執行自定義繪畫](http://docs.oracle.com/javase/tutorial/uiswing/painting/)以獲取更多信息 – MadProgrammer 2013-02-10 00:24:46

回答

2

Graphics對象未被實例化,導致引發NPE

這種方法顯然是錯誤的。請勿直接撥打paint。也不要在JFrame上做任何自定義繪畫,而應添加JComponent的子類並覆蓋paintComponent。在這裏你會有一個很容易實例化的Graphics對象。

Painting in AWT and Swing

2

主要錯誤是,它應該是沒有public Window()void。這是java中的構造函數表示法。如您所說的new Window(),您沒有調用公共無效函數Window,因此幀保持爲空。因此NullPointerException。

+0

認爲它實際上是'null'的Graphics對象,它是拋出'NPE'作爲其在DrawCross中調用的第一個對象,但未在任何地方實例化。 'frame'也是'null' ofc :) – Reimeus 2013-02-10 00:52:05

0

工作代碼,創建立足JoopEggen和Reimeus答案:

import java.awt.*; 
import javax.swing.*; 

class Window 
{ 
    private JFrame frame; 

    public Window() 
    { 
     frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLocation(15, 0); 
     frame.setSize(600, 200); 
     frame.setVisible(true); 
    } 

    public void drawCoordinateSystem() 
    {     
     frame.add(new CoordinateSystem()); 
    }   

} 



public class CoordinateSystem extends JPanel 
{ 
    @Override 
    public void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 
     Dimension size = this.getSize(); 

     g.setColor(Color.BLACK); 
     g.drawLine(0,size.height/2,size.width, size.height/2); 

     g.drawLine(size.width/2, 0, size.width/2, size.height); 

    } 
}   


class Main 
{  
    public static void main(String [] args) 
    { 
    Window h = new Window(); 

    h.drawCoordinateSystem();  
    }   

}