gpt4 book ai didi

java JFrame 给我 java.lang.NullPointerException 我不知道为什么

转载 作者:行者123 更新时间:2023-11-30 08:19:55 26 4
gpt4 key购买 nike

在您将此帖子标记为重复和引用之前 What is a NullPointerException, and how do I fix it? ,我已经读过并且(我对 Java 还是新手,可能无法正确理解这一点)似乎看不出这与我的错误有何联系。

我正在尝试处理一个 java swing JFrame 并在它的位置加载另一个并让它工作。即使它完全符合我的要求,它仍然给我 java.lang.NullPointerException 错误。据我所知,与错误相关的代码正在按我希望的方式运行。

这是我的相关代码。如果您需要我包含任何其他我认为没有必要的代码,请告诉我,我会进行编辑。

编辑

我删除了所有以前的代码并为您添加了 mcve 代码。

package test;

public final class Test {

private static GUI1 gui1;
private static GUI2 gui2;

public static void main(String[] args) {
startGUI1();
}

public static void startGUI1() {
gui1 = new GUI1();
}

public static GUI1 getGUI1() {
return gui1;
}

public static void startGUI2() {
gui2 = new GUI2();
}

public static GUI2 getGUI2() {
return gui2;
}
}

打包测试;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class GUI1 {

JFrame frame;

public GUI1() {
frame = new JFrame();

frame.setVisible(true);
frame.setSize(500, 500);
frame.setLocationRelativeTo(null);
frame.add(new Pane());
}

public class Pane extends JComponent {

public Pane() {
try {
Scanner read = new Scanner(new File("user.txt"));

if (read.nextInt() != 0) {
test.Test.startGUI2();
test.Test.getGUI1().frame.dispose();
}
} catch (FileNotFoundException ex) {
Logger.getLogger(GUI1.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}

打包测试;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class GUI2 {

JFrame frame;

public GUI2() {
frame = new JFrame();

frame.setVisible(true);
frame.setSize(500, 500);
frame.setLocationRelativeTo(null);
frame.add(new Pane());
}

public class Pane extends JComponent {

JLabel label = new JLabel("GUI2");
JButton button = new JButton("Start Gui1");

public Pane() {
}

@Override
protected void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g;

g2d.setColor(new Color(5, 5, 5));
g2d.fillRect(0, 0, getWidth(), getHeight());

g2d.setStroke(new BasicStroke(5.0F));
}
}
}

这会产生同样的错误

最佳答案

不,您的问题不是 JFrame 为空,而是您的 Test.gui1 变量为空。我在您的代码中添加了一行以对其进行测试:

  public Pane() {
try {
Scanner read = new Scanner(new File("user.txt"));

if (read.nextInt() != 0) {
Test.startGUI2();

// ********** two lines below added ******
System.out.println("gui1 null? " + (Test.getGUI1() == null));
System.out.println("frame null? " + (frame == null));

Test.getGUI1().frame.dispose();
}
} catch (FileNotFoundException ex) {
Logger.getLogger(GUI1.class.getName()).log(Level.SEVERE, null, ex);
}

这将返回:

gui1 null? true
frame null? false

您试图在 gui1 GUI1 对象其构造函数完成之前调用方法,这是一件危险的事情。

但同样,最终的解决方案可能会有所不同,并且取决于您要实现的目标。如果您的目标是交换 View ,那么我支持 Andrew Thompson——您应该使用 CardLayout 来切换 JPanel View 。


另一种测试我是否正确的方法是,看看如果我们在 GUI1 构造函数中调用您的帧交换代码会发生什么,以及通过使用 SwingUtilities.invokeLater(可运行)。在下面的代码中,尝试使用不同的 CREATE_ERROR boolean 值运行它。

换句话说,运行一次

public static final boolean CREATE_ERROR = true; 

然后用

再次运行它
public static final boolean CREATE_ERROR = false; 

看看会发生什么

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;

public class TestA {
private static GUI1A gui1;
private static GUI2A gui2;

public static void main(String[] args) {
startGUI1();
}

public static void startGUI1() {
gui1 = new GUI1A();
}

public static GUI1A getGUI1() {
return gui1;
}

public static void startGUI2() {
gui2 = new GUI2A();
}

public static GUI2A getGUI2() {
return gui2;
}
}

class GUI1A {
public static final boolean CREATE_ERROR = true;
private JFrame frame1 = new JFrame("Frame 1");

public GUI1A() {
frame1.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame1.add(new JLabel("This is Frame 1"));
frame1.pack();
frame1.setLocationByPlatform(true);
frame1.setVisible(true);

SwingUtilities.invokeLater(new Runnable() {
public void run() {
if (!CREATE_ERROR) {
swapFrames();
}
}
});
if (CREATE_ERROR) {
swapFrames();
}
}

private void swapFrames() {
TestA.startGUI2();

System.out.println("GUI1 is null: " + (TestA.getGUI1() == null));
System.out.println("frame1 is null: " + (frame1 == null));

TestA.getGUI1().getFrame().dispose();
}

public JFrame getFrame() {
return frame1;
}
}

class GUI2A {
private JFrame frame2 = new JFrame("Frame 2");

public GUI2A() {
frame2.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame2.add(new JLabel("This is Frame 2"));
frame2.pack();
frame2.setLocationByPlatform(true);
frame2.setVisible(true);
}
}

作为旁注,我很少如果曾经像那样交换 JFrames(不要认为我曾经做过它来想到它),尽管我已经显示了单独的对话框窗口。此外,我会注意从 EDT 读取所有文件。例如,要获取您的代码,我会使用 SwingWorker:

private class ButtonAction extends AbstractAction {
public ButtonAction(String name) {
super(name);
}

@Override
public void actionPerformed(ActionEvent e) {
final MyWorker myWorker = new MyWorker();
myWorker.addPropertyChangeListener(new PropertyChangeListener() {

@Override
public void propertyChange(PropertyChangeEvent evt) {
if (evt.getNewValue() == SwingWorker.StateValue.DONE) {
try {
int result = myWorker.get().intValue();
if (result != 0) {
TestB.startGUI2();
System.out.println("gui1 null? " + (TestB.getGUI1() == null));
System.out.println("frame null? " + (frame == null));

TestB.getGUI1().frame.dispose();
}
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
}
});
myWorker.execute();
}
}

private class MyWorker extends SwingWorker<Integer, Void> {
@Override
protected Integer doInBackground() throws Exception {
int result = 0;
Scanner read = null;
try {
read = new Scanner(new File(USER_FILE_PATH));
result = read.nextInt();
} catch (FileNotFoundException ex) {
Logger.getLogger(GUI1B.class.getName()).log(Level.SEVERE, null, ex);
} finally {
if (read != null) {
read.close();
}
}
return result;
}
}

关键时候gui1为null的具体原因是因为给它赋值一个对象,gui1 = new GUI1();直到GUI1的构造函数完成才发生。

关于java JFrame 给我 java.lang.NullPointerException 我不知道为什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26453520/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com