Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“线程中的异常”;AWT-EventQueue-1“;java.lang.NullPointerException错误_Java_Swing_Nullpointerexception_Japplet - Fatal编程技术网

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

“线程中的异常”;AWT-EventQueue-1“;java.lang.NullPointerException错误,java,swing,nullpointerexception,japplet,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);. 我的代

我对任何种类或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);
    }
}//测试类

您声明:

这条线是一个简单的g.setColor(Color.yellow)

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

private Graphics g = null;
然后在它上面调用一个方法,所以你得到一个NPE并不令人惊讶

解决方案:

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

  • 您最好创建Swing GUI而不是AWT GUI,除非您必须为类创建AWT小程序
  • 您似乎试图在AWT小程序中创建一个Swing JFrame,但这实际上毫无意义。这段不同寻常的代码背后的动机是什么
  • 如果您的目的是创建一个Swing GUI,那么就不要让类扩展Applet,也不要使用paint方法
  • 如果是Swing,那么您应该有一个扩展JPanel的类,覆盖它的
    paintComponent(Graphics g)
    方法并在那里进行所有绘制
  • 在JLabel或JTextArea等JTextComponent中显示文本通常更容易。
编辑
你在评论中说


谢谢你的建议,我真的不知道我在做什么,但是我想在画法之外使用图形类,不管怎样,我能做到还是不可能做到

这是可能的,但需要技巧

  • 您可以从BuffereImage中获取图形对象并在其上绘制
  • 但是你仍然需要在你的画作中画出BuffereImage(或者更好的是,一个JPanel的
    paintComponent(Graphics g)
    方法)
  • 同样,如果您只是发布文本,最好不要使用图形对象,而是使用诸如JLabel、JTextField、JTextArea或类似的组件
  • 有关Swing图形使用的简单教程,请参见:
  • 可在此处找到更深入的文章:

编辑2
下一条评论:

因此,我有一个基本的介绍屏幕,我想做的是当用户点击其中一个按钮时,它会将他们带到另一个屏幕。我一直在尝试使用一种方法来实现这一点

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

在点击按钮后发送到的屏幕上有需要的图形,这就是为什么我尝试引入图形类


同样,您可以使用CardLayout,将JPanel从简介JPanel交换到显示JPanel,并在显示JPanel的
画图组件(graphics g)中绘制图形
method override.

不介意-1票,但如果你要这样做,至少要发表评论或给出更好的答案。如果事实上更好,我甚至会投你一票。好吧,在小程序中使用Swing来歪曲OP是不公平的。Swing组件是AWT的后代。如果你使用的是小程序,正如你所注意的,默认情况下你是使用面板,但OP说他是Java新手。你可能想在小程序中使用Swing来跨平台使用标准LnF。像这样使用Swing并不疯狂。编辑:-1次投票是错误的。应该是向上投票。对不起!谢谢你的建议,我真的不知道我在做什么,但我想在“绘制我”之外使用图形类thod我到底有没有能力做到这一点impossible@mttdbrd:我不是在歪曲事实,而是注意到这是一个奇怪的代码,并要求提供证明。但是,不管你怎么说,这有点不好。1)如果你要编写Swing小程序,请编写JApplet,而不是小程序,不要创建JFrame,它适用于非applet独立GUI。2) 如果您确实需要一个与JApplet关联的额外窗口,那么它应该是JDialog。3) 上述代码具有误导性。因为它实际上是在创建一个JFrame,所以paint方法什么也不做。“想在paint方法之外使用图形类”paint to a
BufferedImage
。在
JLabel
中显示它。更改时,调用
label.repaint()
。1)为什么要编写小程序?如果是由于老师的特殊要求,请参考。2) 为什么是AWT而不是Swing?关于放弃使用AWT组件的许多好理由,请参见我的答案。Java GUI可能必须在多种平台上工作,使用不同的屏幕分辨率&使用不同的PLAF。因此,它们不利于部件的精确放置。要为健壮的GUI组织组件,请改为使用布局管理器,或者与布局填充和边框一起使用。