线程“AWT-EventQueue-1”中的异常java.lang.NullPointerException错误

时间:2014-01-17 01:21:27

标签: java swing nullpointerexception japplet

我对任何类型或applet编程都是全新的,我的代码非常粗糙。目前我正在制作一个小应用程序,让您可以根据他们所在的大陆了解不同的国家。这是非常简单的东西,但我仍在努力。目前我收到错误

线程“AWT-EventQueue-1”中的异常java.lang.NullPointerException

at Culminating1.instructions1(Culminating1.java:69). This line is a simple g.setColor(Color.yellow);.

我的代码非常粗糙,需要大量的工作才能获得任何帮助。

这是我的其余代码。非常感谢!

import java.applet.*;
import java.awt.*;
import javax.swing.*;
import javax.swing.JComponent;
import java.awt.Color.*;

public class Culminating1 extends Applet {

    private Image world, destination, globetrot, rice;

    private Button africa, americas, asia, europe, instructions, japan, china, qatar, uae,   thailand;
 private Graphics g = null;

    public void init() {

        this.setLayout(null);
        asia = new Button("Asia");
        africa = new Button("Africa");
        europe = new Button("Europe");
        americas = new Button("Americas");
        instructions = new Button("Instructions");
        add(asia);
        asia.setBounds(10, 120, 65, 25);
        add(africa);
        africa.setBounds(10, 190, 65, 25);
        add(americas);
        americas.setBounds(10, 260, 65, 25);
        europe.setBounds(10, 330, 65, 25);
        add(europe);
        instructions.setBounds(10, 410, 65, 25);

        add(instructions);
        world = getImage(getCodeBase(), "world.gif");
        destination = getImage(getCodeBase(), "Destination2.png");
        globetrot = getImage(getCodeBase(), "GlobeTrot.png");

    } // init method

     @Override
     public void paint(Graphics g)  
    {

        g.setColor(Color.orange);
        g.fillRect(0, 0, 1000, 1000);
        g.drawImage(world, 200, 100, 300, 300, this);
        g.drawImage(destination, 150, 425, 450, 80, this);
        g.drawImage(globetrot, 150, 10, 450, 80, this);

    } // paint method

    @Override
    public boolean action(Event e, Object o) {
        if (e.target == instructions) {
            instructions1();
        } else if (e.target == asia) {
            asia();
        }
        return false;
    }

     public void instructions1() {
        JFrame jp1 = new JFrame();
        Culminating1 a=new Culminating1 ();
        jp1.getContentPane().add(a, BorderLayout.CENTER);
        jp1.setSize(new Dimension(500,500));
        jp1.setVisible(true);

        g.setColor(Color.yellow);
        g.fillRect(0, 0, 1000, 1000);
        Font f;
        f = new Font("Broadway", Font.PLAIN, 20);
        g.setFont(f);
        g.setColor (Color.black);
        g.drawString("Welcome to Globe Trot!", 200, 20);
        g.drawString("In this game you will learn about countries around the world.", 200, 40);
        g.drawString("First choose an area of the world,", 200, 80);
        g.drawString("then at random a well known landscape will appear.", 200, 120);
        g.drawString("Your goal is to guess the country where the landscape is from.", 200, 160);
        g.drawString("If you are unable to guess after 10 seconds a flag will appear", 200, 200);
        g.drawString("from the same country. You have one minute to guess the country", 200, 240);
        g.drawString("before you move onto the next country. There are five in total", 200, 280);
    }

} //测试类

1 个答案:

答案 0 :(得分:2)

你说:

  

这一行是一个简单的g.setColor(Color.yellow);。

没什么简单的。您在此行上将g设置为null:

private Graphics g = null;

然后在它上面调用一个方法,所以你得到一个NPE就不足为奇了。

解决方案:

  • 不要在设置为null的变量上调用方法。
  • 特别是对于Graphics对象,除了从图像中提取图形对象(例如使用BufferedImages)之外,不要在绘制方法之外使用它。
  • paint方法的Graphics参数是一个参数变量,因此其范围仅限于该方法。它对您正在使用的g字段没有影响,实际上阴影字段。

此外:

  • 你最好创建Swing GUI而不是AWT GUI,除非你绝对必须为一个类创建AWT Applets。
  • 您似乎试图在AWT Applet中创建一个真正没有意义的Swing JFrame。这段非常不寻常的代码背后的动机是什么?
  • 如果你的目的是创建一个Swing GUI,那么就不要让你的类扩展Applet,也没有绘制方法。
  • 如果是Swing,那么你应该有一个扩展JPanel并覆盖其paintComponent(Graphics g)方法的类,并在那里进行绘制。
  • 在JLabel或JTextComponent(如JTextArea)中显示文本通常更容易。

修改
你在评论中说明了

  

感谢您的建议我真的不知道我在做什么,但是我想在paint方法之外使用图形类,无论如何我能够做到这一点或者是不可能的。

这是可能的,但需要技巧。

  • 你可以从BufferedImage获取Graphics对象并在其上绘图,
  • 但是你仍然需要在你的绘画中绘制BufferedImage(或者再次,更好,一个JPanel的paintComponent(Graphics g)方法。
  • 同样,如果您只是发布文本,最好不要使用Graphics对象,而是使用JLabel,JTextField,JTextArea等组件。
  • 有关使用Swing Graphics的简单教程,请访问:Lesson: Performing Custom Painting
  • 可以在此处找到更深入的文章:Painting in AWT and Swing

编辑2
下一条评论:

  

所以我所拥有的是一个基本的介绍屏幕,我想要做的是当用户点击其中一个按钮将它们带到另一个屏幕时。我一直试图用一种方法来做到这一点。

我认为最好是在文本组件中交换文本,或者使用CardLayout交换JPanel。

  

在单击按钮后发送到的屏幕上需要图形,这就是我试图引入图形类的原因。

再次,您可以使用CardLayout,将JPanel中的JPanels交换到显示JPanel,并在显示JPanel的paintComponent(Graphics g)方法覆盖中执行您的图形。