2013-02-10 59 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();  
    }   

}