Bloquear celula com base em uma condição

10 respostas
R

Tenho uma Jtable onde é lançado alguns resultados de testes. Como sou novato em java, gostaria de saber como faço para bloquear algumas células com base em uma condição.

eu tenho 4 condições que são escolhidas em um outro formulário e que ficam em uma coluna dessa jtable, Min e Max, Texto, No Min e No Max.
Na tabela eu tenho 2 campos para registrar os dados Resultado_Numerico e Resultado_Texto

Quando o teste for “Min e Max”, “No Min” e “No Max” quer dizer que a pessoa deve lançar o valor na coluna Resultado_Numerico e quando for “Texto” a pessoa deve lançar na coluna Resultado_texto.

Tem Cadastro que contem 120 teste e tem cadastro que contem 90…
para cada linha a pessoa deve lançar um desses valores.

Para evitar problemas na hora de cadastro, eu gostaria de travar a célula com base na explicação a cima, fazendo com que a pessoa registre os dados apenas na célula correta.

Alguém poderia me ajudar por favor?

10 Respostas

S

Sobrescreva o método isCellEditable de seu TableModel, de forma à atender suas condições.

V
R

staroki, como sou novo, estou um pouco confuso com tudo.

fico confuso pelo fato de ter celula que vai bloquear e ter q não

eu uso esse código para travar as outras colunas e deixar apenas essas aberta para lançar os dados…

poderia me dar uma resposta mais clara por favor?

public boolean isCellEditable(int row, int col) {

if (col == 30 || col == 31 || col == 32 || col == 33 ) {

return true;

} else {

return false;

}

}

};

S

O que não ficou claro?

Posta o código completo do seu TableModel.

R

Então, eu fico confuso como que vou fazer para checar linha por linha na coluna 26 que é a minha da condição

JComboBox combo;
    DefaultTableModel modelo = new DefaultTableModel(null, new String[]{"ID", "Ordem", "Linha", "Linha_Tipo",
        "Setor", "Perfil", "Bpcs", "Desc_Perfil", "Projeto", "OEM", "Nº_Desenho", "Nº_Plano", "Operação",
        "Equipamento", "Desc_Teste", "Complemento", "Cod_Teste", "Espec_Min", "Espec_Max",
        "Espec_Unid", "Espec_Texto", "Referência", "Frequência", "Freq_Unid", "Produto", "Origem",
        "Tipo", "Especificação", "Freq_Texto", "Laboratorio", "Resultado_Numerico", "Resultado_Texto",
        "Observação", "Aprovado"}) {
@Override
public boolean isCellEditable(int row, int col) {
            if (col == 30 || col == 31 || col == 32 || col == 33 ) {
                return true;
            } else {
                return false;
            }
        }
};
S

Você recebe como parâmetro a linha e coluna a ser verificada.
Não sei como você alimenta seu TableModel, mas achei estranho você usar o DefaultTableModel, o ideal é especializar o AbstractTableModel para renderizar a sua coleção de objetos.

De qualquer forma, acho que o exemplo abaixo vai te ajudar:

DefaultTableModel modelo = new DefaultTableModel(null, new String[] {
	"ID",                  //  0
	"Ordem",               //  1
	"Linha",               //  2
	"Linha_Tipo",          //  3
	"Setor",               //  4
	"Perfil",              //  5
	"Bpcs",                //  6
	"Desc_Perfil",         //  7
	"Projeto",             //  8
	"OEM",                 //  9
	"Nº_Desenho",          // 10
	"Nº_Plano",            // 11
	"Operação",            // 12
	"Equipamento",         // 13
	"Desc_Teste",          // 14
	"Complemento",         // 15
	"Cod_Teste",           // 16
	"Espec_Min",           // 17
	"Espec_Max",           // 18
	"Espec_Unid",          // 19
	"Espec_Texto",         // 20
	"Referência",          // 21
	"Frequência",          // 22
	"Freq_Unid",           // 23
	"Produto",             // 24
	"Origem",              // 25
	"Tipo",                // 26
	"Especificação",       // 27
	"Freq_Texto",          // 28
	"Laboratorio",         // 29
	"Resultado_Numerico",  // 30
	"Resultado_Texto",     // 31
	"Observação",          // 32
	"Aprovado"}) {         // 33

	@Override
	public boolean isCellEditable(int linha, int coluna) {
		switch (coluna) {
			case 30:
			case 31:
				String tipo = (String) getValueAt(linha, 26);
				if (tipo != null) {
					switch (tipo) {
						case "Min e Max":
						case "No Min":
						case "No Max":
							return coluna == 30;
						case "Texto":
							return coluna == 31;
						default:
							return false;
					}
				}
				return false;
			case 32:
			case 33:
				return true;
			default:
				return false;
		}
	}
};
R

Boa noite Staroski!

Deu super certo cara!! não sei nem como agradecer, muito obrigado mesmo!!!

Obrigado novamente!

R

Você sabe me dizer como faço para colorir as colunas que ele bloqueou para pessoa ver que estão bloqueadas?

S

Usando TableCellRenderer, tem um exemplo aqui.

R

staroski , como faço para mostrar todas as linhas da minha jtable após filtrar ? consigo inserir na jtable mas não aparece porque o filtro não deixa , mesmo depois de dar new na query que faz o filtro

private void txt_busca_pessoaKeyReleased(java.awt.event.KeyEvent evt) {                                             
    String query = txt_busca_pessoa.getText().toUpperCase();
    if (!query.isEmpty()) {
        TableRowSorter<TablePessoa> tr = new TableRowSorter<>(tableModelPessoa);
        this.tbl_pessoa.setRowSorter(tr);
        tr.setRowFilter(RowFilter.regexFilter(query));
    } 

}
Criado 19 de junho de 2017
Ultima resposta 11 de jul. de 2017
Respostas 10
Participantes 4