2013-04-29 39 views
0

我正在开展一个大型学校项目,它即将结束。 我想让2个JComboBoxes在我的程序中的不同类(JPanels)上同步,并且在不太了解JComponents的工作原理之后,我发现它不是保存数据的JComboBox本身,而是ComboBoxModel。在另一个类中使用DefaultComboBoxModel时的NotSerializableException

所以在将DefaultComboBoxModel添加到我的Register(容纳我所有数据的类)并将它分享给其他两个JPanel之后,它终于可以工作了。

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

我在文档中可以看到,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技术问题

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

    ... 
} 

EDIT3: 发现上述问题是在NOT 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的第6节,Mac OSX版10.8.3。

回答

1

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

private transient MyUnwrittenType type; 
+0

好了,现在我的计划是可运行再次,寿我的模型中的所有数据都将丢失,我从其他类呼吁得到NullPointerException异常模型。 那么,我唯一的解决方案将模型对象存储在一个单独的列表中,并在开始时添加它们? 谢谢。 – Amiga 2013-04-29 16:33:59

+0

如果没有[sccee](http://sscce.org/),很难说清楚。是否所有字段serializanbe,例如'KlippPris'? – Reimeus 2013-04-29 16:37:23

+0

是的。Register寄存器保存的所有对象都是可序列化的,包括DefaultComboBoxModel保存的KlippPris和所有LinkedLists保存的对象。我不确定发布什么更多的代码,但我会试一试。 正如我在文中写的,问题只发生在我在Register中引入DefaultComboBoxModel时。 – Amiga 2013-04-29 16:47:16