Carregando arquivo txt para uma Jtable. Problemas com a Jtable

5 respostas
RockZero

Olá pessoal. Sou novo aqui e iniciante em Java. Estou fazendo um pequeno trabalho de faculdade em Java. É um programa para validação de cadeias e automatos. Ele consistem em carregar um arquivo txt com as regras do automato para depois validar uma cadeia inserida pelo usuário. Com muito custo consegui fazer o código para carregar os caracteres em um vetor e depois mandar para um método que preenche a Jtable. Quando eu utilizo o método PrenceherJtable em um botão proprio jframe ele funciona. Mas quando chamo ele dentro de método de outra classe ai não acontece nada.

Classe carregar_arquivo

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package simuladoruniversal;

/**
 *
 * @author Junior
 */
import java.io.FileNotFoundException;
import java.io.IOException;
import javax.swing.*;
import javax.swing.filechooser.*;
import java.io.File;
import java.io.FileInputStream;

public class carregar_arquivo {

    public carregar_arquivo() {
    }

    public void carregar_txt1() throws FileNotFoundException, IOException {
        JFileChooser fc = new JFileChooser();
        FileNameExtensionFilter filtro = new FileNameExtensionFilter("Arquivos Texto", "txt");
        fc.addChoosableFileFilter(filtro);
        fc.setAcceptAllFileFilterUsed(false);
        int res = fc.showOpenDialog(null);


        if (res == JFileChooser.APPROVE_OPTION) {
            String conteudoArquivo = "";
            File temp = fc.getSelectedFile();
            FileInputStream fis = new FileInputStream(temp);
            int ln, cont = 0;
            char x = 0;
            String[] linha = new String[3];
            Automato_Finito_Deterministico p = new Automato_Finito_Deterministico();
            while ((ln = fis.read()) != -1 & x != 'F') {
                x = (char) ln;
                linha[cont] = Character.toString(x) ;
                if (cont == 2) {
                   p.PrenceherJtable(linha) ;
                   cont = 0;
                }
                cont++;
            }
            fis.close();
        }

    }


}

Metodo dentro do Jfram com uma Jtable já inserida sem linhas

public void PrenceherJtable(String[] linha) {
        DefaultTableModel modelo = (DefaultTableModel) jTable1.getModel();
        modelo.addRow(linha);
        
    }

Meu problema que não tenho ideia de como usar uma Jtable e de saber para que serve um Modelo e quando usa-lo. Alguem tem uma ideia do que posso fazer para corrigir isso?

5 Respostas

Marky.Vasconcelos

Que tal trabalhar com Objetos no modelo da sua JTable assim como voce faz com Lists?

Escrevi um artigo sobre isso.

RockZero

Agora que percebi o meu erro de português :oops: :roll: . Não PrenceherJtable é PreencherJtable , mas isso não é meu problema. hehehe
Mark_Ameba eu não consegui entender e achar alguma coisa no seu artigo para resolver meu problema. Eu não sei utilizar um Jtable, pra mim meu código parece estar certo. O código de carregar o arquivo txt, mesmo não sabendo bem pra que serve alguns comandos, sei que funciona. Tudo que fiz até agora foi graças aos artigos que tem aqui no GUJ, por enquanto não entendi muito bem o da Jtable e por isso não sei se o que estou fazendo no meu código e se está correto. Esse é o Jframe que fiz:

[IMG]http://img14.imageshack.us/img14/6253/programa1x.th.jpg[/IMG]

No menu arquivo, abrir arquivo, se eu usar esse código:

private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {                                           
        // TODO add your handling code here:
         String[] linha = new String[]{"1", "2", "3"};
         PreencherJtable(linha);

ele adiciona as linhas igual na figura.

Mas se por acaso fizer assim:
private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {                                           
        // TODO add your handling code here:
        
        carregar_arquivo p = new carregar_arquivo();
        try {
            p.carregar_txt1();
        } catch (FileNotFoundException ex) {
            Logger.getLogger(Automato_Finito_Deterministico.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(Automato_Finito_Deterministico.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

ai não acontece nada, não consigo adicionar nenhuma linha. Quer dizer lá na classe carregar arquivo quando eu chamo a função PreencherJtable passando um vetor de string não funciona. Alguem poderia me explicar o que estou fazendo de errado? Como utilizar o componente Jtable?

Marky.Vasconcelos

Sobre o que postei. Imagina. Voce tem as colunas QI, Simbolo e QF em uma classe seria mais ou menos o seguinte com a anotação que fiz.

public class Expressao {
@Resolvable
private int qi;
@Resolvable
private String simbolo;
@Resolvable
private int qf;
//getters e setters
}

A diferença estaria que no método preencherJTable(String[] args) voce pode fazer assim.

public void preencherJTable(Expressao exp){
ObjectTableModel objmodel = (ObjectTableModel) jTable1.getModel();
objModel.add(exp);
}

E voce precisaria criar esse objeto do String[] que retorna da linha e passar ao método.

Mas ao instanciar a JTable voce vai precisar passar esse TableModel para ela.
Algo como.

jTable1.setModel(new ObjectTableModel(new AnnotationResolver(Expressao.class).resolve("qi,simbolo,qf"));

Mas agora que analiseu seu problema é a hora de carregar os dados não exibilos.

RockZero

Mark_Ameba obrigado por continuar me ajudando. Eu entendi o código que você me enviou. No caso da expressão que é inserida la naquele JTextField eu vou usa-la depois para validar com o conteúdo da Jtable. A Jtable eu preencho com as regras do automato carregadas de um arquivo txt. Então o que eu passaria para a Jtable é o conteudo desse arquivo e não a expressão.
Eu tentei usar ObjectTableModel ao inves de DefaultTableModel, mas não consegui. O netbeans não reconhece e nem aparece aquele mensagem de import por exemplo.

Marky.Vasconcelos

Isso por que fui eu que fiz essa classe e voce precisa baixar os sources ou o jar que deixei no blog também.

Mas ao trabalhar com ObjectTableModel voce vai trabalhar com Objetos e não String[].

Na hora de ler os objetos voce nao precisa de getValueAt em cada coluna. Voce pode usar o getValue passando o numero da linha e voce tem o objeto Expressao respectivo.

Criado 1 de junho de 2009
Ultima resposta 3 de jun. de 2009
Respostas 5
Participantes 2