设置椭圆投掷错误

时间:2014-03-01 14:57:02

标签: java swing graphics nullpointerexception

我目前正在开发一个项目,我收到此错误Java.lang.NullPointerException,我不知道当你尝试引用一个空对象实例时会发生这个错误,但我不知道,我是如何解决的它。

这是我的代码:

public void paint(Graphics g) {
    g.setColor(Color.red);
    g.drawOval(150, 150, 10, 10);
}

/** Main Method **/
public static void main(String [] args) {
    Run run = new Run();
    run.paint(null);
}

请帮助我解决方案并解释它,以便我学习它。提前谢谢了。安德烈

4 个答案:

答案 0 :(得分:5)

您不能将null传递给paint方法!这是一个如何做的小例子:

import java.awt.Graphics;

import javax.swing.JComponent;
import javax.swing.JFrame;

class MyCanvas extends JComponent {

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawOval (10, 10, 200, 200);  
    }
}

public class DrawOval {
    public static void main(String[] a) {
        JFrame window = new JFrame();
        window.setBounds(30, 30, 300, 300);
        window.getContentPane().add(new MyCanvas());
        window.setVisible(true);
    }
}

答案 1 :(得分:2)

你没有以正确的方式做到这一点。要在java中使用图形,您需要构建Swing / AWT组件。目前,您将Graphics传递为null。

run.paint(null);

您需要使用JFrame和其他swing组件来实现它。

答案 2 :(得分:2)

由于您要向null发送paintGraphics g包含null(指向无处)。

然后在paint(...)内,您在setColor(...)上致电g,即nullnull.setColor(...)导致NullPointerException

答案 3 :(得分:2)

  1. 您几乎从不直接调用paint方法(包括paintComponent),因为这是JVM应该做的事情。
  2. 如果可以避免,则不要覆盖JComponent或JComponent派生类(如JPanel)的paint(Graphics g)方法。这个方法paint不仅负责绘制组件,还负责绘制组件的边框及其子组件,如果不小心,覆盖此方法不会偶尔产生不必要的副作用。
  3. 稍后当你想要制作图形动画时,覆盖paint(Graphics g)将导致生涩的图形,因为默认情况下不会进行双重缓冲。
  4. 通过覆盖paintComponent(Graphics g)方法,您可以解决这些问题。
  5. 不要忘记在覆盖中调用超级paintComponent(g)方法来删除任何不需要的以前绘制的图像。
  6. 阅读Swing Graphics教程,包括基础和高级教程。链接在底部。

  7. 更好的代码:

    import java.awt.Dimension;
    import java.awt.Graphics;
    
    import javax.swing.JComponent;
    import javax.swing.JFrame;
    
    @SuppressWarnings("serial")
    public class MyBetterCanvas extends JComponent {
    
       @Override
       protected void paintComponent(Graphics g) {
          super.paintComponent(g);
          g.drawOval(10, 10, 200, 200);
       }
    
    
       public static void main(String[] a) {
          MyBetterCanvas canvas = new MyBetterCanvas();
          canvas.setPreferredSize(new Dimension(300, 300));
          JFrame window = new JFrame("My Better Canvas");
          window.getContentPane().add(canvas);      
          window.setLocationByPlatform(true);
          window.pack();
          window.setVisible(true);
       }
    }
    

    更好的是:

    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.GradientPaint;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Paint;
    import java.awt.RenderingHints;
    
    import javax.swing.JComponent;
    import javax.swing.JFrame;
    
    @SuppressWarnings("serial")
    public class MyBetterStillCanvas extends JComponent {
       private static final int PREF_W = 500;
       private static final int PREF_H = 500;
       private static final int OVAL_X = 10;
       private static final int OVAL_Y = OVAL_X;
       private static final Paint BG_PAINT = new GradientPaint(0, 20,
             Color.black, 20, 0, Color.darkGray, true);
    
       private static final Paint FILL_PAINT = new GradientPaint(0, 0,
             Color.blue, 20, 20, Color.red, true);
    
       @Override
       protected void paintComponent(Graphics g) {
          super.paintComponent(g);
          Graphics2D g2 = (Graphics2D) g;
          // to smooth out graphics
          g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
          // let's draw something funky
    
          g2.setPaint(BG_PAINT);
          g2.fillRect(0, 0, getWidth(), getHeight());
    
          g2.setPaint(FILL_PAINT);
          // avoid use of "magic" numbers
          g.fillOval(OVAL_X, OVAL_Y, getWidth() - 2 * OVAL_X, getHeight() - 2
                * OVAL_Y);
       }
    
       // a cleaner way to set the preferred size of a component
       @Override
       public Dimension getPreferredSize() {
          return new Dimension(PREF_W, PREF_H);
       }
    
       public static void main(String[] a) {
          JFrame window = new JFrame("My Better Canvas");
          window.getContentPane().add(new MyBetterStillCanvas());
          window.setLocationByPlatform(true);
          window.pack();
          window.setVisible(true);
       }
    }
    

    显示为:

    enter image description here


    教程: