Java JFrame 代码给出空指针异常
Java JFrame code giving Null Pointer Exception
所以我遇到的问题与我的 JFrame 有关。首先我要post我的代码在这里然后解释问题。
package evenMoreTesting;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.InputMap;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
public class MyKeyBindings {
static int x1=0,x2=0,x3=0;
static JFrame frame;
public static void main(String[] args) {
//JFrame frame = new JFrame();
//some kind of problem when im calling JFrame out of the main class
frame.setTitle("we still testing");
frame.setSize(750, 500);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
Action a1 = new AbstractAction() {
public void actionPerformed(ActionEvent AE){
x1 +=1;
Action a2 = new AbstractAction() {
public void actionPerformed(ActionEvent AE){
x2 +=1;
Action a3 = new AbstractAction() {
public void actionPerformed(ActionEvent AE){
x3 +=1;
if(x3==1){
System.out.println("you wot");
}
if(x3==2){
System.out.println("m8");
}
}
};
if(x2==1){
System.out.println("dude");
}
if(x2==2){
System.out.println("stop");
}
if(x1==3 && x2==4){
System.out.println("woah you broke the goddamn system");
}
//this game will be sensitive to how many clicks have happened
//and it doesnt work unless i call the above code in this action
//the a3 action will be in here just like a2 is in a1
JPanel content = (JPanel) frame.getContentPane();
KeyStroke three = KeyStroke.getKeyStroke("3");
InputMap IM = content.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
IM.put(three, "x3++");
content.getActionMap().put("x3++", a3);
}
};
JPanel content = (JPanel) frame.getContentPane();
KeyStroke two = KeyStroke.getKeyStroke("2");
InputMap IM = content.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
IM.put(two, "x2++");
content.getActionMap().put("x2++",a2);
if(x1==1){
System.out.println("ok");
}
if(x1==2){
System.out.println("cool");
}
}
};
JPanel content = (JPanel) frame.getContentPane();
KeyStroke one = KeyStroke.getKeyStroke("1");
InputMap IM = content.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
IM.put(one, "x1++");
content.getActionMap().put("x1++", a1);
}
}
所以问题是当我在 main 方法之外调用 JFrame 时出现此错误:
线程异常 "main" java.lang.NullPointerException
在 evenMoreTesting.MyKeyBindings.main(MyKeyBindings.java:27)
第 27 行是这样的:
frame.setTitle("we still testing");
其实前几天还没有这个问题,不知道怎么现在才开始异常
我决定将其注释掉,看看这是不是唯一的问题。我这样做了,但仍然有错误,但这次是在第 28 行,所以我注释掉了第 28 行,然后错误出现在第 29 行,其余带有框架的代码也发生了这种情况。
现在你可能会说,把 JFrame 放在 main 方法中就行了,但它需要在 main 方法之外是有原因的。
在我的操作中,我将调用 JFrame 将图像显示在屏幕上。当 JFrame 在主要方法中时,据我所知,它仅限于该方法。
所以我决定在主体外部调用 JFrame,这样操作也可以访问它。这就是我将图像调用到屏幕上的方式,供任何感兴趣的人使用或是否有助于解决此问题。
frame.add(new JLabel(new ImageIcon("frames/img01.jpg")));
Frames 是源文件夹,img01 是我在屏幕上的第一张图片
如果有其他方法可以将图像绘制到屏幕上,请告知。
简而言之,我的问题是,为什么在 main 方法外调用 JFrame 时会出现空指针异常,我该如何防止它。
提前致谢!
编辑:-
在这里,只需调用此方法 showImage("c:/image.png");
并将路径传递给您的图像,它将创建一个 JFrame 并从该路径加载您的图像并将其显示给您:-
// the imports required
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.*;
import java.awt.*;
//paste this method in your class and call it when you want to display image
public void showImage(String path_to_image)
{
JFrame frame = new JFrame("Image");
frame.setLayout(new BorderLayout());
frame.setResizable(false);
ImageIcon myImage = new ImageIcon(path_to_image);
frame.getContentPane().add(new JLabel(myImage));
frame.pack();
frame.setVisible(true);
}
或
在您的主添加 frame = new JFrame();
中,因为您还没有创建它的新实例,因此您在将组件添加到框架的空值时收到空指针异常
如果您创建一个非原始 class 字段(参考)并且不对其进行初始化,那么默认情况下它将被初始化为 null
。
执行以下操作之一
取消注释以下行
//JFrame frame = new JFrame();
并删除以下行
static JFrame frame;
或
更新下一行
static JFrame frame;
到
static JFrame frame = new JFrame();
所以我遇到的问题与我的 JFrame 有关。首先我要post我的代码在这里然后解释问题。
package evenMoreTesting;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.InputMap;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
public class MyKeyBindings {
static int x1=0,x2=0,x3=0;
static JFrame frame;
public static void main(String[] args) {
//JFrame frame = new JFrame();
//some kind of problem when im calling JFrame out of the main class
frame.setTitle("we still testing");
frame.setSize(750, 500);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
Action a1 = new AbstractAction() {
public void actionPerformed(ActionEvent AE){
x1 +=1;
Action a2 = new AbstractAction() {
public void actionPerformed(ActionEvent AE){
x2 +=1;
Action a3 = new AbstractAction() {
public void actionPerformed(ActionEvent AE){
x3 +=1;
if(x3==1){
System.out.println("you wot");
}
if(x3==2){
System.out.println("m8");
}
}
};
if(x2==1){
System.out.println("dude");
}
if(x2==2){
System.out.println("stop");
}
if(x1==3 && x2==4){
System.out.println("woah you broke the goddamn system");
}
//this game will be sensitive to how many clicks have happened
//and it doesnt work unless i call the above code in this action
//the a3 action will be in here just like a2 is in a1
JPanel content = (JPanel) frame.getContentPane();
KeyStroke three = KeyStroke.getKeyStroke("3");
InputMap IM = content.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
IM.put(three, "x3++");
content.getActionMap().put("x3++", a3);
}
};
JPanel content = (JPanel) frame.getContentPane();
KeyStroke two = KeyStroke.getKeyStroke("2");
InputMap IM = content.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
IM.put(two, "x2++");
content.getActionMap().put("x2++",a2);
if(x1==1){
System.out.println("ok");
}
if(x1==2){
System.out.println("cool");
}
}
};
JPanel content = (JPanel) frame.getContentPane();
KeyStroke one = KeyStroke.getKeyStroke("1");
InputMap IM = content.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
IM.put(one, "x1++");
content.getActionMap().put("x1++", a1);
}
}
所以问题是当我在 main 方法之外调用 JFrame 时出现此错误:
线程异常 "main" java.lang.NullPointerException 在 evenMoreTesting.MyKeyBindings.main(MyKeyBindings.java:27)
第 27 行是这样的:
frame.setTitle("we still testing");
其实前几天还没有这个问题,不知道怎么现在才开始异常
我决定将其注释掉,看看这是不是唯一的问题。我这样做了,但仍然有错误,但这次是在第 28 行,所以我注释掉了第 28 行,然后错误出现在第 29 行,其余带有框架的代码也发生了这种情况。
现在你可能会说,把 JFrame 放在 main 方法中就行了,但它需要在 main 方法之外是有原因的。
在我的操作中,我将调用 JFrame 将图像显示在屏幕上。当 JFrame 在主要方法中时,据我所知,它仅限于该方法。
所以我决定在主体外部调用 JFrame,这样操作也可以访问它。这就是我将图像调用到屏幕上的方式,供任何感兴趣的人使用或是否有助于解决此问题。
frame.add(new JLabel(new ImageIcon("frames/img01.jpg")));
Frames 是源文件夹,img01 是我在屏幕上的第一张图片
如果有其他方法可以将图像绘制到屏幕上,请告知。
简而言之,我的问题是,为什么在 main 方法外调用 JFrame 时会出现空指针异常,我该如何防止它。
提前致谢!
编辑:-
在这里,只需调用此方法 showImage("c:/image.png");
并将路径传递给您的图像,它将创建一个 JFrame 并从该路径加载您的图像并将其显示给您:-
// the imports required
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.*;
import java.awt.*;
//paste this method in your class and call it when you want to display image
public void showImage(String path_to_image)
{
JFrame frame = new JFrame("Image");
frame.setLayout(new BorderLayout());
frame.setResizable(false);
ImageIcon myImage = new ImageIcon(path_to_image);
frame.getContentPane().add(new JLabel(myImage));
frame.pack();
frame.setVisible(true);
}
或
在您的主添加 frame = new JFrame();
中,因为您还没有创建它的新实例,因此您在将组件添加到框架的空值时收到空指针异常
如果您创建一个非原始 class 字段(参考)并且不对其进行初始化,那么默认情况下它将被初始化为 null
。
执行以下操作之一
取消注释以下行
//JFrame frame = new JFrame();
并删除以下行
static JFrame frame;
或
更新下一行
static JFrame frame;
到
static JFrame frame = new JFrame();