[RESOLVIDO]Dúvida sobre Serialização/Desserialização

3 respostas
Reginildo

Olá a todos,
Venho estudando Java pelo livro Use a Cabeça Java. Esse livro tem um código de uma BeatBox que demonstra como podemos utilizar a serialização/desserialização para gravar/restaurar padrões de batidas.
Aqui vai a parte que estou com dúvida:

Criando botão SerializeIt:

JButton serialize = new JButton("SerializeIt");
		serialize.addActionListener(new MySendListener());
		buttonBox.add(serialize);

Classe interna ouvinte de SerializeIt:

public class MySendListener implements ActionListener {
		public void actionPerformed(ActionEvent a) {
			boolean[] checkboxState = new boolean[256];
			for (int i = 0; i < 256; i++) {
				JCheckBox check = (JCheckBox) checkboxList.get(i);
				if (check.isSelected()) {
					checkboxState[i] = true;
				}
			}
			try {
				FileOutputStream fileStream = new FileOutputStream(new File(
						"Checkbox.ser"));
				ObjectOutputStream os = new ObjectOutputStream(fileStream);
				os.writeObject(checkboxState);				
				JFileChooser fileSave = new JFileChooser();
				fileSave.showSaveDialog(theFrame);
				saveFile(fileSave.getSelectedFile());

			} catch (Exception ex) {
				ex.printStackTrace();
			}
		}
	}

	private void saveFile(File file) {
		try {
			BufferedWriter writer = new BufferedWriter(new FileWriter(file));
			writer.close();
		} catch (IOException ex) {
			System.out.println("Couldn't write the File");
			ex.printStackTrace();
		}
	}

Criando botão Open a File:

JButton open = new JButton("Open a File");
		open.addActionListener(new OpenMenuListener());
		buttonBox.add(open);

Classe interna ouvinte de Open a File:

public class OpenMenuListener implements ActionListener {
		public void actionPerformed(ActionEvent ev) {
			JFileChooser fileOpen = new JFileChooser();
			fileOpen.showOpenDialog(theFrame);
			loadFile(fileOpen.getSelectedFile());
		}
	}

	public void loadFile(File file) {
		try {
			BufferedReader reader = new BufferedReader(new FileReader(file));
			reader.close();

		} catch (IOException ex) {
			System.out.println("Couldn't read the file");
			ex.printStackTrace();
		}
	}

Do jeito que meu código está feito eu consigo salvar, em arquivos, padrões de batida. Porém, quando tento restaurar um padrão eu não consigo. Ele não restaura a BeatBox . Acredito que esteja faltando algo que não entendi na explicação sobre o assunto.
Espero ter sido claro na explicação do problema. É o primeiro post que crio. Se quiserem alguma informação adicional me comuniquem.
Obrigado pela atenção!

3 Respostas

Reginildo

Acho que é melhor colocar o código completo:
Aqui está!

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.ArrayList;
import javax.sound.midi.*;
import javax.swing.*;

public class BeatBox {

	JPanel mainPanel;
	ArrayList<JCheckBox> checkboxList;
	Sequencer sequencer;
	Sequence sequence;
	Track track;
	JFrame theFrame;
	String[] instrumentNames = { "Bumbo", "Hi-Hat Fechado", "Hi-Hat Aberto",
			"Caixa Acústica", "Cymbal Quebrado", "Bater Palmas", "Tom Grave",
			"Hi Bongo", "Maracas", "Apito", "Conga Grave", "Cowbell",
			"Vibraslap", "Tom Médio-Grave", "Agogo Alto", "Hi Conga Aberto" };
	int[] instruments = { 35, 42, 46, 38, 49, 39, 50, 60, 70, 72, 64, 56, 58,
			47, 67, 63 };

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

	private void buildGUI() {
		theFrame = new JFrame("Cyber BeatBox");
		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 serialize = new JButton("SerializeIt");
		serialize.addActionListener(new MySendListener());
		buttonBox.add(serialize);
		JButton restore = new JButton("Restore");
		restore.addActionListener(new MyReadInListener());
		buttonBox.add(restore);
		JButton open = new JButton("Open a File");
		open.addActionListener(new OpenMenuListener());
		buttonBox.add(open);
		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(50, 50, 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();
		}
	}

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

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

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

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

	public void makeTracks(int[] list) {
		for (int i = 0; i < 16; i++) {
			int key = list[i];
			if (key != 0) {
				track.add(makeEvent(144, 9, 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;
	}

	public class MySendListener implements ActionListener {
		public void actionPerformed(ActionEvent a) {
			boolean[] checkboxState = new boolean[256];
			for (int i = 0; i < 256; i++) {
				JCheckBox check = (JCheckBox) checkboxList.get(i);
				if (check.isSelected()) {
					checkboxState[i] = true;
				}
			}
			try {
				FileOutputStream fileStream = new FileOutputStream(new File(
						"Checkbox.ser"));
				ObjectOutputStream os = new ObjectOutputStream(fileStream);
				os.writeObject(checkboxState);				
				JFileChooser fileSave = new JFileChooser();
				fileSave.showSaveDialog(theFrame);
				saveFile(fileSave.getSelectedFile());

			} catch (Exception ex) {
				ex.printStackTrace();
			}
		}
	}

	private void saveFile(File file) {
		try {
			BufferedWriter writer = new BufferedWriter(new FileWriter(file));
			writer.close();
		} catch (IOException ex) {
			System.out.println("Couldn't write the File");
			ex.printStackTrace();
		}
	}

	public class MyReadInListener implements ActionListener {
		public void actionPerformed(ActionEvent a) {
			boolean[] checkboxState = null;
			try {
				FileInputStream fileIn = new FileInputStream(new File(
						"Checkbox.ser"));
				ObjectInputStream is = new ObjectInputStream(fileIn);
				checkboxState = (boolean[]) is.readObject();
			} catch (Exception ex) {
				ex.printStackTrace();
			}
			for (int i = 0; i < 256; i++) {
				JCheckBox check = (JCheckBox) checkboxList.get(i);
				if (checkboxState[i]) {
					check.setSelected(true);
				} else {
					check.setSelected(false);
				}
			}
			sequencer.stop();
			buildTrackAndStart();
		}
	}

	public class OpenMenuListener implements ActionListener {
		public void actionPerformed(ActionEvent ev) {
			JFileChooser fileOpen = new JFileChooser();
			fileOpen.showOpenDialog(theFrame);
			loadFile(fileOpen.getSelectedFile());
		}
	}

	public void loadFile(File file) {
		try {
			BufferedReader reader = new BufferedReader(new FileReader(file));
			reader.close();

		} catch (IOException ex) {
			System.out.println("Couldn't read the file");
			ex.printStackTrace();
		}
	}
}

Eu acho que realmente leio e gravo em um arquivo as seqüências de cada JCheckBox(métodos loaFile() e saveFile()). Mas na hora de restaurar a GUI para o padrão do arquivo, isso não acontece. Acho que preciso fazer algo a mais no método loadFile(), só não sei o que é.

E

O que você tem de fazer com essas variáveis writer e reader? Hein?

Reginildo

Ok. Problema resolvido. Obrigado…

Criado 12 de junho de 2010
Ultima resposta 24 de dez. de 2010
Respostas 3
Participantes 2