Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сериализация Объектов 
:(
    Опции темы
RTV
Дата 18.11.2016, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 11.4.2006
Где: Днепропетровск

Репутация: нет
Всего: нет



Доброго времени суток.
Прошу помощи в сериализации. В учебных целях был создан секвенсор, хочу сохранить отмеченные CheckBox но при сохранении в файл пишутся все значения null Что я делаю не так ? 


Код

import javax.sound.midi.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
//import java.awt.event.ActionEvent;
//import java.awt.event.ActionListener;
import java.io.FileOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.io.*;


/**
 * Created by Admin on 08.11.2016.
 */
public class BeatBox implements Serializable {
    JPanel mainPanel;
    ArrayList<JCheckBox> checkboxList;
    Sequencer sequencer;
    Sequence sequence;
    Track track;
    JFrame theFrame;

    String[] instrumentNames = {"Bas Drum", "Closed Hi-Hat", "Opend Hi-Hat", "Acoustic Snare", "Crash Symbal",
                                "Hand Clap", "High Tom", "High Bongo","Maracas", "Whistle", "Low Conga", "Cowbell",
                                "Vibraslap", "Low-mid Tom", "High Agogo", "Open High Conga"};
    int[] instruments = {11,42,46,38,49,39,50,60,70,72,64,56,58,47,67,63};

    public static void main (String[] args){
        new BeatBox().BuildGUI();
    }

    public void BuildGUI() {
        theFrame = new JFrame("Cyber Beat Box");
        theFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        BorderLayout layout = new BorderLayout();
        JPanel background = new JPanel(layout);
        background.setBorder(BorderFactory.createEmptyBorder(10,10,10,10));

        checkboxList = new ArrayList<JCheckBox>();

        Box buttonBox = new Box(BoxLayout.Y_AXIS);

        JButton start = new JButton("Start");
        start.addActionListener(new MyStartListener());
        buttonBox.add(start);

        JButton stop = new JButton("Stop");
        stop.addActionListener(new MyStopListener());
        buttonBox.add(stop);

        JButton upTempo = new JButton("Tempo up");
        upTempo.addActionListener(new MyUpTempoListener());
        buttonBox.add(upTempo);

        JButton downTempo = new JButton("Tempo down");
        downTempo.addActionListener(new MyDownTempoListener());
        buttonBox.add(downTempo);

        JButton Save = new JButton("Save");
        Save.addActionListener(new MySaveToFile());
        buttonBox.add(Save);

        JButton Load = new JButton("Load");
        Load.addActionListener(new MyLoadfromFile());
        buttonBox.add(Load);


        Box nameBox = new Box(BoxLayout.Y_AXIS);
        for (int i = 0; i < 16; i++){
            nameBox.add(new Label(instrumentNames[i]));
        }
        background.add(BorderLayout.EAST,buttonBox);
        background.add(BorderLayout.WEST,nameBox);

        theFrame.getContentPane().add(background);

        GridLayout grid = new GridLayout(16,16);
        grid.setVgap(1);
        grid.setHgap(2);
        mainPanel = new JPanel(grid);

        background.add(BorderLayout.CENTER,mainPanel);

        for (int i = 0; i < 256; i++){
            JCheckBox c = new JCheckBox();
            c.setSelected(false);
            checkboxList.add(c);
            mainPanel.add(c);
        }

        setUpMidi();

        theFrame.setBounds(10,10,300,300);
        theFrame.pack();
        theFrame.setVisible(true);
    }

    public void setUpMidi(){
        try{
            sequencer = MidiSystem.getSequencer();
            sequencer.open();
            sequence = new Sequence(Sequence.PPQ,4);
            track = sequence.createTrack();
            sequencer.setTempoInBPM(120);
        }catch(Exception e){e.printStackTrace();}
    }

    public void buildTrackAndStart(){
        int[] trackList = null;
        sequence.deleteTrack(track);
        track = sequence.createTrack();

        for (int i = 0; i < 16; i++){
            trackList = new int[16];
            int key =instruments[i];
            for (int j = 0; j < 16; j++){
                JCheckBox jc = (JCheckBox) checkboxList.get(j + (16 * i));
                if (jc.isSelected()){
                    trackList[j]=key;
                }else {
                    trackList[j]=0;
                }
            }

            MakeTracks(trackList);
            track.add(makeEvent(176,1,127,0,16));
        }
        track.add(makeEvent(192,9,1,0,15));
        try{
            sequencer.setSequence(sequence);
            sequencer.setLoopCount(sequencer.LOOP_CONTINUOUSLY);
            sequencer.start();
            sequencer.setTempoInBPM(120);
        }catch(Exception e){e.printStackTrace();}
    }

    public class MyStartListener implements ActionListener{
        public void actionPerformed(ActionEvent a){
            buildTrackAndStart();
        }
    }

    public class MyStopListener implements ActionListener{
        public void actionPerformed(ActionEvent a){
            sequencer.stop();
        }
    }

    public class MyUpTempoListener implements ActionListener{
        public void actionPerformed(ActionEvent a){
            float temmpoFactor = sequencer.getTempoFactor();
            sequencer.setTempoFactor((float)(temmpoFactor * 1.03));
        }
    }

    public class MyDownTempoListener implements ActionListener{
        public void actionPerformed(ActionEvent a){
            float tempoFactor = sequencer.getTempoFactor();
            sequencer.setTempoFactor((float)(tempoFactor *.97));
        }
    }

    public class MySaveToFile implements ActionListener{
        public void actionPerformed(ActionEvent a){
            try{
                //BeatBox MyBeatBox = new BeatBox();

                ObjectOutputStream os = new ObjectOutputStream( new FileOutputStream("Musicfile.ser"));
                os.writeObject(new BeatBox());
                os.close();
            }catch(Exception e){e.printStackTrace();}
        }
    }

    public class MyLoadfromFile implements ActionListener{
        public void actionPerformed(ActionEvent a){
            try{
//                ObjectInputStream oi = new ObjectInputStream(new FileInputStream("Musicfile.ser"));
//                checkboxList MycheckboxList =  (checkboxList) oi.readObject();
            }catch(Exception e){e.printStackTrace();}
        }
    }

    public void MakeTracks(int[] list){
        for (int i = 0; i < 16; i++){
            int key = list[i];
            if (key != 0){
                track.add(makeEvent(144,8,key,100,i));
                track.add(makeEvent(128,9,key,100,i+1));
            }
        }
    }

    public MidiEvent makeEvent(int comd, int chan, int one, int two, int tick){
        MidiEvent event = null;
        try{
            ShortMessage a = new ShortMessage();
            a.setMessage(comd,chan,one,two);
            event = new MidiEvent(a,tick);
        }catch (Exception e){e.printStackTrace();}
        return event;
    }

}



PM MAIL   Вверх
LSD
Дата 18.11.2016, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15709
Регистрация: 24.3.2004

Репутация: 209
Всего: 537



1.
Код

ObjectOutputStream os = new ObjectOutputStream( new FileOutputStream("Musicfile.ser"));
os.writeObject(new BeatBox());
os.close();

Ну собственно, что ты хочешь, ты создаешь новый, не инициализированный объект и сериализуешь его. Полагаю что сериализовывать надо BeatBox.this.

2. Сериализовывать GUI компоненты нельзя. Практически со 100% вероятностью ты или получишь NotSerializableException или криво работающий компонент.


Тебе надо сериализовать данные, а при десереализации переинициализировать компонент прочитанными данными.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
RTV
Дата 18.11.2016, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 11.4.2006
Где: Днепропетровск

Репутация: нет
Всего: нет



Спасибо, первая часть ясна. Теперь по данным,  я так понимаю что бы сохранить нужно в код добавить массив двумерный и тогда при загрузке можно с него же и восстановить данные ?
PM MAIL   Вверх
LSD
Дата 21.11.2016, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15709
Регистрация: 24.3.2004

Репутация: 209
Всего: 537



Да, приблизительно так. Лучше всего взять данные из модели и сохранить их в файл и потом прочитать.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
sergioK1
Дата 25.1.2017, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 416
Регистрация: 30.1.2011

Репутация: нет
Всего: нет



Цитата(LSD @ 18.11.2016,  17:25)
2. Сериализовывать GUI компоненты нельзя. Практически со 100% вероятностью ты или получишь NotSerializableException или криво работающий компонент.


Нужно проверить есть ли там внутри обьекты которые нельзя сериалиазовать,
скорей всего есть,  Да и неправильно это сериализовывать огромный обьект , когда надо 
сохранить всего несколько свойств,   Даже если бы это было можно то это были бы страшные 
тормоза ,  

А надо ? Я помню как еще в 99году на VB6 , велосипед делал,  свой обьект 
создавал с тем набором состояний что требовалось, и писал в файл апри закрытии
формы , при открытии читал файл и выставлял в GUI компоненты нужные свойства,
то есть выбрал юзер три чекбокса и в двух комбо первые значения, закрыл форму,
потом открыл , и те три чекбокса помечаны , как и два комбо с выбранными значениями,

PM MAIL   Вверх
SVN74
Дата 25.1.2017, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 5.5.2008
Где: Комсомольск на Дн епре

Репутация: 1
Всего: 18



Пишите отдельный класс для свойств с  set() и get() и вводом в конструкторе и будет Вам счастье...  smile  
PM MAIL WWW   Вверх
futamator
  Дата 6.2.2017, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 6.2.2017

Репутация: нет
Всего: нет



Такая же ошибка была) Теперь буду знать что я не так делал. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1333 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.