2013-04-29 4 views
0

Я работаю над большим школьным проектом, и он подходит к концу. Я хочу, чтобы 2 JComboBoxes синхронизировались в разных классах (JPanels) в моей программе, и, не зная о том, как работает JComponents, я обнаружил, что сам JComboBox содержит данные, а ComboBoxModel.NotSerializableException при использовании DefaultComboBoxModel в другом классе

Итак, после добавления DefaultComboBoxModel к моему регистру (класс, который содержит все мои данные), и передав его другим моим JPANEL, он, наконец, работает.

Но теперь я получаю NotSerializable при записи моего класса Register в файл. (Я принимаю 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: Найдено, что проблема в Register НЕ, но в Salg и Administrasjon. Не могу понять, почему Тхо ...

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(); 
    } 

Почему это происходит? Я не пишу ни Salg, ни Administrasjon в файл, просто зарегистрируйтесь. Я также пробовал setModel() без везения.

Не уверен, что, если исключение означает, что угодно:

com.apple.laf.AquaComboBoxUI 

Java V.6, Mac OSX 10.8.3.

ответ

1

Для того чтобы объект был сериализован, он должен не только реализовывать Serializable, но и все члены класса также должны быть сериализуемыми. Любые поля, которые не должны быть сериализовать могут быть объявлены как transient:

private transient MyUnwrittenType type; 
+0

Хорошо, теперь моя программа является работоспособной снова Тхо все мои данные в модели теряется, и я получаю NullPointerException от других классов, призывающих к модель. Мое единственное решение для хранения объекта моделей в отдельном списке и добавление его при запуске? Спасибо. – Amiga

+0

Трудно сказать без [sccee] (http://sscce.org/). Все поля serializanbe, например 'KlippPris'? – Reimeus

+0

Да.Все объекты, которые хранятся в реестре, являются сериализуемыми, включая KlippPris, которые поддерживает DefaultComboBoxModel, и объекты, все мои связанные ссылки. Я не совсем уверен, какой еще код для публикации, но я попробую. Как я писал в тексте, проблема возникает только при представлении DefaultComboBoxModel в регистре. – Amiga

Смежные вопросы