java - 无法加载已保存的 JButton

标签 java swing serialization nullpointerexception jbutton

我正在编写一个程序,将 JButton 数组保存到文件 .btn 中。这是正在保存的代码:

package avtech.software.compunav;

import java.io.File;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

import javax.swing.JButton;

public class Buttons implements Serializable {
public static Button[] buttons = new Button[15];

public Buttons() {
    for (int i = 0; i < buttons.length; i++) {
        buttons[i] = new Button();
        buttons[i].setText("Unassigned");
    }
}

public JButton[] getButtons() {
    return buttons;
}

public JButton getButton(int index) {
    return buttons[index];
}

public void setButtonText(String txt, int index) {
    buttons[index].setText(txt);
}

public void setButtonAction(String action, int index) {

}

public void save() {
    try {
        File dir = new File(Core.baseDir + "/bin/buttons.btn");

        FileOutputStream fos = new FileOutputStream(dir);
        ObjectOutputStream oos = new ObjectOutputStream(fos);

        if (dir.exists())
            dir.delete();

        oos.writeObject(this);

        oos.flush();
        oos.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}
}

Button 是一个扩展 JButton 的类,代码如下:

 package avtech.software.compunav;

 import java.awt.Desktop;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.io.File;
 import java.io.IOException;

 import javax.swing.JButton;

 import CompuNav.main.Dialogs;

 public class Button extends JButton implements ActionListener {

private String action = "";

public Button() {
    addActionListener(this);
}

public void setAction(String s) {
    action = s;
}

@Override
public void actionPerformed(ActionEvent arg0) {
    if (action.equals(""))
        return;

    File file = new File(action);
    Desktop dt = Desktop.getDesktop();

    try {
        dt.open(file);
    } catch (IOException e1) {
        Dialogs.msg("Could not open " + action);
    }
}

 }

基本上,代码正在保存。正确的目录中有一个名为 Buttons.btn 的文件。问题是,当我在这里使用 load 方法时:

 try {
        FileInputStream fis = new FileInputStream(baseDir
                + "/bin/buttons.btn");
        ObjectInputStream ois = new ObjectInputStream(fis);

        buttonsClass = (Buttons) ois.readObject();

        ois.close();
    } catch (Exception e) {}

创建新的 Button 对象并保存后,尝试调用 buttonsClass.getButton(0); 时出现 nullPointerException,这意味着当我保存类时 JButton 未保存.

有什么原因吗?知道如何解决这个问题吗?

最佳答案

public static Button[] buttons = new Button[15];

如果您希望序列化该变量,则该变量不应是静态的。

关于java - 无法加载已保存的 JButton,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21736293/

相关文章:

java - 将 SOAP 客户端与 Axis 重用

java - 如何强制 Java 在实例化时重新加载类?

java - Eclipse 的 UML 插件 - 类图和 Java 代码生成 - Indigo/Juno

java - 最大化和防止调整 JFrame 的大小?

java - 通过每个项目的乐观锁定有效地将结果流存储在多个表中

java - 将 java JTable 的多个部分打印到单个页面

java - 在 JFrame 中绘制矩形不起作用

serialization - 在 React Native 中将 boolean 值存储/保存在 AsyncStorage 中

javascript - 如何附加图像序列化?

ruby-on-rails - 如何序列化和反序列化邮件程序?