Seleção de linha na jtable com jcheckbox

7 respostas
A

Bom dia pessoal,

Tenho um TableModel para uma tabela onde sua primeira coluna é um checkbox...
Até ai tudo certo ... ele aparece certinho e ao clicar ele marca ou desmarca ...

Segue o código do tablemodel:
public class AtividadeOsTableModel extends AbstractTableModel {

    private static final long serialVersionUID = 1L;
    
    private String[] nomesColunas = {"", "Código", "Descrição da Atividade", "Ultima Prev.", 
                                     "Data Execução", "Próxima Prev.", "Status"};
    private Object[] objeto;
    private List<Object[]> listaObjetos;
    
    
    public AtividadeOsTableModel() {
        super();
        if (listaObjetos == null)
            listaObjetos = new ArrayList<Object[]>();
    }
    
    public AtividadeOsTableModel(List<Object[]> listaObject){
        super();
        listaObjetos = new ArrayList<Object[]>(listaObject);
    }
    
    public int getRowCount() {
        return this.listaObjetos.size();
    }

    public int getColumnCount() {
        return this.nomesColunas.length;
    }

    public Object getValueAt(int row, int col) {
        if (col == 0) {
            return (Boolean) listaObjetos.get(row)[col];
        } else if (col >= 1 && col <= 6) {
            return listaObjetos.get(row)[col];
        } else {
            return null;
        }
    }
    
    @Override
    public void setValueAt(Object value, int row, int col) {
        if (col == 0) {
            listaObjetos.get(row)[col] = (Boolean) value;
        } else if (col >= 1 && col <= 6) {
            listaObjetos.get(row)[col] = value;
        }
        fireTableDataChanged();
    }
    
    @Override
    public String getColumnName(int col){
        return this.nomesColunas[col];
    }
    
    @Override
    public Class<?> getColumnClass(int col){
        if (col == 0) {
            return Boolean.class;
        } else if (col >= 1 && col <= 6) {
            return String.class;
        } else {
            return null;
        }
    }
    
    @Override
    public boolean isCellEditable(int row, int col){
        if (col == 0)
            return true;
        else 
            return false;
    }
    
    public void adicionaLinhaEmBranco(){
        Object[] obj = new Object[] {Boolean.FALSE, "", "", "", "", "", ""};
        listaObjetos.add(obj);
        fireTableRowsInserted(getRowCount() - 1, getRowCount() - 1);
    }
    
    public void adiciona(Object[] obj){
        listaObjetos.add(obj);
        fireTableRowsInserted(getRowCount() - 1, getRowCount() - 1);
    }
    
    public void adicionaLista(List<Object[]> listaObj){
        limpar();
        int i = getRowCount();
        this.listaObjetos.addAll(listaObj);
        fireTableRowsInserted(i, i + getRowCount() - 1);
    }
    
    public void remove(int indice){
        listaObjetos.remove(indice);
        fireTableRowsDeleted(indice, indice);
    }
    
    public int getIndice(Object[] obj){
        return listaObjetos.indexOf(obj);
    }
    
    public Object[] getObjeto(int indice){
        return listaObjetos.get(indice);
    }
    
    public void setObjeto(Object[] obj){
        objeto = obj;
        listaObjetos.add(objeto);
    }
    
    public void limpar(){
        if (listaObjetos != null && !listaObjetos.isEmpty()){
            int i = getRowCount();
            listaObjetos.clear();
            fireTableRowsDeleted(0, i - 1);
        }
    }
    
    
}
Ok ... então meu problema é o seguinte... quero pegar o índice da linha que o usuário digitou com a função:
int linha = tbAtividades.getSelectedRow();
porém se eu utilizo a função isCellEditable como está abaixo ele seleciona o checkbox mas retorna a linha como -1
@Override
    public boolean isCellEditable(int row, int col){
        if (col == 0)
            return true;
        else 
            return false;
    }
e se eu usar a função desta maneira: ele traz o valor da linha como 0 por exemplo mas não seleciona o checkbox....
@Override
    public boolean isCellEditable(int row, int col){
        return false;
    }

como eu posso fazer para que seja selecionado o checkbox e ao mesmo tempo retornar o índice da linha selecionada corretamente???

Desde já grato

7 Respostas

R

já usou :
return true ?

A

Opa … tudo bem renlih…

já usei sim …
com return true, com return false e tb ja tentei usar sem a função … e sempre da no mesmo … ou ele seleciona o checkbox mas não retorna a linha … ou ele retorna a linha mas não seleciona o checkbox …

ja tentei fazer um renderer e um editor tb unicamente para essa coluna … mas por incrivel que pareça aconteceu o mesmo problema …

o estranho é que se eu seleciono qualquer outra célula da tabela que não seja da coluna 0 … ele retorna a linha selecionada certinho … mas quando clico no checkbox que está na coluna 0 … seja ele em qualquer linha … sempre retorna -1…

sabe porque pode estar acontecendo isso??? alguma luz?

obrigado

C

talvez isso te ajude

;]

A

Olá charleston10,

então, olhei o código que vc passou e na sua função de mouselistner tem uma linha assim…

que ao meu ponto de vista funciona parecido com:

na JTable …

porém é justamente ai que não estou conseguindo pegar o indice da linha que o usuário clicou na tabela, quando ele clica em qualquer célula da coluna 0(zero) …
e a função locationToIndex eu não encontrei para jtable …

tem alguma outra sugestão??

grato

C

Na verdade é assm, esse codigo do JTable ele nao pega o valor da coluna, mas sim qual linha vc selecionou, e isso
nao vai ser importante pra vc nesse seu caso.
Vc deve pegar o valor da celula, para isso o que será possivel fazer, pegar qual linha e depois disso saber qual coluna
vc esta. Atraves disso vc ja sabe a coordenada. Linha - Coluna (entao vc sabe a celula)

De uma olhada.
http://javaaberto.blogspot.com.br/2012/08/pega-codigo-selecionado-de-um-jtable.html

A

Opa …

então charleston … na verdade neste momento eu realmente preciso saber qual linha o usuario selecionou … pois tenho uma tabela que funciona assim …

tenho uma coluna com os checkboxes (coluna 0) na qual somente esta coluna vai ser editavel… as outras colunas são as datas das atividades na seguinte ordem … data da ultima revisão … data atual e data da proxima revisão … então quando eu seleciono uma linha no checkbox essas datas são atualizadas, o status da atividade é alterado e é realizada a baixa daquela atividade …

tenho o codigo pronto ja que faz isso … so que no meu codigo eu estou percorrendo toda a tabela para saber quais atividades foram marcadas e realizar tal processo … não queria fazer assim … quueria ir realizando a baixa conforme o usuário fosse clicando nos checkboxes …

por isso realmente preciso saber em qual linha ele clicou … para não ter que varrer a tabela toda vez que ele clicar para saber quais linhas foram selecionadas … entende??

vc teria alguma outra sugestão??

Grato

C

Outra sugestão é usar o JList q te mandei acima, pois ja esta tudo pronto.

O usuario seleciona todas as linhas depois ele aperta o botao dar baixa e pronto.
Nao tem muito que esquentar cabeça, ja ta feito pra isso mesmo.

;]

Criado 19 de abril de 2013
Ultima resposta 19 de abr. de 2013
Respostas 7
Participantes 3