我尝试使用Graphics类绘制一条线,然后将其放在JFrame对象中:
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 :(得分:2)
Graphics
对象尚未实例化,导致NPE
被抛出。
这种做法完全错了。不要直接致电paint
。也不要在JFrame
上进行任何自定义绘画,而是添加JComponent
的子类并覆盖paintComponent
。在这里,您将拥有一个易于实例化的Graphics
对象。
答案 1 :(得分:2)
主要错误是public Window()
没有void
。这是java中的构造函数表示法。当您调用new Window()
时,您没有调用公共void函数Window,因此框架保持为null。因此NullPointerException。
答案 2 :(得分: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();
}
}