[ajuda] Jlist - Serialização - Lógica

10 respostas
rderoci

Estou fazendo seguinte, criando 2 Jlist e 1 JComboBox, conforme figura:
[img]http://img695.imageshack.us/img695/3730/padsof.jpg[/img]

1) Tenho que selecionar o professor
2) tenho que transferir as disciplinas de um lado para o outro
3) E quando clicar em Registrar Habilitações o mesmo deve salvar como está (cada disciplina em seu Jlist).

E isso seguindo o padrão MVP e usando SERIALIZAÇÃO.

Bom, eu parei na seguinte parte:
Estou querendo que a Jlist me retorne os arquivos salvos... mas quando compilo, me surge o seguinte erro:

java.io.FileNotFoundException: .\disciplinas.dat (O sistema não pode encontrar o arquivo especificado)
	at java.io.FileInputStream.open(Native Method)
	at java.io.FileInputStream.<init>(Unknown Source)
	at java.io.FileInputStream.<init>(Unknown Source)
	at teste.Disciplina.recuperaDisciplina(Disciplina.java:56)
	at teste.Disciplina.<init>(Disciplina.java:79)
	at teste.Main.main(Main.java:8)
Exception in thread "main" java.lang.NullPointerException
	at teste.Disciplina.recuperaDisciplina(Disciplina.java:69)
	at teste.Disciplina.<init>(Disciplina.java:79)
	at teste.Main.main(Main.java:8)
Minha View:
"imports......"

public class Listas extends JFrame implements Observer{

	private JList selecionadasList, disponiveisList;
	private Container c;
	private String resp;
	private List<Professor> professores = new ArrayList<Professor>();
	private List<Disciplina> discDisponiveis = new ArrayList<Disciplina>();
	private List<Disciplina> discSelecionadas = new ArrayList<Disciplina>();
	
	public void update(Observable o, Object arg) {
		discDisponiveis = (List<Disciplina>) arg;
	}
	
	public Listas() {	
		
		FormLayout formLayout = new FormLayout(
				"80dlu, 45dlu, 30dlu, 20dlu, 40dlu, 40dlu, 40dlu, 40dlu, 40dlu, 40dlu, 50dlu, 50dlu", // 12 colunas
				"pref, 3dlu, pref, 2dlu, pref, 6dlu, pref, 2dlu, pref, 6dlu, pref, 15dlu, pref"); // 13 linhas
		
		JPanel painel = new JPanel();

		PanelBuilder builder = new PanelBuilder(formLayout, painel);

		builder.setDefaultDialogBorder();

		JComboBox prof = new JComboBox();
		
		c = getContentPane();
		c.setLayout(new FlowLayout());
	
		
//----------------------------------------------------------------------------------//
		disponiveisList = new JList(discDisponiveis.toArray());
		disponiveisList.setVisibleRowCount(10);
		disponiveisList.setSelectionMode(
				ListSelectionModel.SINGLE_INTERVAL_SELECTION);

//----------------------------------------------------------------------------------//
		
		selecionadasList = new JList();
		selecionadasList.setVisibleRowCount(6);
		selecionadasList.setSelectionMode(
				ListSelectionModel.SINGLE_INTERVAL_SELECTION);

//----------------------------------------------------------------------------------//
		
		JButton rmvall = new JButton(">>");
		JButton rmvselect = new JButton(">");
		JButton addselect = new JButton("<");
		JButton addall = new JButton("<<");
		JButton registrarHabilitacoes = new JButton("Registrar Habilitações");
		
		CellConstraints cc = new CellConstraints();
		
		builder.add(new JLabel("Professor"), cc.xy(2, 1));
		builder.add(prof, cc.xyw(4, 1, 7));

		builder.add(new JLabel("Disciplinas Selecionadas"), cc.xy(1, 3));
		builder.add(selecionadasList, cc.xywh(1, 5, 5, 7));

		builder.add(new JLabel("Disciplinas Disponíveis"), cc.xy(9, 3));
		builder.add(disponiveisList, cc.xywh(9, 5, 4, 7));

		builder.add(rmvall, cc.xy(7, 5));
		builder.add(rmvselect, cc.xy(7, 7));
		builder.add(addselect, cc.xy(7, 9));
		builder.add(addall, cc.xy(7, 11));

		builder.add(registrarHabilitacoes, cc.xyw(5, 13, 5));

		this.add(painel);
		
		PlasticLookAndFeel.setPlasticTheme(new SkyBluer());
		try {
			UIManager.setLookAndFeel(new PlasticXPLookAndFeel());
			this.setVisible(true);
		} catch (UnsupportedLookAndFeelException ex) {
			System.out.println("Erro durante a definição da aparência da aplicação.");
			System.exit(1);
			}
	}

}
Meu model (por enquanto só Disciplina, ainda tem o Professor):
package teste;

import java.io.*;
import java.util.*;

public class Disciplina extends Observable implements Serializable{
	
	public String disciplina;
	private static List<Disciplina> disciplinas = new ArrayList<Disciplina>();
	
	public String getDisciplina() {
		return disciplina;
	}
	public void setDisciplina(String disciplina) {
		this.disciplina = disciplina;
	}
	
	public Disciplina(){
		Disciplina pac = new Disciplina();
		pac.setDisciplina("Projeto de AlgoritmosComputacionais");
		Disciplina ap = new Disciplina();
		ap.setDisciplina("Arquitetura de Computadores");
		Disciplina lm = new Disciplina();
		lm.setDisciplina("Lógica Matemática");
		Disciplina bd = new Disciplina();
		bd.setDisciplina("Banco de dados");
		
		disciplinas.add(pac);
		disciplinas.add(ap);
		disciplinas.add(lm);
		disciplinas.add(bd);
		
		//recuperaDisciplina("./disciplinas.dat");
	}
	
	public void gravaDados() throws IOException {
		
FileOutputStream arquivoDisciplinas = new FileOutputStream("./disciplinas.dat");
ObjectOutputStream objGravarDisciplinas = new ObjectOutputStream(arquivoDisciplinas);
objGravarDisciplinas.writeObject(disciplinas);
objGravarDisciplinas.flush();
objGravarDisciplinas.close();
arquivoDisciplinas.flush();
arquivoDisciplinas.close();

System.out.println("Dados gravados com sucesso!!!");
}
	
	
	private static ArrayList<Disciplina> recuperaDisciplina() {
		FileInputStream arqLeitura = null;
		ObjectInputStream in = null;
		ArrayList<Disciplina> lista = null;
		try {
			//arquivo onde estao os dados serializados
			arqLeitura = new FileInputStream("./disciplinas.dat");
	 
			//objeto que vai ler os dados do arquivo
			in = new ObjectInputStream(arqLeitura);
	 
			//recupera os dados
			lista = (ArrayList<Disciplina>) in.readObject();
		} catch (ClassNotFoundException ex) {
			ex.printStackTrace();
		} catch (IOException ex) {
			ex.printStackTrace();
		} finally {
			try {
				arqLeitura.close();
				in.close();
			} catch (IOException ex) {
				ex.printStackTrace();
			}
		}
	 
		return lista; //listaRecuperada
	}

	ArrayList<Disciplina> listaRecuperada = recuperaDisciplina();
    
//----------------------------------------------------------------------------------//
	public void run(){
		while (true){
			notifyObservers( listaRecuperada );
		}
	}
}
Main:
package teste;
import java.io.IOException;

public class Main {

	public static void main(String[] args) throws IOException, ClassNotFoundException {
		
		Disciplina disc = new Disciplina();
		disc.gravaDados();
		
		Listas list = new Listas();
		
		//RegistrarHabilitacoes rh = new RegistrarHabilitacoes();		
	}

}

[size=18]Alguém poderia me ajudar com o erro que passei e também quanto a lógica? Sei que mal comecei mas eu to meio perdido no que fazer... Obrigado!!![/size]

10 Respostas

saulods

Ele nao está encontrando o Arquivo, certo ? coloque o arquivo em outra pasta só para testar. Exemplo: "c://disciplinas.dat " e rode o programa.

Só lembrando quando for colocar códigos add a tag [ code ],

Abração

rderoci
saulods:
Ele nao está encontrando o Arquivo, certo ? coloque o arquivo em outra pasta só para testar. Exemplo: "c://disciplinas.dat " e rode o programa.

Só lembrando quando for colocar códigos add a tag [ code ],

Abração

Saulods,

Obrigado pela resposta!

Cara, desculpa por nao colocar o [code].

Quanto ao erro, alterei e continua com o mesmo erro (java.io.FileInputStream), ou seja no momento em que ele vai recuperar os dados. Mas aí é que tá, eu não consegui nem gravar os dados (o arquivonão está no diretório), como eu vou recuperar (fica meio óbvio que ele não vai achar)... Mas não consigo ver o problema dele não estar gerando o arquvo.

saulods
Opa... ai sim com
fica outra coisa  :) 

entao.. esse problema ocorre por causa do
[code]
//linha 79


    // Quando vc Instancia sua classe ela tenta atribuir um devido valor a lista "listaRecuperada" chamando o metodo statico  "recuperaDisciplina".
    ArrayList<Disciplina> listaRecuperada = recuperaDisciplina();  
      
//----------------------------------------------------------------------------------//  
    public void run(){  
        while (true){  
            notifyObservers( listaRecuperada );  
        }  
    }

Vc pode alterar para:

//...

ArrayList<Disciplina> listaRecuperada = null;


//...
public void gravaDados() throws IOException {

		FileOutputStream arquivoDisciplinas = new FileOutputStream("disciplinas.dat");
		ObjectOutputStream objGravarDisciplinas = new ObjectOutputStream(arquivoDisciplinas);
		objGravarDisciplinas.writeObject(disciplinas);
		objGravarDisciplinas.flush();
		objGravarDisciplinas.close();
		arquivoDisciplinas.flush();
		arquivoDisciplinas.close();

		System.out.println("Dados gravados com sucesso!!!");
		
		listaRecuperada = recuperaDisciplina();  
	}

vamo ver se Funfa !!!

Abraço

rderoci

Agora me deu outro erro:

Exception in thread "main" java.lang.StackOverflowError at java.util.Vector.<init>(Unknown Source) at java.util.Vector.<init>(Unknown Source) at java.util.Observable.<init>(Unknown Source) at teste.Disciplina.<init>(Disciplina.java:19) at teste.Disciplina.<init>(Disciplina.java:20) at teste.Disciplina.<init>(Disciplina.java:20) at teste.Disciplina.<init>(Disciplina.java:20)

e outra, não entendi o listaRecuperada = recuperaDisciplina(); dentro do gravaDados().

rderoci

Cara, modifiquei:

Minha classe MAIN:

package teste;
import java.io.IOException;

public class Main {

	public static void main(String[] args) throws IOException, ClassNotFoundException {
		
		Disciplina pac = new Disciplina();
		pac.setDisciplina("Projeto de AlgoritmosComputacionais");
		Disciplina ap = new Disciplina();
		ap.setDisciplina("Arquitetura de Computadores");
		Disciplina lm = new Disciplina();
		lm.setDisciplina("Lógica Matemática");
		Disciplina bd = new Disciplina();
		bd.setDisciplina("Banco de dados");
		
		Disciplina.disciplinas.add(pac);
		Disciplina.disciplinas.add(ap);
		Disciplina.disciplinas.add(lm);
		Disciplina.disciplinas.add(bd);
		
		Disciplina disc = new Disciplina();
		disc.gravaDados();
		
		Listas list = new Listas();
		
		//RegistrarHabilitacoes rh = new RegistrarHabilitacoes();		
	}

}

e a Classe Disciplina (model):

package teste;

import java.io.*;
import java.util.*;

public class Disciplina extends Observable implements Serializable{
	
	public String disciplina;
	private static List<Disciplina> disciplinas = new ArrayList<Disciplina>();
	ArrayList<Disciplina> listaRecuperada = null;
	
	public String getDisciplina() {
		return disciplina;
	}
	public void setDisciplina(String disciplina) {
		this.disciplina = disciplina;
	}
	
	public Disciplina(){
	}
	
	public void gravaDados() throws IOException {
		
FileOutputStream arquivoDisciplinas = new FileOutputStream("disciplinas.dat");
ObjectOutputStream objGravarDisciplinas = new ObjectOutputStream(arquivoDisciplinas);
objGravarDisciplinas.writeObject(disciplinas);
objGravarDisciplinas.flush();
objGravarDisciplinas.close();
arquivoDisciplinas.flush();
arquivoDisciplinas.close();

System.out.println("Dados gravados com sucesso!!!");

listaRecuperada = recuperaDisciplina();
}
	
	
	public static ArrayList<Disciplina> recuperaDisciplina() {
		FileInputStream arqLeitura = null;
		ObjectInputStream in = null;
		ArrayList<Disciplina> lista = null;
		try {
			//arquivo onde estao os dados serializados
			arqLeitura = new FileInputStream("disciplinas.dat");
	 
			//objeto que vai ler os dados do arquivo
			in = new ObjectInputStream(arqLeitura);
	 
			//recupera os dados
			lista = (ArrayList<Disciplina>) in.readObject();
		} catch (ClassNotFoundException ex) {
			ex.printStackTrace();
		} catch (IOException ex) {
			ex.printStackTrace();
		} finally {
			try {
				arqLeitura.close();
				in.close();
			} catch (IOException ex) {
				ex.printStackTrace();
			}
		}
	 
		return lista; //listaRecuperada
	}

	//ArrayList<Disciplina> listaRecuperada = recuperaDisciplina();
    
//----------------------------------------------------------------------------------//
	public void run(){
		while (true){
			notifyObservers( listaRecuperada );
		}
	}
}

Bom, agora meu construtor está vazio… Tá certo isso?
Preciso agora des-serializar recuperando tudo para um ArrayList para que possa demonstrar em uma Jlist, e isso no padrão MVP, ou seja: utilizando o observer, estou tentando fazer assim:

DIsciplina (model):

public void run(){ while (true){ notifyObservers( listaRecuperada ); }

O método run passa o argumento para o método update?:

public void update(Observable o, Object arg) {
		discDisponiveis = (List<Disciplina>) arg;
	}

Que atualiza a View?:
View (a JList):

disponiveisList = new JList(discDisponiveis.toArray()); disponiveisList.setVisibleRowCount(10); disponiveisList.setSelectionMode( ListSelectionModel.SINGLE_INTERVAL_SELECTION);

To meio perdido, poderia me dar umas dicas? Estou no caminho certo ou estou fazendo errado? Assim do jeito que tá a Jlist não está me retornando nada!

rderoci

Ahh, não to conseguindo fazer atualizar a minha Jlist com o arraylist que foi serializado!!! Vou dar um tempinho para descansar… Se alguém tiver uma luz, alguma dica, por favor me respondam! rs

rderoci

Ninguem? Não consigo sair do lugar!

rderoci

Consegui puxar para um ArrayList!

Segue como está atualmente:

Minha View (Listas):

package teste;

import java.awt.Container;
import java.awt.FlowLayout;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Observable;
import java.util.Observer;

import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.ListSelectionModel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

import com.jgoodies.forms.builder.PanelBuilder;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
import com.jgoodies.looks.plastic.PlasticLookAndFeel;
import com.jgoodies.looks.plastic.PlasticXPLookAndFeel;
import com.jgoodies.looks.plastic.theme.SkyBluer;

public class Listas extends JFrame implements Observer{

	private JList selecionadasList, disponiveisList;
	private Container c;
	private Disciplina discObserver;
	private List<Professor> professores = new ArrayList<Professor>();	
	
	private List<Disciplina> discSelecionadas = new ArrayList<Disciplina>();
	Disciplina[] ld = new Disciplina[Disciplina.disciplinas.size()];
	
	
	public void update(Observable o, Object arg) { //o - the observable object.
		
		Disciplina.disciplinas = (List<Disciplina>) arg;  //arg - an argument passed to the notifyObservers  method.
	}
	
	public Listas() {	
		
		discObserver = new Disciplina();
		discObserver.addObserver(this);
		
		FormLayout formLayout = new FormLayout(
				"80dlu, 45dlu, 30dlu, 20dlu, 40dlu, 40dlu, 40dlu, 40dlu, 40dlu, 40dlu, 50dlu, 50dlu", // 12 colunas
				"pref, 3dlu, pref, 2dlu, pref, 6dlu, pref, 2dlu, pref, 6dlu, pref, 15dlu, pref"); // 13 linhas
		
		JPanel painel = new JPanel();

		PanelBuilder builder = new PanelBuilder(formLayout, painel);

		builder.setDefaultDialogBorder();

		JComboBox prof = new JComboBox();
		
		c = getContentPane();
		c.setLayout(new FlowLayout());
	
		
//----------------------------------------------------------------------------------//
		
			Iterator<Disciplina> itr = Disciplina.disciplinas.iterator();
			int a = 0;
			while (itr.hasNext()){
				ld[a] = itr.next();
				System.out.println(ld[a]);
				a++;
			}
		
		
		DefaultListModel discdisp = new DefaultListModel(); 	
		
		disponiveisList = new JList(ld);
		for (int i=0; i<ld.length; i++){
			discdisp.addElement(ld[i].getDisciplina());
			disponiveisList.setModel(discdisp);
			}
		disponiveisList.setVisibleRowCount(10);
		disponiveisList.setSelectionMode(
				ListSelectionModel.SINGLE_INTERVAL_SELECTION);

//----------------------------------------------------------------------------------//
		
		selecionadasList = new JList();
		selecionadasList.setVisibleRowCount(6);
		selecionadasList.setSelectionMode(
				ListSelectionModel.SINGLE_INTERVAL_SELECTION);

//----------------------------------------------------------------------------------//
		
		JButton rmvall = new JButton(">>");
		JButton rmvselect = new JButton(">");
		JButton addselect = new JButton("<");
		JButton addall = new JButton("<<");
		JButton registrarHabilitacoes = new JButton("Registrar Habilitações");
		
		CellConstraints cc = new CellConstraints();
		
		builder.add(new JLabel("Professor"), cc.xy(2, 1));
		builder.add(prof, cc.xyw(4, 1, 7));

		builder.add(new JLabel("Disciplinas Selecionadas"), cc.xy(1, 3));
		builder.add(selecionadasList, cc.xywh(1, 5, 5, 7));

		builder.add(new JLabel("Disciplinas Disponíveis"), cc.xy(9, 3));
		builder.add(disponiveisList, cc.xywh(9, 5, 4, 7));

		builder.add(rmvall, cc.xy(7, 5));
		builder.add(rmvselect, cc.xy(7, 7));
		builder.add(addselect, cc.xy(7, 9));
		builder.add(addall, cc.xy(7, 11));

		builder.add(registrarHabilitacoes, cc.xyw(5, 13, 5));

		this.add(painel);
		
		PlasticLookAndFeel.setPlasticTheme(new SkyBluer());
		try {
			UIManager.setLookAndFeel(new PlasticXPLookAndFeel());
			this.setVisible(true);
		} catch (UnsupportedLookAndFeelException ex) {
			System.out.println("Erro durante a definição da aparência da aplicação.");
			System.exit(1);
			}
	}

}

Meu model (Disciplina):

package teste;

import java.io.*;
import java.util.*;

public class Disciplina extends Observable implements Serializable{
	
	public String disciplina;
	public static List<Disciplina> disciplinas = new ArrayList<Disciplina>();
	ArrayList<Disciplina> listaRecuperada = null;
	
	public String getDisciplina() {
		return disciplina;
	}
	public void setDisciplina(String disciplina) {
		this.disciplina = disciplina;
		setChanged(); 
		notifyObservers();
	}
	
	public Disciplina(){
	}
	
	public void gravaDados() throws IOException {
		
FileOutputStream arquivoDisciplinas = new FileOutputStream("disciplinas.dat");
ObjectOutputStream objGravarDisciplinas = new ObjectOutputStream(arquivoDisciplinas);
objGravarDisciplinas.writeObject(disciplinas);
objGravarDisciplinas.flush();
objGravarDisciplinas.close();
arquivoDisciplinas.flush();
arquivoDisciplinas.close();

System.out.println("Dados gravados com sucesso!!!");

listaRecuperada = recuperaDisciplina();
}
	
	
	public static ArrayList<Disciplina> recuperaDisciplina() {
		FileInputStream arqLeitura = null;
		ObjectInputStream in = null;
		ArrayList<Disciplina> lista = null;
		try {
			//arquivo onde estao os dados serializados
			arqLeitura = new FileInputStream("disciplinas.dat");
	 
			//objeto que vai ler os dados do arquivo
			in = new ObjectInputStream(arqLeitura);
	 
			//recupera os dados
			lista = (ArrayList<Disciplina>) in.readObject();
		} catch (ClassNotFoundException ex) {
			ex.printStackTrace();
		} catch (IOException ex) {
			ex.printStackTrace();
		} finally {
			try {
				arqLeitura.close();
				in.close();
			} catch (IOException ex) {
				ex.printStackTrace();
			}
		}
	 
		return lista; //listaRecuperada
	}

	//ArrayList<Disciplina> listaRecuperada = recuperaDisciplina();
    
//----------------------------------------------------------------------------------//
	public void run(){
		while (true){
			notifyObservers( listaRecuperada );
		}
	}
}

Meu Main:

package teste;
import java.io.IOException;

public class Main {

	public static void main(String[] args) throws IOException, ClassNotFoundException {
		
		Disciplina pac = new Disciplina();
		pac.setDisciplina("Projeto de AlgoritmosComputacionais");
		Disciplina ap = new Disciplina();
		ap.setDisciplina("Arquitetura de Computadores");
		Disciplina lm = new Disciplina();
		lm.setDisciplina("Lógica Matemática");
		Disciplina bd = new Disciplina();
		bd.setDisciplina("Banco de dados");
		
		Disciplina.disciplinas.add(pac);
		Disciplina.disciplinas.add(ap);
		Disciplina.disciplinas.add(lm);
		Disciplina.disciplinas.add(bd);
		
		Disciplina disc = new Disciplina();
		//disc.gravaDados();
		
		Listas list = new Listas();
		
		//RegistrarHabilitacoes rh = new RegistrarHabilitacoes();		
	}

}

Agora tenho que:
1) Colocar o professor na ComboBox, assim como fiz na Jlist.
2) Criar uma "conexão" do professor selecionado com as 2 JList:
2.1)Ao movimentar as disciplinas da Jlist"A" para Jlist"B" (vice-versa) e clicar em "Registrar Habilitações" as disciplinas devem ficar salvas cada uma em sua Jlist, de forma que se eu alterar para o professor"2" e depois voltar ao professor que atualizei a Jlist, as Jlist's devem ficar salvas com as modificações que fiz.
3) Implementar a movimentação entre Jlist.
3.1) No momento em que o usuário gerar um evento o Presenter irá tratar e modifcar no model (add na JlistA e remove na JlistB e vice-versa) e o model terá que avisar/atualizar à View (Listas) utilizando o Observer.

Agora como eu vou fazer isso? To perdido! hahaha
Até agora estou seguindo o MVP? teria que mudar algo?

AJUDEM AÍ GENTE! POR FAVOR!

rderoci

Ninguém???

rderoci

dificil…

Criado 7 de maio de 2010
Ultima resposta 9 de mai. de 2010
Respostas 10
Participantes 2