Jump to content

[Dúvida] Guardar JPanel em Ficheiro


Del Castro
 Share

Recommended Posts

Bom dia.

Tou com um pequeno problema em guardar um Jpanel  num ficheiro (do tipo .dat). A aplicação é para a realização de inquerito e tenho um JPanel onde tem a questão com as opções de resposta, e gostaria de guardar este JPanel num ficheiro do tipo .dat. Ele guarda no ficheiro só que quando o tento abrir ele retorna sempre null...

O código que uso para ler e gravar é o seguinte:


public static JInquerito ler(String f)  {
        JInquerito inq = null;
try {
    ObjectInputStream in = new ObjectInputStream(new FileInputStream(f));
    inq = (JInquerito) in.readObject();
    in.close();
} catch (ClassNotFoundException cnfe) {
} catch (FileNotFoundException fnfe) { JOptionPane.showMessageDialog(null, "Inquérito não Encontrado");
} catch (IOException ioe) {
}
        return inq;
    }

    public static void gravar(String f, JInquerito inq ) {
try {
    ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(f));
    out.writeObject(inq);
    out.close();
} catch (IOException ioe) {
}
    }

O JInquerito é um sub-classe criada de JPanel. O f é o nome do ficheiro.

Agradeço a vossa ajuda!

cumps,

Link to comment
Share on other sites

Há alguma razão que te obrigue a guardar o JPanel? Isto porque o suporte para serialização dos componentes Swing tem vindo a ser modificado, ao ponto dos componentes deixarem de suportar correctamente serialização, e as suas propriedades passarem a ser serializadas de formas que podem tornar-se incompatíveis.

Porque é que não guardas os dados das respostas em vez de guardares os componentes todos? É mais simples e mais correcto. Crias um objecto para guardar as respostas, ou serializas simplesmente Strings para o ficheiro de forma sequencial, enfim, em vez de guardares a interface guardas os dados que são importantes.

Quanto ao problema, confirma se o caminho para o ficheiro está correcto e se o ficheiro existe, faz um debug e vê o que se passa com a criação das Streams, assim de repente esse parece ser o problema.

Link to comment
Share on other sites

Há alguma razão que te obrigue a guardar o JPanel? Isto porque o suporte para serialização dos componentes Swing tem vindo a ser modificado, ao ponto dos componentes deixarem de suportar correctamente serialização, e as suas propriedades passarem a ser serializadas de formas que podem tornar-se incompatíveis.

Porque é que não guardas os dados das respostas em vez de guardares os componentes todos? É mais simples e mais correcto. Crias um objecto para guardar as respostas, ou serializas simplesmente Strings para o ficheiro de forma sequencial, enfim, em vez de guardares a interface guardas os dados que são importantes.

Quanto ao problema, confirma se o caminho para o ficheiro está correcto e se o ficheiro existe, faz um debug e vê o que se passa com a criação das Streams, assim de repente esse parece ser o problema.

Está sempre a criar uma excepção sempre que lê o JPanel e o método ler() devolve sempre null.

Se eu guardar este componentes swing num vector por exemplo , e gravar o vector no ficheiro dat ocorrerá o mesmo problema ??

Agradeço, Cumps

Link to comment
Share on other sites

Por estar a dar num é que disse para fazeres um debug e confirmares se o caminho para o ficheiro está correcto e onde exactamente é que é lançada a excepção.

Não interessa onde guardas os componentes, enquanto estiveres a tentar gravar os componentes o problema é sempre o mesmo. E lá está, estás a gravar mais do que é necessário.

Link to comment
Share on other sites

Por estar a dar num é que disse para fazeres um debug e confirmares se o caminho para o ficheiro está correcto e onde exactamente é que é lançada a excepção.

Não interessa onde guardas os componentes, enquanto estiveres a tentar gravar os componentes o problema é sempre o mesmo. E lá está, estás a gravar mais do que é necessário.

Sim o caminho do ficheiro está correcto, e já fizemos vários debug´s e verificamos que ele está a tomar null nesta parte:

inq = (JInquerito) in.readObject();

Era bom que conseguissemos guardar esta informação toda porque o nosso ambito é abresentar o painel tal e qual como foi gravado noutra aplicação, mas se nao for possivel teremos que arranjar outra forma =P

Cumps

Link to comment
Share on other sites

Se o método readObject está a devolver null é porque o ficheiro não tem um objecto para ler. Podes abrir o ficheiro e ver se tem lá um objecto ou se está vazio ou se tem dados e confirmar o código de leitura.

Do código que tens, não me parece que exista erro nenhum óbvio, não estou a ver nada de especial e o código de serialização está correcto, por isso é que a minha primeira ideia foi confirmar o caminho para o ficheiro.

Eu percebo que querias mostrar o componente novamente, mas embora possa funcionar, estás a gravar mais dados do que os que são realmente necessários. Não bastaria guardar os dados das respostas em vez de guardar todo um componente gráfico, com imensos valores associados e imensas informações de controlo que de nada servem?

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.