无法加载已保存的JButton

时间:2014-02-12 18:18:32

标签: 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的文件。问题是,当我在这里使用加载方法时:

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

        buttonsClass = (Buttons) ois.readObject();

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

在创建Buttons的新对象并保存之后,我在尝试调用buttonsClass.getButton(0);时得到nullPointerException,这意味着在保存类时不会保存JButtons。

任何理由为什么,以及任何想法如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

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

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