Coluna Invísvel no TableModel[RESOLVIDO]

Boa Noite!

Eu estou desenvolvendo um aplicativo básico com tablemodel que abri aqui, mas tenho uma dúvida: eu consigo deixar um coluna invisível.
por exemplo:

Tem 3 Coluna: nome, idade, nascimento e uma coluna invisível com nome de cargo.

no Aplicativo ela não aparece, mas ela esta lá, e caso eu clique sobre a linha eu consiga pegar o valor que essa coluna tem?

Obrigado.

Você pode implementar os métodos do TableModel (getValueAt, getColumnName, etc) para exibir apenas as três colunas citadas. E cria um método adicional que retorna o objeto referente a uma linha em específico.

Supondo que sua classe de domínio se chame Funcionario, o método ficaria mais ou menos assim:

public Funcionario getFuncionario(int indiceLinha) { return lista.get(indiceLinha); // lista neste caso seria uma List de funcionários do seu TableModel }
Este método retorna o funcionário com todos os atributos, inclusive os que não foram mostrados na JTable.

[quote=Eric Yuzo]Você pode implementar os métodos do TableModel (getValueAt, getColumnName, etc) para exibir apenas as três colunas citadas. E cria um método adicional que retorna o objeto referente a uma linha em específico.

Supondo que sua classe de domínio se chame Funcionario, o método ficaria mais ou menos assim:

public Funcionario getFuncionario(int indiceLinha) { return lista.get(indiceLinha); // lista neste caso seria uma List de funcionários do seu TableModel }
Este método retorna o funcionário com todos os atributos, inclusive os que não foram mostrados na JTable.[/quote]
Vlw pela Resposta, Eric!!

Desculpa Cara, Mas eu não entendi direito.

Eu crio esse método dentro do meu TableModel ou dentro da tela Principal?

Porque assim no meu programa, quando eu clico sobre uma linha ele seta os valores que estão na tabela, em seus campos.
Mas eu só consigo fazer isso se tiver a coluna, porque ai eu uso o getValueAt(row,column).

Vlwww

No seu TableModel.

O getValueAt não é a melhor opção para recuperar os dados da JTable.

Com o objeto Funcionario em mãos, você pode recuperar os atributos pelos getters e setar nos campos de sua tela.

[quote=Eric Yuzo]No seu TableModel.

O getValueAt não é a melhor opção para recuperar os dados da JTable.

Com o objeto Funcionario em mãos, você pode recuperar os atributos pelos getters e setar nos campos de sua tela.[/quote]

Vou mostrar a linha que eu faço os set da tabela para os campos.

[code]private void tableMouseClicked(java.awt.event.MouseEvent evt) {

    Pessoa p = new Pessoa();
   
    int linhaSelecionada = table.getSelectedRow();
                 tfData.setText(table.getValueAt(linhaSelecionada, 1).toString());
                 tfMotivo.setText(table.getValueAt(linhaSelecionada, 2).toString());
                 tfSaida.setText(table.getValueAt(linhaSelecionada, 3).toString());
                 tfChegada.setText(table.getValueAt(linhaSelecionada, 4).toString());
                 tfKmRodado.setText(table.getValueAt(linhaSelecionada, 5).toString());
                 tfCodigoReferencia.setText(table.getValueAt(linhaSelecionada, 0).toString());
                 
 
}              [/code]

Eu faço a inserção dos valores na tabela, pelos getters e setters tbm:

[code]if(evt.getKeyCode() == KeyEvent.VK_ENTER){
if(tfMotivo.getText().trim().equals("")){
System.out.println(“Faltou Valor no campo Motivo”);
}else{
if(tfData.getText().trim().equals("")){
System.out.println(“Faltou Valor no campo Data”);
}else{
if(tfSaida.getText().trim().equals("")){
System.out.println(“Faltou Valor no Campo Saida”);
}else{
if(tfChegada.getText().trim().equals("")){
System.out.println(“Faltou Valor no Campo Chegada”);
}else{
if(tfKmRodado.getText().trim().equals("")){
System.out.println(“Faltou Valor no Campo Km Rodado”);
}else{
if(tfLinkMap.getText().trim().equals("")){
System.out.println(“Faltou Valor no Campo LinkMap”);

        }else{
        int num = 0;
        int coluna = table.getRowCount();
     
        Pessoa p = new Pessoa();
        

        coluna++;
            p.setCodigoReferencia(coluna);
            p.setDatalancamento (tfData.getText());
            p.setMotivo         (tfMotivo.getText());
            p.setSaida          (tfSaida.getText());
            p.setChegada        (tfChegada.getText());
            p.setKmrodado       (Integer.parseInt(tfKmRodado.getText()));
        
            model.inserir(p);
            limparCampos();
        }
        }
        }
        }
    }
}[/code]

Sera eu deveria mudar alguma coisa no meu programa?
Vlw Eric.

Você chegou a criar um TableModel para a classe Pessoa?

Sim, Eu utilizei os modelo de TableModel que encontrei no Forum.
Segue ele:

[code]public class ProdutoTableModel extends AbstractTableModel{

private final int coluna_codigo = 0;
private final int coluna_datalancamento = 1;
private final int coluna_motivo = 2;
private final int coluna_saida = 3;
private final int coluna_chegada = 4;
private final int coluna_kmrodado = 5;

private List<Pessoa> pessoa;

public ProdutoTableModel(){
    this.pessoa = new ArrayList<Pessoa>();
}
public ProdutoTableModel(List<Pessoa> lista){
    this();
    this.pessoa.addAll(lista);
}
public int getRowCount(){
    return pessoa.size();

}
public int getColumnCount(){
    return 6;

}
List<Pessoa> lista = new ArrayList<Pessoa>();




@Override
public String getColumnName(int coluna){
        if (coluna == coluna_codigo)return "Codigo";
        if (coluna == coluna_datalancamento)return "Data Lançamento";
        if (coluna == coluna_motivo)return "Motivo";
        if (coluna == coluna_saida)return "Saida";
        if (coluna == coluna_chegada)return "Chegada";
        if (coluna == coluna_kmrodado)return "KM Rodado";
        return "";
}
@Override
public Class<?> getColumnClass(int coluna){
        if( coluna == coluna_codigo )               return Integer.class;
        else if(coluna == coluna_datalancamento)     return String.class;
        else if (coluna == coluna_motivo)            return String.class;
        else if (coluna == coluna_saida)             return String.class;
        else if (coluna == coluna_chegada)           return String.class;
        else if (coluna == coluna_kmrodado)          return Integer.class;
        return null;
}
public Object getValueAt(int LinhaIndex,int coluna)
{
    if(LinhaIndex > -1 && LinhaIndex < pessoa.size()){
        Pessoa p = pessoa.get(LinhaIndex);
        if      (coluna == coluna_codigo)           return p.getCodigoReferencia();
        else if (coluna == coluna_datalancamento)   return p.getDatalancamento();
        else if (coluna == coluna_motivo)           return p.getMotivo();
        else if (coluna == coluna_saida)            return p.getSaida();
        else if (coluna == coluna_chegada)          return p.getChegada();
        else if (coluna == coluna_kmrodado)         return p.getKmrodado();
    }
        return null;
}

@Override
public void setValueAt(Object aValue, int linhaIndex, int coluna)
{

    Pessoa p = pessoa.get(linhaIndex);
    if      ( coluna == coluna_codigo)              p.setCodigoReferencia(Integer.parseInt(aValue.toString()));
    else if (coluna == coluna_datalancamento)       p.setDatalancamento(aValue.toString());
    else if ( coluna == coluna_motivo)              p.setMotivo(aValue.toString());
    else if ( coluna == coluna_saida)               p.setSaida(aValue.toString());
    else if ( coluna == coluna_chegada)             p.setChegada(aValue.toString());
    else if ( coluna == coluna_kmrodado)            p.setKmrodado(Integer.parseInt(aValue.toString()));

    fireTableDataChanged();
}
@Override
public boolean isCellEditable(int linhaIndex,int colunaIndex)
{
    return false;
}
public List<Pessoa> getPessoas(){
    return Collections.unmodifiableList(pessoa);
}

public void inserir(Pessoa p){
    pessoa.add(p);
    fireTableDataChanged();

}

public void excluir(int pos){
    pessoa.remove(pos);

    fireTableDataChanged();
}
public void excluir(Pessoa p){
    pessoa.remove(p);
    
    fireTableDataChanged();
}
public void atualiza(Pessoa p){
    fireTableDataChanged();
}
[/code]

Então, você pode criar no seu TableModel um método “getPessoa” como falei antes.

Na hora de preencher os campos, você faz o seguinte:

[code] int linhaSelecionada = table.getSelectedRow();

                 PessoaTableModel model = (PessoaTableModel) table.getModel();

                 Pessoa pessoa = model.getPessoa(linhaSelecionada);

                 tfData.setText(pessoa.getDataLancamento());
                 tfMotivo.setText(pessoa.getMotivo());
                 // E assim por diante...[/code]

Desta forma, você pode pegar qualquer atributo do objeto Pessoa, mesmo que não haja uma coluna para ele na JTable.

E dê uma revisada no nome do seu TableModel. Ele se chama ProdutoTableModel, mas possui uma lista de pessoas. Seria mais indicado se chamar PessoaTableModel.

Valeu! Eric!

Era isso mesmo que eu queria!!! funcionou do jeito que eu queria!!!

Mto Obrigado!