Java Tips: Operações com JTable parte 3
Introdução
Vamos mostrar mais algumas dicas interessantes da class JTable do Java. Outras dicas do JTable podem ser encontradas nos posts anteriores:
Java Tips: Operações com JTable parte 1
Java Tips: Operações com JTable parte 2
- Manipulando o conteúdo da tabela
- Tratando evento de mudança de dados na tabela
- Usando ComboBox (JcomboBox) nas células da sua tabela
// inserindo dados em uma tabela com 4 colunas DefaultTableModel tableModel = (DefaultTableModel) minhaTabela.getModel(); tableModel.insertRow(tableModel.getRowCount(), new Object[]{ "Douglas", "Villanacci", "douglas.pasqua@gmail.com", "11111111"}); tableModel.insertRow(tableModel.getRowCount(), new Object[]{ "Fulano", "da Silva", "fulano.silva@blalbla.com", "11111111"}); // limpando todo o conteúdo da tabela DefaultTableModel tableModel = (DefaultTableModel) minhaTabela.getModel(); tableModel.getDataVector().removeAllElements(); minhaTabela.updateUI(); // alterando o valor de determinada linha e coluna da tabela: Linha (1), Coluna (1) // linha e coluna começam com valor 0 TableModel model = (TableModel) minhaTabela.getModel(); model.setValueAt("Josefina", 0, 0); // obtendo valor de determinado campo na tabela, informando Linha(2) e Coluna(1) // linha e coluna começam com valor 0 TableModel model = (TableModel) minhaTabela.getModel(); String value = (String) model.getValueAt(1, 0); System.out.println(value);
Caso você tenha campos editáveis na sua tabela, você pode em algum momento querer executar alguma ação quando um valor de um campo da sua tabela sofrer alterações.
Para que você possa controlar as mudanças realizadas na edição da sua tabela, é necessário monitorar o evento de alteração através do listener TableModelListener.
// monitorando o evento através de TableModelListener minhaTabela.getModel().addTableModelListener(new TableModelListener() { @Override public void tableChanged(TableModelEvent e) { int linha = e.getFirstRow(); int coluna = e.getColumn(); TableModel model = (TableModel) e.getSource(); System.out.println("Você alterou a linha " + linha + ", coluna " + coluna); System.out.println("Valor da célula alterada: " + model.getValueAt(linha, coluna)); } });
É possível associar um JComboBox (caixa de seleção) à uma coluna da sua tabela. É uma forma de facilitar a vida do usuário. Ao invés do usuário digitar um valor para a célula, ele simplesmente escolhe um valor dentre vários, através de uma caixa de seleção. Recurso bem interessante e elegante.
No exemplo abaixo, vamos associar um combo box para a quinta coluna da tabela. (Lembre-se que a numeração das colunas começa por 0). O usuário poderá escolher entre “Masculino” ou “Feminino”:
// Obtendo à referencia para a 5 coluna da tabela TableColumn column = minhaTabela.getColumnModel().getColumn(4); // Criando o ComboBox JComboBox comboSexo = new JComboBox(); // Definindo os valores para o ComboBox DefaultComboBoxModel comboModel = new DefaultComboBoxModel(new String[] { "Masculino", "Feminino" }); comboSexo.setModel(comboModel); // Associando o ComboBox para a coluna column.setCellEditor(new DefaultCellEditor(comboSexo));
Veja ilustração:
Java Tips: Operações com JTable parte 2
Introdução
Neste artigo teremos mais alguns exemplos de manipulação de tabelas do JTable do Java. Já abordamos o JTable em um artigo anterior. Portanto, este artigo serve como complemento ao anterior.
- Bloqueando a seleção de linhas/colunas baseado em uma determinada condição.
int linhas = 10; int colunas = 3; JTable table = new JTable(linhas, colunas) { public void changeSelection(int row, int column, boolean toggle, boolean extend) { DefaultTableModel m = (DefaultTableModel) getModel(); /* não permite a seleção da linha quando o valor da coluna 3 for igual fechado */ if (m.getValueAt(row, 2) != null && m.getValueAt(row, 2).toString().toLowerCase().equals("fechado")) { return; } super.changeSelection(row, column, toggle, extend); } };
Determina também a cor de fundo/primeiro plano da linha selecionada. Você esta livre para inserir outras lógicas que achar necessário além desse exemplo básico que verifica somente o valor de uma determinada coluna.
int linhas = 5; int colunas = 3; JTable table = new JTable(linhas, colunas) { public Component prepareRenderer(TableCellRenderer renderer, int rowIndex, int vColIndex) { DefaultTableModel m = (DefaultTableModel) getModel(); Component c = super.prepareRenderer(renderer, rowIndex, vColIndex); // altera a cor de background da linha para vermelho e foreground para branco // quando o valor da coluna 3 for igual a fechado if (m.getValueAt(rowIndex, 2).toString().toLowerCase().equals("fechado")) { c.setBackground(new Color(192, 0, 0)); c.setForeground(Color.white); } else { // mantem a cor padrão de foreground c.setForeground(getForeground()); // determina a cor de background da linha selecionada if(isCellSelected(rowIndex, vColIndex)) { c.setBackground(new Color(184, 207, 229)); } else { // linhas não selecionadas, manter cor de background padrão c.setBackground(getBackground()); } } return c; } };
Exemplo de visualização:
O código abaixo pode ser utilizado para renderizar o JTable novamente quando for preciso. No caso de mudança de dados que influencie na lógica usada em algum dos métodos anteriores.
table.updateUI();
Mais dicas
Java Tips: Operações com JTable parte 1
Java Tips: Operações com JTable parte 3
Java Tips: Operações com JTable
Neste artigo reuni algumas operações úteis realizadas com o componente JTable do Java. Vamos à elas:
- Instanciando um JTable, já inserindo dentro de um JScroll, que desabilita o usuário poder editar suas células:
int linhas = 10; int colunas = 2; JTable table = new JTable(linhas, colunas) { public boolean isCellEditable(int rowIndex, int vColIndex) { return false; } }; JScrollPane scrollPane = new JScrollPane(table);
- Bloqueia o usuário de redimensionar as colunas da tabela:
table.getTableHeader().setResizingAllowed(false);
- Bloqueia o usuário de trocar a posição das colunas via drap and drop.
table.getTableHeader().setReorderingAllowed(false);
- Alterando o nome das duas primeiras colunas da tabela dinâmicamente:
table.getColumnModel().getColumn(0).setHeaderValue("Coluna 1"); table.getColumnModel().getColumn(1).setHeaderValue("Coluna 2");
- Definindo um tamanho fixo para largura das duas primeiras colunas:
table.getColumnModel().getColumn(0).setPreferredWidth(115); table.getColumnModel().getColumn(1).setPreferredWidth(661);
- Desativando o auto redimensionamento da tabela:
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
- Permite apenas seleção simples (somente 1 linha):
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
- Tratando evento de dois clicks do mouse em cima de uma linha da abela:
table.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2) { JTable target = (JTable)e.getSource(); int linha = target.getSelectedRow(); // linha selecionada int coluna = target.getSelectedColumn(); // coluna selecionada System.out.println("Linha: " + linha); System.out.println("Coluna: " + coluna); } } });
Espero que essas dicas possam ajudar você de alguma forma. Todas elas foram úteis para mim em algum momento, portanto achei importante compartilhar.
Mais dicas
Java Tips: Operações com JTable parte 2
Java Tips: Operações com JTable parte 3