在另一个类中使用DefaultComboBoxModel时出现NotSerializableException

时间:2013-04-29 16:18:45

标签: java notserializableexception comboboxmodel

我正在开展一项大型学校项目并且即将结束。 我希望在程序中的不同类(JPanels)中同步2个JComboBox,并且在不太了解JComponents如何工作之后我发现它不是JComboBox本身保存数据,而是ComboBoxModel。

因此,在将DefaultComboBoxModel添加到我的Register(包含我所有数据的类)并将其共享给我的其他两个JPanel之后,它终于正常工作。

但是现在我将Register-class写入文件时得到了NotSerializable。 (我一直从我的Register类中取出DefaultComboBoxModel,让所有东西重新恢复工作,所以我知道这就是问题所在。)

我在文档中可以看到,DefaultComboBoxModel实现了Serialiazble,模型所持有的对象也是如此。

public class Register implements Serializable
{
    ...
    private DefaultComboBoxModel klippPriser;

    public Register()
    {
        ...
        Object[] antTurer = { new KlippPris(5,0), new KlippPris(10,0.05), new KlippPris(15,0.10) };
        klippPriser = new DefaultComboBoxModel(antTurer);
    }

    public DefaultComboBoxModel getKlippPriser()
    {
        return klippPriser;
    }

我的猜测是,不可能将DefaultComboBoxModel用作存储对象和写入文件的列表,但我不确定如何解决它并仍使我的程序保持动态。

我希望我能清楚地解决问题。感谢。

EDIT2: 模型包含的KlippPris类。 ( ISNT THE THE BLBL

public class KlippPris implements Serializable
{
    private int antall;
    private double rabatt;

    ...
}

EDIT3: 发现Register中的问题是,而是SalgAdministrasjon。 无法弄清楚为什么......

Salg.java(Administrasjon使用相同的行。)

public class Salg extends JPanel
{
    private Register register;
    ...
    private JComboBox antTurer;

    public Salg(Register r)
    {
        super();
        register = r;
        gui();
    }

    private void gui()
    {
        ...
        paintKortkjøp();
        ...
    }

    private void paintKortkjøp()
    {
        ...
        // This line cause the exception.
        antTurer = new JComboBox(register.getKlippPriser());

        // This line dosen't cause any problems, but won't let my use my model.
        antTurer = new JComboBox();
    }

为什么会这样?我不是写SalgAdministrasjon来归档,只是寄存器。 我也试过setModel()但没有运气。

不确定异常是否意味着什么:

com.apple.laf.AquaComboBoxUI

Java v.6,Mac OSX 10.8.3。

1 个答案:

答案 0 :(得分:1)

为了对象进行序列化,它不仅必须实现Serializable,而且所有类成员也应该是可序列化的。任何不需要序列化的字段都可以声明为transient

private transient MyUnwrittenType type;