Listener em uma Coluna Específica

9 respostas
L

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

9 Respostas

U

lucasmedinaa vc pode setá-los como setEnabled(false);

L

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

U

Se possível coloca o código para dar uma olhada.

U

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();

L
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;
	}
}
L

esse é o problema, não uso o componente check, eu só tenho um true ou false

U

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…

L

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

U

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.

Criado 13 de março de 2013
Ultima resposta 13 de mar. de 2013
Respostas 9
Participantes 2