Coluna tabela não oculta ao carregar a view

Olá pessoal criei uma tabela para carregar os dados do banco porém não gostaria que carregasse a coluna do ID, sei que bastaria eu fazer um select apenas nas colunas desejadas porém preciso do ID para editar ou excluir. Sendo assim pensei na possibilidade de ocultar a coluna da tabela, percorrendo alguns tópicos do GUJ percebi que já tinham gerado essa dúvida, porém assim que abre a view a coluna não oculta. segue o modelo do código usado:

VIEW

 public ViewAssunto() {
    initComponents();
    ocultarColunasTabela();
}

public void ocultarColunasTabela(){
    tblAssuntos.getColumnModel().getColumn(0).setMinWidth(0);
    tblAssuntos.getColumnModel().getColumn(0).setMaxWidth(0);
}

Achei que desta forma assim que fosse iniciado minha ViewAssunto as colunas seriam ocultas porém, permanecem visíveis. Como posso ocultar as mesmas assim que carregar a tela ?

Como vc está implementando a tabela? Se for java swing, vc consegue isso fácil implementando sua própria table model. Veja: https://www.staroski.com.br/posts/13 e https://devsv.wordpress.com/2012/07/08/como-implementar-um-tablemodel/

Olá @Lucas_Camara é Swing, realmente os códigos que estão na meu método ocultarColunasTabelas ocultam. Porém no evento Click de algum botão, quando tento colocar esse mesmo método no construtor da minha ViewAssunto() ele não funciona. E o objetivo seria quando a tela fosse carregada as colunas desejadas não aparecessem entendeu ?

Não sei se entendi muito bem, mas montei um exemplo aqui onde é possível alternar a visibilidade das colunas da tabela.

obs.: Talvez tenha forma mais simples de fazer. Talvez tenha usado mais código do que o necesśario

import java.awt.GridBagLayout;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.function.Function;
import java.util.stream.Collectors;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;

public class Main {
	
	public static void main(String[] args) throws Exception {
		JFrame frame = new JFrame();
		frame.setLayout(new GridBagLayout());
		
		List<Pessoa> pessoas = new ArrayList<>();
		pessoas.add(new Pessoa(1L, "Aaa", "Aaa"));
		pessoas.add(new Pessoa(2L, "Bbb", "Bbb"));
		pessoas.add(new Pessoa(3L, "Bbb", "Bbb"));
		
		// Table
		ModelPessoa model = new ModelPessoa(pessoas);
		JTable tablePessoa = new JTable(model);
		frame.getContentPane().add(new JScrollPane(tablePessoa), 0);
		
		JButton btnColumnId = new JButton("Toggle ID");
		btnColumnId.addActionListener((e) -> {
			model.toggleColumn("ID");
		});
		frame.getContentPane().add(btnColumnId, 1);
		
		JButton btnColumnNome = new JButton("Toggle Nome");
		btnColumnNome.addActionListener((e) -> {
			model.toggleColumn("NOME");
		});
		frame.getContentPane().add(btnColumnNome, 1);
		
		// JFrame
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.pack();
		frame.setLocationRelativeTo(null);
		frame.setVisible(true);
	}
	
	private static class ModelPessoa extends AbstractTableModel {
		private static final long serialVersionUID = 1L;
		
		private static final List<Coluna<Pessoa>> colunas = new ArrayList<>();
		
		static {
			colunas.add(new Coluna<Pessoa>("ID", "ID", Pessoa::getId));
			colunas.add(new Coluna<Pessoa>("NOME", "Nome", Pessoa::getNome));
			colunas.add(new Coluna<Pessoa>("SOBRENOME", "Sobrenome", Pessoa::getSobrenome));
		}
		
		private List<Pessoa> pessoas = new ArrayList<>();
		
		public ModelPessoa(List<Pessoa> pessoas) {
			this.pessoas = pessoas;
		}

		@Override
		public int getRowCount() {
			return pessoas.size();
		}

		@Override
		public int getColumnCount() {
			return (int) colunas.stream().filter(c -> c.visible).count();
		}

		@Override
		public Object getValueAt(int rowIndex, int columnIndex) {
			Pessoa pessoa = pessoas.get(rowIndex);
			return getColunaByIndex(columnIndex)
				.filter(c -> c.visible)
				.map(c -> c.getValue(pessoa))
				.orElse(null);
		}

		@Override
		public String getColumnName(int column) {
			return getColunaByIndex(column)
				.filter(c -> c.visible)
				.map(c -> c.descricao)
				.orElse("");
		}
		
		private Optional<Coluna<Pessoa>> getColunaByIndex(int columnIndex) {
			return Optional.of(colunas.stream()
				.filter(c -> c.visible)
				.collect(Collectors.toList())
				.get(columnIndex));
		}
		
		private Optional<Coluna<Pessoa>> getColunaByName(String nome) {
			return Optional.ofNullable(colunas.stream()
				.filter(c -> c.nome.equals(nome))
				.findFirst()
				.orElse(null));
		}
		
		public void toggleColumn(String nome) {
			getColunaByName(nome).ifPresent(c -> c.toggle());
			fireTableStructureChanged();
		}
	}
	
	private static class Coluna<T> {
		
		private final String nome;
		private final String descricao;
		
		private final Function<T, Object> fn;
		private Boolean visible;
		
		public Coluna(String nome, String descricao, Function<T, Object> fn) {
			this.nome = nome;
			this.descricao = descricao;
			this.fn = fn;
			this.visible = true;
		}
		
		public void toggle() {
			visible = !visible;
		}
		
		public Object getValue(T value) {
			return fn.apply(value);
		}
	}
	
	private static class Pessoa {
		
		private final Long id;
		private final String nome;
		private final String sobrenome;
		
		public Pessoa(Long id, String nome, String sobrenome) {
			this.id = id;
			this.nome = nome;
			this.sobrenome = sobrenome;
		}

		public Long getId() {
			return id;
		}

		public String getNome() {
			return nome;
		}

		public String getSobrenome() {
			return sobrenome;
		}
	}
}

obs.: Como faço apenas para exemplificar, eu costumo colocar todas as classes no mesmo arquivo como inner classes estáticas. Isso é apenas para agilizar.

Olá Lucas tentarei demonstrar com imagens,

Tabela Usuário


Repare que ela vem com todos os campos da minha base de dados pois preciso deles, estou preenchendo os campos com o click na linha da tabela desta forma:

tblUsuarios.getModel().getValueAt(setar, 0).toString()

Porém eu gostaria de mostrar a tabela somente desta forma assim que carregasse minha View:

Vendo alguns exemplos na internet de como ocultar a coluna construí um método para assim que carregar minha view as colunas desejadas ficarem invisíveis.

public void ocultarColunasTabela(){
    tblAssuntos.getColumnModel().getColumn(0).setMinWidth(0);
    tblAssuntos.getColumnModel().getColumn(0).setMaxWidth(0);
}

Chamei este método no construtor da view logo abaixo do initComponents() pensando que quando carregado já iria ocultar as colunas. Porém o que acontece é o contrário disso, a tabela é carregada com todas as colunas desconsiderando o método no qual eu coloquei para ser iniciado junto com o construtor da view.

O código que passei faz exatamente isso. Vc pode escolher quais colunas esconder, porém ele usa uma implementação customizada da model da tabela.

Do jeito que vc fez, parece que está usando DefaultTableModel, que dificulta muito a manipulação das colunas e dados da tabela.

Essas colunas que vc quer esconder, em algum outro momento vc vai querer que eles voltem a aparecer na tela?

1 curtida

Vou tentar implementar não entendo muito bem como constrói uma tabela desta forma, só sei arrastar rsrsrs. Não, a coluna será oculta sempre.

Entendi. Pior que nunca usei assim arrastando os componentes. Se quiser tentar criar sua própria Model, faça uma tentativa e poste aqui que a gente te ajuda.

1 curtida

Do jeito que fiz, a ideia que implementei era do usuário escolher quais colunas ele que mostar ou esconder, por isso o código ficou maior. Mas se for apenas para apresentar algumas colunas o código fica bem mais simples.

É isso o usuário não pode ver as outras colunas, as mesmas devem ficar ocultas sempre. Eu consegui fazer de uma forma mas não sei se é uma boa prática, deixei minha tabela public static e chamei o método de ocultar no botão que abre minha view usuário, fazendo desta forma ocultou do jeito que quero.
image

Entendi. Uai, se resolveu tah blz. Só recomendo que não fique refém apenas dessa forma de modelar telas. Nem que seja apenas para ver como funciona, tente fazer via código pois é onde tudo acontece.

1 curtida

Pode deixar, obrigado pela ajuda Lucas você é o kra.

Dá uma lida neste post que escrevi há algum tempo.

2 curtidas