Esta é parte final de uma série que apresenta conceitos e exemplos sobre o uso e a customização de componentes Swing avançados. Na primeira parte, foi apresentado o componente JComboBox, além dos conceitos de modelos e cell renderers do Swing. Vimos também como reunir essas várias classes para formar um componente Swing customizado. Os exemplos foram baseados em um protótipo de aplicação de monitoração de rede, que exibe ícones específicos para os sistemas operacionais de cada host sendo monitorado, além de fazer uso de várias customizações visuais dos componentes.

Esta segunda parte enfoca o componente JTable, utilizando o mesmo protótipo como exemplo. O JTable reutiliza algumas das classes do JComboBox e necessita de vários modelos e cell renderers especializados para lidar com a formatação de células, colunas e cabeçalhos.

Para mais detalhes sobre a arquitetura do Swing em geral e o relacionamento entre componentes e os vários tipos de classes que participam da sua implementação, consulte o quadro “Componentes e classes do Swing”. E no quadro “Dicas do NetBeans” apresentamos alguns recursos oferecidos por este IDE livre para auxiliar na customização de componentes pela criação de classes especializadas.

A tela de Hosts / JTable

A tela de exemplo para esta segunda parte exibe uma relação de hosts, fornecendo informações como o sistema operacional, o endereço IP e o total de memória RAM. A relação de hosts será armazenada em uma coleção, mais especificamente um List, cujo conteúdo será pré-fixado pelo código da aplicação.

Para que o JTable seja capaz de exibir em linhas e colunas as informações contidas nesta coleção, é necessário fornecer uma classe de modelo que implementa a interface TableModel. A Listagem 1 apresenta a classe de modelo criada e a aplicação de testes. O resultado da sua execução pode ser visto na Figura 1.

HostTableModel.java
 package jtable;
  
 import dados.Host;
 import dados.SistemaOperacional;
 import java.util.*;
 import javax.swing.table.*;
  
 public class HostTableModel extends AbstractTableModel {
   private List hosts;
   private String[] colunas = { "Nome", "Endereço IP", "S.O.", "RAM" };
  
   public HostTableModel(List hosts) {
     super();
     setHosts(hosts);
   }
   public int getColumnCount() {
     return 4;
   }
   public int getRowCount() {
     return hosts.size();
   }
   public String getColumnName(int column) {
     return colunas[column];
   }
  
   public Object getValueAt(int row, int column) {
     Host host = hosts.get(row);
     switch (column) {
       case 0:
         return host.getNome();
       case 1:
         return host.getIp();
       case 2:
         return host.getSo();
       case 3:
         return host.getMemoriaRAM();
     }
     return null;
   }
  
   public List getHosts() {
     return hosts;
   }
   public void setHosts(List hosts) {
     this.hosts = hosts;
   }
 }

  JanelaPrincipal.java
 package jtable;
  
 import dados.Host;
 import java.util.*;
 import javax.swing.table.*;
  
 public class JanelaPrincipal extends javax.swing.JFrame {
   
   private List hosts = new ArrayList();
   
   public JanelaPrincipal() {
     initComponents();
   }
  
   public List getHosts() {
     return hosts;
   }
  
   public void setHosts(List hosts) {
     tabelaHosts.setModel(new HostTableModel(hosts));
   }
   
   private void initComponents() {
     jScrollPane1 = new javax.swing.JScrollPane();
     tabelaHosts = new JTable();
  
     setDefaultCloseOperation(
         javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
     setTitle("Java Magazine - Demo do JTable");
     jScrollPane1.setViewportView(tabelaHosts);
  
     getContentPane().add(jScrollPane1, java.awt.BorderLayout.CENTER);
     pack();
   }
   
   private javax.swing.JScrollPane jScrollPane1;
   private javax.swing.JTable tabelaHosts;  
 }
 
  Principal.java
 package jtable;
  
 import dados.Host;
 import dados.SistemaOperacional;
 import java.util.*;
  
 public class Principal {
   public static void main(String[] args) {
     List hosts = new ArrayList();
     hosts.add(new Host("servidor", "192.168.0.1", SistemaOperacional.LINUX, 2048));
     hosts.add(new Host("firewall", "192.168.0.2", SistemaOperacional.LINUX, 128));
     hosts.add(new Host("contabilidade", "192.168.0.11", SistemaOperacional.WINDOWS, 256));
     hosts.add(new Host("rh", "192.168.0.12", SistemaOperacional.WINDOWS, 512));
     hosts.add(new Host("diretoria", "192.168.0.20", SistemaOperacional.WINDOWS, 512));
     hosts.add(new Host("marketing", "192.168.0.33", SistemaOperacional.MACOSX, 1024));
     
     JanelaPrincipal frame = new JanelaPrincipal();
     frame.setHosts(hosts);
     frame.setVisible(true);
   }  
 }  ... 
Quer ler esse conteúdo completo? Tenha acesso completo