Olá galera!
Fiz um modelo para a minha JTable, onde no primeiro campo aparece um checkBox, mas eu não consigo marca-lo!
O que está faltando?
Código:
public class ProdutoTableModel extends AbstractTableModel {
private final int COL_CHECK = 0;
private final int COL_NOME = 1;
private final int COL_QUANT = 2;
private List<Produto> produtos;
public ProdutoTableModel() {
produtos = new ArrayList<Produto>();
}
public ProdutoTableModel(List<Produto> lista) {
this();
produtos.addAll(lista);
}
public int getRowCount() {
return produtos.size();
}
public int getColumnCount() {
return 3;
}
@Override
public String getColumnName(int column) {
if (column == COL_CHECK){
return "#";
}
if (column == COL_NOME) {
return "Nome";
} else if (column == COL_QUANT) {
return "Quant. Disp";
}
return "";
}
@Override
public Class<?> getColumnClass(int columnIndex) {
if (columnIndex == COL_CHECK){
return Boolean.class;
}
if (columnIndex == COL_NOME) {
return String.class;
} else if (columnIndex == COL_QUANT) {
return Integer.class;
}
return super.getColumnClass(columnIndex);
}
public Object getValueAt(int rowIndex, int columnIndex) {
Produto p = produtos.get(rowIndex);
if (columnIndex == COL_CHECK){
return new Boolean(false);
}
if (columnIndex == COL_NOME) {
return p.getNome();
} else if (columnIndex == COL_QUANT) {
return p.getQuant();
}
return "";
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return (columnIndex == COL_CHECK);
}
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
Produto p = produtos.get(rowIndex);
if (columnIndex == COL_CHECK){
new Boolean(true);
}
if (columnIndex == COL_NOME) {
p.setNome(aValue.toString());
} else if (columnIndex == COL_QUANT) {
p.setQuant(Integer.parseInt(aValue.toString()));
}
fireTableDataChanged();
}
Agradeço a ajuda!
Teria que setar o valor do campo boolean do seu produto.
[code]@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
Produto p = produtos.get(rowIndex);
if (columnIndex == COL_CHECK){
p.setCampoBoolean((Boolean) aValue);
}[/code]
Outra coisa é que seu getValueAt está sempre retornando false. A JTable exibe os dados a partir do getValueAt, então se retornar sempre false, o checkBox ficará sempre desmarcado.
[quote=Eric Yuzo]Teria que setar o valor do campo boolean do seu produto.
[code]@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
Produto p = produtos.get(rowIndex);
if (columnIndex == COL_CHECK){
p.setCampoBoolean((Boolean) aValue);
}[/code]
Outra coisa é que seu getValueAt está sempre retornando false. A JTable exibe os dados a partir do getValueAt, então se retornar sempre false, o checkBox ficará sempre desmarcado.[/quote]
Na verdade o produto não tem um campo boolean, eu apenas necessito que na JTable tenha um campo para que eu possa marcar várias linhas e posteriormente inserir os produtos marcados em uma List
Quanto ao getValueAt eu apenas coloquei True como valor inicial, gostaria de saber como eu posso marcá-lo!
Valeu!
Na verdade deveria existir um campo que guarde o estado, não tem como fazer diretamente no getValueAt e setValueAt, estes métodos servem apenas para setar e recuperar valor de um atributo, como fazem os getters e setters normalmente.
O TableModel deveria trabalhar com uma única classe. Talvez você possa criar uma classe “ProdutoAdicionado”, por exemplo, e nele guardar a referência de um produto e permitir a seleção ou não.
[code]public class ProdutoAdicionado {
private Produto produto; // faz referência ao produto, para ser usado no table model.
private boolean selecionado; // este campo definirá o comportamento do check box da tabela.
. . .
}[/code]
if (columnIndex == COL_CHECK){
return new Boolean(false);
}
Retornando sempre false, ele nunca será marcado.
O setValueAt pode até ser chamado, mas com esse return false vai ficar sempre não selecionado.
[quote=Eric Yuzo]Na verdade deveria existir um campo que guarde o estado, não tem como fazer diretamente no getValueAt e setValueAt, estes métodos servem apenas para setar e recuperar valor de um atributo, como fazem os getters e setters normalmente.
O TableModel deveria trabalhar com uma única classe. Talvez você possa criar uma classe “ProdutoAdicionado”, por exemplo, e nele guardar a referência de um produto e permitir a seleção ou não.
[code]public class ProdutoAdicionado {
private Produto produto; // faz referência ao produto, para ser usado no table model.
private boolean selecionado; // este campo definirá o comportamento do check box da tabela.
. . .
}[/code][/quote]
Fiz como vc me falou!
Criei um atributo do tipo Boolean.
e lá no método setValueAt, onde o Mark se referia, ficou assim:
[code]public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
Produto p = produtos.get(rowIndex);
if (columnIndex == COL_CHECK){
p.setSelecionado((Boolean) aValue);//Aqui
}
if (columnIndex == COL_NOME) {
p.setNome(aValue.toString());
} else if (columnIndex == COL_QUANT) {
p.setQuant(Integer.parseInt(aValue.toString()));
}
fireTableDataChanged();
}[/code]
Então… tudo resolvido!
Agradeço a todos pela ajuda!