Olá, tenho um JTable feito num abstractTableModel, com o recurso defaultCellRender e na coluna 3 tenho checkbox em todas as linhas, como faço para quando selecionar um check, bloquear todos os outros
obs: minha tabela sempre atualiza (utilizando o fireTableDataChanged), portanto, quando eu dou um check, depois de um tempo a linha some, ou seja, nao tenho mais nnhum check selecionado, entao os outros checks devem ser desbloqueados
Listener em uma Coluna Específica
9 Respostas
lucasmedinaa vc pode setá-los como setEnabled(false);
isso eu sei, só não sei como adicionar um listener para esses checkbox, pq eles foram inseridos no abstractTableModel só como true ou false
Se possível coloca o código para dar uma olhada.
Olha v se o teu problema é este, vc quer verificar se o check está preenchido ou não e colocar o resultado na tabela.
Se for isso para verificar o check vc utiliza o isSelected();
import javax.swing.table.DefaultTableModel;
public class TableTest extends javax.swing.JFrame{
/**
* Creates new form testTable
*/
public TableTest() {
initComponents();
carregaTabela();
}
public final DefaultTableModel modelo =new javax.swing.table.DefaultTableModel(
new Object [][] {
},
new String [] {
"ID", "NOME", "EMAIL", "TESTE", "ATIVO"
}
) {
Class[] types = new Class [] {
java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.Boolean.class
};
boolean[] canEdit = new boolean [] {
false, false, false, false, true
};
public Class getColumnClass(int columnIndex) {
return types [columnIndex];
}
public boolean isCellEditable(int rowIndex, int columnIndex) {
return canEdit [columnIndex];
}
};
private void carregaTabela() {
// apenas para dar carga na tabela
String [] nomes={"AAA","BBB",
"CCC","DDD",
"EEE","FFF",
"FFF","HHH"
};
for (int i=0;i<8;i++){
Object[] row = new Object[4];
row[0]=i;
row[1]=nomes[i];
row[2]=nomes[i].toLowerCase()+"@email.org";
row[3]=false;
modelo.addRow(row);
}
jTable1.setModel(modelo);
// fim da carga
// a grande manha para funcionar, especifique um nome p/ a JTable
jTable1.setName("jTable1");
// aplica o ColorRender na tabela
jTable1.setDefaultRenderer(Object.class, new ColorRender());
jLbTotal.setText(jTable1.getRowCount()+"");
}
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
public class ColorRender extends DefaultTableCellRenderer {
@Override
public Component getTableCellRendererComponent(
JTable table, Object value,
boolean isSelected, boolean hasFocus,
int row, int column) {
super.getTableCellRendererComponent(table, value, isSelected,
hasFocus, row, column);
// seta o resultado p/ falso porque isso sera usado em varias Jtables do sistema
boolean result = false;
try{
// no nosso exemplo
if (table.getName() != null) { // p/ não escrever um null cada vez que carregar uma célula
if (table.getName().equals("jTable1")) {
result = (Boolean) table.getModel().getValueAt(row, 4);
}
}
}
catch (java.lang.NullPointerException ex){
System.out.println(ex.getMessage());
}
//se for uma linha selecionada
if (isSelected) {
setBackground(table.getSelectionBackground());
setForeground(table.getSelectionForeground());
} else {
// se o checkbox estiver selecionado
// pinta a linha inteira
if (result) {
setBackground(Color.YELLOW);
setForeground(Color.RED);
setFont(new Font("Verdana",Font.BOLD,10));
} else {
// se não , colore alternado as linhas
if (row % 2 == 0) {
setBackground(Color.LIGHT_GRAY);
setForeground(Color.black);
} else {
setBackground(Color.WHITE);
setForeground(Color.black);
}
}
}
return this;
}
}
esse é o problema, não uso o componente check, eu só tenho um true ou false
Cara pra falar a verdade ainda estou tentando entender tua dúvida.
Olha vc quer verificar um check, que na verdade não é um check, é só um true e false ao clicar sobre a tabela. E depois desbloquear os check, primeiro desbloquear seria desmarcar?
Se for isso q entendi então, lá vai.
Primeira vc ao invés de colocar o evento no check vc coloca na tabela, um evento de mouse, onde vc no evento deve pegar a posição na tabela:
tabela.getSelectedRow();
tabela.getSelectedColumn();
verifica os check que estão neles, utiliza o isSelected(); para verificar se estão true e false.
Para vc desbloquear os check utiliza:
check.setSelected(false);
caso os check estiverem sumindo da tabela ao atualizá-la então vc deve setar novamente o check na tabela.
Estou me esforçando para entender teu problema…
beleza, você conseguiu resolver um problema, que é adicionar um listener para a coluna, consegui assim
@Override
public void mouseClicked(MouseEvent arg0) {
if(arg0.getSource()==jTable1)
{
if(jTable1.getSelectedColumn()==4)
{
jTable1.setEnabled(false);
}
}
}
nesse caso coloquei a jtable como setEnabled(false), mais por teste, pq assim tb me serviria
depois que fizer minha atualização, gostaria que a tabela voltasse ao normal
pq, veja o que acontece.. quando clico no checkbox, a linha selecionada sumirá, mas nao posso selecionar mais de uma ,entao bloqueio o tabela quando selecionar um, mas quando fizer a atualização preciso desbloquear a tabela, ou quando nao tiver mais nenhum checkbox selecionado
para desbloquear a tabela vc tem que setá-la novamente, setEnabled(true); e dependendo que como esteja utilizando, vc deve tbm dar novamente um new nela.