Exibição de JTable e problema ao fechar o arquivo

17 respostas
J

Criei algumas classes para manipular arquivos, então criei essa classe abaixo, a "Tabela" pra poder exibir estes dados em uma tabelinha, mas, não sei porque mas, se eu não colocar a linha:

application.closeFile();

no final, o aplicativo roda normal e aparece a minha tabela,
mas, se eu deixar esta linha não aparece nada, por quê?

aí vai o código:

public class Tabela extends JFrame
{
	private JTextArea titulos;
	private ObjectInputStream input;
	JTable tabelinha;
	JLabel label;
	 
	public Tabela()
	{
		super("Tabela de Resultados.");
		
	    final String coluna[] = {"Account",
	 	         "First Name", "Last Name", "Balance" };
	    
	    titulos = new JTextArea("Exibição de resultados",3,100);
	    titulos.setLineWrap(true);
	    titulos.setWrapStyleWord(true);
	    
		JScrollPane scrollPane = new JScrollPane(titulos,ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
								ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
	    
		Icon icone = new ImageIcon(getClass().getResource("icone.jpg"));
		label = new JLabel();
		label.setIcon(icone);
		
		Box box = Box.createHorizontalBox();
		box.add(scrollPane);
		box.add(label);
		add(box, BorderLayout.NORTH);
		ReadSequentialFile application = new ReadSequentialFile();
		application.openFile();
		
	    application.readRecords();
	    String [][]dados = application.getDados();
	    tabelinha = new JTable(dados,coluna);
	    
		add(new JScrollPane(tabelinha),BorderLayout.CENTER);
		setVisible(true);
		
		
		application.closeFile();
		
		

		
		
	}
	
	
}

[i]Obs: exclui os imports, pra fikar melhor

17 Respostas

ViniGodoy

Tem certeza que nenhuma exceção disparou? Tem certeza que vc está lendo do arquivo antes de fecha-lo?

J

Sim, sim!

Não acontece nenhuma exceção, e eu testei a leitura do arquivo antes de fazer esse JFrame…

Simplesmente não aparece nada, eu vejo que ele executa, mas, não aparece nada

ViniGodoy

Já tentou usar o debbuger?

J

desculpe a ignorância,mas, que isso?
rsrs

ViniGodoy

O depurador. Uma ferramentinha que permite que você rode o código passo a passo e acompanhe o que está acontecendo. No seu caso, bastaria colocar um break-point na linha onde vc fecha o arquivo, e ver o que acontece por lá.

Numa desses, uma exceção está sendo lançada e sendo ignorada em algum ponto, ou até mesmo alguma coisa mais exotérica. E essa ferramenta te permite enxergar isso na lata.

Tanto o Eclipse, quanto o Netbeans tem ótimos depuradores.

J

usei o debugger do Eclipse…deu nada não…num aparece nada, nada mesmo!

ViniGodoy

:shock:

Então realmente não sei o que acontece!

:shock:

J

=/

valeu!

ivo_costa

Posta o código completo da classe ReadSequentialFile, deve ter algum problema no método closeFile();

J

Tá aí:

eu adaptei esse código do livro do Deitel

import java.io.EOFException;     
import java.io.FileInputStream;  
import java.io.IOException;      
import java.io.ObjectInputStream;


public class ReadSequentialFile
{
   private ObjectInputStream input;
   private String[][] dados = new String[15][4];

   // permite que o usuário selecione o arquivo a abrir
   public void openFile()
   {
      try // abre o arquivo
      {
         input = new ObjectInputStream(            
            new FileInputStream( "clients.ser" ) );
      } // fim do try
      catch ( IOException ioException )
      {
         System.err.println( "Error opening file." );
      } // fim do catch
   } // fim do método openFile

   // lê o registro no arquivo
   public void readRecords()
   {
      AccountRecordSerializable record;
 

      //System.out.printf(coluna);
      try // insere os valores do arquivo
      {

    	 int a = 0;
    	 int b = 0;
         while ( true )
         {
            record = ( AccountRecordSerializable ) input.readObject();
            
           
            	dados[a][b] = 	  Integer.toString(record.getAccount());
            	dados[a][b + 1] = record.getFirstName();
            	dados[a][b + 2] = record.getLastName();
            	dados[a][b + 3] = Double.toString(record.getBalance());
            	            	
            	a++;
            
         } // fim do while
      } // fim do try
      catch ( EOFException endOfFileException )
      {

		return; // fim do arquivo foi alcançado
      } // fim do catch
      catch ( ClassNotFoundException classNotFoundException )
      {
         System.err.println( "Unable to create object." );
      } // fim do catch
      catch ( IOException ioException )
      {
         System.err.println( "Error during reading from file." );
      } // fim do catch
      
      //que isso nunca retorne
	  
   } // fim do método readRecords

   // fecha o arquivo e termina o aplicativo
   public void closeFile()
   {
      try // fecha o arquivo e encerra
      {
         if ( input != null )
            input.close();
            System.exit( 0 );
      } // fim do try
      catch ( IOException ioException )
      {
         System.err.println( "Error closing file." );
         System.exit( 1 );
      } // fim do catch
   } // fim do método closeFile


   public String [][] getDados()
   {
	   String [][]Dados = dados;
	   return Dados;
   }


} // fim da classe ReadSequentialFile
ivo_costa

Ali na linha 77 vc tá dando um System.exit(0), esse comando finaliza o sistema.
Tira essa linha e ve se funciona.

J

Nossa, deu certo agora!
Coisa simples, nem tinha prestado atenção.

Mas, acabou surgindo outra dúvida:
Qual a diferença dos argumentos 0 e 1 no System.exit() ?

ViniGodoy

Ué, você não tinha usado o depurador? Como isso pode ter passado batido?!?!?!?

Os números retornam a aplicação que chamou o seu programa um status. Exatamente o que cada número significa é definido por você. Mas usualmente deixamos o 0 para significar “o programa funcionou” e reservamos outros números para códigos de erro.

Isso é mais útil para aplicações que rodem via console, como as várias encontradas no bash do linux.

J

OK, ViniGodoy…Obrigado!

E, eu tinha passado o debug do Eclipse, mas, tinha acusado nada mesmo não :?

Mas, pelo menos agora sei o que é!rsrs

Obrigado pessoal

ViniGodoy

É que vc provavelmente só usou o “step over”. Quando o correto era usar “step into” e executar passo-a-passo dentro da função.

Bom, pelo menos agora o problema está resolvido! :slight_smile:
E você aprendeu a usar mais uma importantíssima ferramenta de programação (a próxima pode ser o profiler).

J

tô aprendendo a mexer no debugger direito,mas, tem muito segredo não só não estou familiarizado…

O que é o profiler?

ViniGodoy

É uma ferramenta que avalia coisa como o tempo de execução dos métodos ou o consumo de memória do seu programa. Ótima para otimizar código, descobrir onde estão os gargalos, etc.

Nunca tente deixar um programa mais rápido, ou reduzir o consumo de memória sem utiliza-lo primeiro. Ele mostra o ponto certo, que está pegando na sua programação.

O Netbeans tem um ótimo profiler. Eu também programo em Eclipse, mas sempre que preciso, uso o Netbeans para isso.

Criado 27 de agosto de 2008
Ultima resposta 27 de ago. de 2008
Respostas 17
Participantes 3