1

我希望序列化一个显示带有 JScrollBar 的 JFrame 的类。程序保存和加载正常,除非 JScrollBar 变得可见,此时我得到以下异常:

线程“AWT-EventQueue-0”java.lang.NullPointerException 中的异常:无法调用“javax.swing.JScrollPane.getViewportBorder()”,因为“this.scrollpane”为空

当我收到此异常时,程序随后无法正确加载。

我已经尽可能地减少了我的代码以隔离问题,现在我被卡住了。我所知道的是,如果我在 run() 方法中声明 JFrame,我必须用 frame.setVisible(true) 替换 backgroundPanel.repaint() 并且一切正常。但是我需要在完整程序的 run() 方法之外访问 JFrame。我发现的唯一另一件事是,即使在 JScrollBar 本身变得可见之前,JScrollBar 的 getViewportBorder() 方法也会返回 null,尽管只有在栏变得可见时序列化才会失败。

这是有问题的代码:

import java.io.*;
import java.lang.Runnable;
import javax.swing.*;

class GameLauncher implements Runnable, Serializable {

    public static void main(String[] args) {
        new Thread(new GameLauncher()).start();
    }

    JFrame frame;
    public void run() {
        frame = new JFrame("Frame");
        JPanel backgroundPanel = new JPanel();
        JScrollPane scrollPane = new JScrollPane();
        scrollPane.setViewportView(backgroundPanel);
        frame.add(scrollPane);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(100, 100);
        frame.setVisible(true);
        for (int i = 0; i < 3; i++) {
            backgroundPanel.add(new JLabel("Text"));
            backgroundPanel.repaint();
            saveFile();
        }
    }

    private void saveFile() {
        try {
            ObjectOutputStream objectOut = new ObjectOutputStream(new FileOutputStream(new File("save.ser")));
            objectOut.writeObject(this);
            objectOut.close();
            System.out.println("File saved");
        }
        catch(IOException ex) {
            System.out.println("File not saved");
            ex.printStackTrace();
        }
    }
}

编辑:我意识到我的问题不清楚。保存文件时出现错误,而不是加载文件时出现错误。如果在保存过程中发生错误,它只是无法正确加载。

4

0 回答 0