“线程中的异常”;AWT-EventQueue-1“;java.lang.NullPointerException错误
我对任何种类或applet编程都是全新的,我的代码非常粗糙。目前,我正在制作一个小程序,让你了解不同国家的基础上,他们在什么大陆。这真的很简单,但我仍在努力。目前我收到的错误 线程“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);. 我的代
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 aBufferedImage
。在JLabel
中显示它。更改时,调用label.repaint()
。1)为什么要编写小程序?如果是由于老师的特殊要求,请参考。2) 为什么是AWT而不是Swing?关于放弃使用AWT组件的许多好理由,请参见我的答案。Java GUI可能必须在多种平台上工作,使用不同的屏幕分辨率&使用不同的PLAF。因此,它们不利于部件的精确放置。要为健壮的GUI组织组件,请改为使用布局管理器,或者与布局填充和边框一起使用。