Pessoal, tenho que salvar os elementos de uma jlist em um .txt. A jlist é alimentada a partir de um jtextfield. Criei uma classe Arquivo onde o método salvar tem como atributo uma String. Ao chamar o método salvar (através de um botão), não consigo passar os elementos da jlist como string (não encontrei um método que retorne uma string do model da jlist). Agradeço desde já.
mbastos73 o método para retornar o valor do model do Jlist é o:
onde i seria o índice.
Sendo assim para retornar todos os valores basta apenas jogar em um laço for.
Mto obrigado. Vou tentar!
Consegui salvar, só que agora não consigo ler.
Tenho que fazer um exercício onde em uma combobox tenho os Estados brasileiros; em um jtextfield digito a cidade e com um botão adiciono à jlist daquele estado; qdo tiver todas as cidades que quero, clico em um botão salvar, que chama um metodo salvar da classe Arquivo e salva em txt, com o nome do estado como nome do arquivo. Até aqui consegui (faltava conseguir retirar os elementos da jlist, mas consegui com a ajuda do forista acima). Mas o arquivo deveria ser lido qdo selecionasse o estado correspondente (na combobox), através de um método ler da classe Arquivo. Este método retorna uma String. Mas não tem jeito, da uma mensagem de “Stream Closed” (dentro da jlist) qdo seleciono um Estado.
O código action da combobox:
private void jCBxEstadosActionPerformed(java.awt.event.ActionEvent evt) {
// if(jCBxEstados.getSelectedIndex()>0){
a=new Arquivo((String)jCBxEstados.getSelectedItem()+".txt");
// if(a.exists()){
lstModel.addElement(a.ler());
jList1.setModel(lstModel);
// }else{
// jList1.setModel(lstModel);
// lstModel.clear();
// }
//}
}
o Código do metodo salvar da Classe Arquivo: (o codigo anterior, da combobox, está confuso porque tentei um monte de coisa, e não quis deletar, pois podia ter que voltar)
public String ler(){
String texto="";
String conteudo="";
try{
FileReader arqLe=new FileReader(this.nomeArquivo);
BufferedReader br=new BufferedReader(arqLe);
while((conteudo=br.readLine())!=null){
texto=texto+conteudo+"\n";
br.close();
arqLe.close();
}
}catch(Exception e){
texto=e.getMessage();
}
return texto;
}
Alguma santa dica de onde está o erro???
mbastos73 me explica qual sua dúvida.
Vc está tendo problemas para ler ou para gravar o arquivo?
Urbgames, obrigado pelo interesse. Meu problema está em ler o .txt. Já consigo gravar (qdo abro o arquivo pelo bloco de notas, todas as informações estão em uma única linha), mas qdo o arquivo é lido plo método, ele aparece na jlist com uma única linha (todas as informações em uma única linha), e não uma abaixo da outra, como seria uma lista. Teve uma das vezes que acrescentei um \r antes do \n, e no bloco de notas aparece uma informação por linha, mas qdo vai para a jlist fica tudo em uma linha só. já fucei no google e em foruns, mas não acho nada que funcione no meu caso, embora outros tenham conseguido.
Grato.
Urbgames, apenas par familiarizar com a dúvida, seguem os respectivos codigos do jbtn salvar e gravar (este da classe Arquivo):
private void jBtnSalvarActionPerformed(java.awt.event.ActionEvent evt) {
jList1.setModel(lstModel);
if(jCBxEstados.getSelectedIndex()>0){
if((lstModel.getSize())>0){
a=new Arquivo((String)jCBxEstados.getSelectedItem()+".txt");
String jlItens="";
for(int i=0;i<lstModel.getSize();i++){
jlItens=jlItens + ((String)lstModel.getElementAt(i)+"\r\n");
}
a.gravar(jlItens);
jList1.setModel(lstModel);
lstModel.clear();
}else{
JOptionPane.showMessageDialog(this, “Lista vazia! Impossível salvar”);
}
}else{
JOptionPane.showMessageDialog(this, “Selecione um Estado”);
}
}
public String gravar(String texto){
try{
FileWriter arqGrava=new FileWriter(this.nomeArquivo,false);
PrintWriter arqDados=new PrintWriter(arqGrava);
arqDados.println(texto);
arqDados.close();
arqGrava.close();
return null;
}
catch(Exception e){
return e.getMessage();
}
}
mbastos73 deixe no esquema para gravar linha por linha.
Não sei como vc está lendo seu arquivo, porém uma opção seria utilizar um BufferedReader passando um FileReader, onde este último carregaria o arquivo a ser lido.
para ler linha por linha utilize o método:
para ler todo o arquivo jogue a instrução acima de um laço while com a condição:
ficando assim:
while (objetoBufferedReader.ready())) {
texto = objetoBufferedReader.readLine();
}
Daí é só jogar os textos no Jlist.
Qualquer coisa dá um grito ai!
Perdão, deveria enviar o codigo do ler; segue abaixo: (creio ser como tu disseste)
public String ler(){
String texto="";
String conteudo="";
try{
FileReader arqLe=new FileReader(this.nomeArquivo);
BufferedReader br=new BufferedReader(arqLe);
while((conteudo=br.readLine())!=null){
texto=texto+conteudo;
}
br.close();
arqLe.close();
}catch(Exception e){
e.getMessage();
}
return texto;
}
mbastos73 só para complementar, para não dar muito trabalho fazendo gambiarra na hora de gravar.
Faz o seguinte, de forma análoga a ler, implementa para ele gravar tbm. Com os objetos do tipo BufferedWriter e FileWriter.
Para gravar o valor no arquivo utiliza o seguinte esquema:
objetoBufferedWriter.write("textoASerGravado");
//pular linha
objetoBufferedWriter.newLine();
//salvar arquivo
objetoBufferedWriter.flush();
//ou
objetoBufferedWriter.close();
mbastos73 vc está utilizando a instrução:
e isto concatena o texto o deixando em uma linha só, para solucionar isso ou vc joga já no Jlist ou manda para um array.
Vc tem que passar texto por texto, se concatenar vai ficar em uma linha só.
Urbgames, deixei assim:
public String gravar(String texto){
try{
FileWriter arqGrava=new FileWriter(this.nomeArquivo,false);
//PrintWriter arqDados=new PrintWriter(arqGrava);
BufferedWriter arqDados=new BufferedWriter(arqGrava);
arqDados.write(texto);
arqDados.newLine();
// arqDados.println(texto);
arqDados.close();
arqGrava.close();
return null;
}
catch(Exception e){
return e.getMessage();
}
}
-----------------------------------------------------------------
public String ler(){
String texto = null;
String conteudo="";
try{
FileReader arqLe=new FileReader(this.nomeArquivo);
BufferedReader br=new BufferedReader(arqLe);
while(br.ready()){
texto = br.readLine();
}
br.close();
arqLe.close();
}catch(Exception e){
e.getMessage();
}
return texto;
}
E agora bugou legal! Nem lê! Não aparece nada.
A primeira linha do arquivo, qdo abro no editor, aparece null (!!!)
O problema está, eu acho, na inicialização da variavel texto como null. não seria isto? Se sim, como inicializar ela?
Creio que vc esteja tendo problema no momento de referenciar o local dos arquivo.
Para isso crie um arquivo txt e jogue dentro do seu projeto e utilize a seguinte instrução:
[code]
File arquivo= new File(getClass().getResource(“nomeDoArquivo.txt”).toURI());[/code]
Ao instanciar os objetos do tipo FileWriter e FileReader passe o arquivo.
E para confirmar veja se o arquivo está sendo alterado.
Para resolver seu problema com o null altera teu while, para ele ficar desta forma:
[code]while (objetoBufferedReader.ready()) {
//exemplo…
texto = oi2.readLine();
System.out.println(texto);
}[/code]
[quote=urbgames]Creio que vc esteja tendo problema no momento de referenciar o local dos arquivo.
Para isso crie um arquivo txt e jogue dentro do seu projeto e utilize a seguinte instrução:
[code]
File arquivo= new File(getClass().getResource(“nomeDoArquivo.txt”).toURI());[/code]
Ao instanciar os objetos do tipo FileWriter e FileReader passe o arquivo.
E para confirmar veja se o arquivo está sendo alterado.[/quote]
Os arquivos estão sendo salvos dentro do projeto, então não deve ser isto.