Navegando entre duas JTables

Bom dia pessoal,

Eu quero fazer uma janela onde na parte da esquerda haja um navegador com dois botões: quando eu apertar o botão 1, a parte da direita da tela mostra a tabela 1, e quando eu clicar o botão 2, a parte da direita da tela mostre a tabela 2.

Eu fiz o código abaixo baseado no tutorial de JTable do Bruno Lima, utilizando os arquivos MyJTableViewer.java e SimpleTableModel.java como base. Só que quando eu clico em cima de uma linha da tabela2, ele me mostra uma linha da tabela 1, e a tabela fica toda zoada.

Ajudas serão bem-vindas, grato desde já.

Segue o código:

import java.awt.BorderLayout;
import java.util.ArrayList;
import java.awt.event.*;

import javax.swing.*;

/**


  • Créditos : Bruno R. Lima


  • Construção: 25/05/2004

  • <p>

  • Classe de exemplo do tutorial sobre JTable.

  • Exemplo 2.

  • </p>

  • @author Bruno R. Lima
    */
    public class TwoTables extends JFrame {

    private JTable tabela = null;
    private JScrollPane scrollTabela = null;
    private JPanel pLeft;
    private JButton bTable1, bTable2;
    /**

    • Inicializa a classe *
      */
      public TwoTables() {
      // Cria o frame com o titulo super(“Tutorial:Simplificando A JTable parte 2”);
      // Cria o tamanho do frame
      setSize(600, 400);
      // Seta o conteudo do frame no centro: // Adiciona o JScrollPane que contem a JTable
      getContentPane().add(getScrollTabela(), BorderLayout.CENTER);
      pLeft=new JPanel();
      bTable1=new JButton(“Tabela 1”);
      bTable2=new JButton(“Tabela 2”);
      pLeft.add(bTable1);
      pLeft.add(bTable2);
      getContentPane().add(pLeft, BorderLayout.WEST);

      // Mostra o formulario na tela
      show();
      this.addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent e){
      System.exit(0);
      //f.setVisible(false);
      //nullDlg=true;
      }
      });
      bTable1.addMouseListener(new MouseAdapter(){
      public void mouseClicked(MouseEvent e){
      scrollTabela=null;
      tabela=null;

       	getContentPane().add(getScrollTabela("Tabela1"), BorderLayout.CENTER);
       	System.out.println("Tabela 1");
       	pack();
       	show();
      
         }
       });	
       bTable2.addMouseListener(new MouseAdapter(){
       public void mouseClicked(MouseEvent e){
       	scrollTabela=null;
       	tabela=null;
      
       	getContentPane().add(getScrollTabela("Tabela2"), BorderLayout.CENTER);
      
       	System.out.println("Tabela 2");
       	pack();
       	show();
      
      
         }
       });	
      

    }

    /**

    • Bloco principal
    • @param args
      */
      public static void main(String[] args) {
      TwoTables viewer = new TwoTables();
      }

    /**

    • Cria a jtable
    • @return
      */
      private JTable getTabela() {
      if (tabela == null) {
      tabela = createJTable();
      }
      return tabela;
      }
      private JTable getTabela(String tabela_name) {
      if (tabela == null) {
      tabela = createJTable(tabela_name);
      }
      return tabela;
      }

    /**

    • Cria o scroll onde irá conter a jtable
    • @return
      */
      private JScrollPane getScrollTabela() {
      if (scrollTabela == null) {
      scrollTabela = new JScrollPane(getTabela());
      scrollTabela.setVerticalScrollBarPolicy(
      ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
      }
      return scrollTabela; }

    private JScrollPane getScrollTabela(String tabela_name) {
    if (scrollTabela == null) {
    scrollTabela = new JScrollPane(getTabela(tabela_name));
    scrollTabela.setVerticalScrollBarPolicy(
    ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
    }
    return scrollTabela; }

    /**

    • Cria a JTable

    • @return
      */
      public JTable createJTable() {

      ArrayList dados = new ArrayList();
      String[] colunas = new String[] { “Estado”, “Cidade” };
      boolean [] edicao = {false, true};

      // Alimenta as linhas de dados
      dados.add(new String[] { “SP”, “São Paulo” });
      dados.add(new String[] { “RJ”, “Rio de Janeiro” });
      dados.add(new String[] { “RN”, “Rio Grande do Norte” });
      dados.add(new String[] { “ES”, “Espirito Santo” });

      SimpleTableModel modelo = new SimpleTableModel(dados, colunas, edicao);
      JTable jtable = new JTable(modelo);
      jtable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

      // Adiciona uma linha pelo modelo
      modelo.addRow(new String[]{“SC”,“Santa Catarina”});

      // Remove pelo indice
      modelo.removeRow(0); // Sao Paulo

      // Remove pelo valor
      modelo.removeRow(“RN”, 0);

      return jtable;

    }
    public JTable createJTable(String tabela_name) {

     ArrayList dados = new ArrayList();
     String[] colunas = new String[] { "Estado", "Cidade" };
     boolean [] edicao = {false, true};
     System.out.println("createJTable "+tabela_name);
     // Alimenta as linhas de dados
     if (tabela_name.equals("Tabela1")){
     	dados.add(new String[] { "SP", "São Paulo" });
     	dados.add(new String[] { "RJ", "Rio de Janeiro" });
     	dados.add(new String[] { "RN", "Rio Grande do Norte" });
     	dados.add(new String[] { "ES", "Espirito Santo" });
     }else if (tabela_name.equals("Tabela2")){
     	dados.add(new String[] { "TO", "Tocantins" });
     	dados.add(new String[] { "MT", "Mato Grosso" });
     
     }
    
    
     SimpleTableModel modelo = new SimpleTableModel(dados, colunas, edicao);
     JTable jtable = new JTable(modelo);
     jtable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
     
     // Adiciona uma linha pelo modelo
     modelo.addRow(new String[]{"SC","Santa Catarina"});
     
     // Remove pelo indice
     modelo.removeRow(0); // Sao Paulo
     
     // Remove pelo valor
     modelo.removeRow("RN", 0);
    
     return jtable;
    

    }

}

/********************************************

import java.util.ArrayList;
import java.util.Iterator;

import javax.swing.table.AbstractTableModel;

/*

  • Created on 25/05/2004
  • To change the template for this generated file go to
  • Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
    */

/**


  • Créditos : Bruno R. Lima


  • Construção: 25/05/2004

  • <p>

  • Classe que extende a AbstractTableModel.

  • Faz uma implementação do modelo de tabela para uma JTable

  • </p>

  • @author Bruno R. Lima
    */
    public class SimpleTableModel extends AbstractTableModel{

    private ArrayList linhas = null;
    private String [] colunas = null;
    private boolean [] colsEdicao;

    /**

    • Contrutor para a classe, recebendo os dados a serem exibidos
    • e as colunas que devem ser criadas.
    • @param dados
    • @param colunas
      */
      public SimpleTableModel(ArrayList dados, String[] colunas, boolean [] edicao){
      setLinhas(dados);
      setColunas(colunas);
      colsEdicao = edicao;
      }

    /**

    • Retorna o numero de colunas no modelo
    • @see javax.swing.table.TableModel#getColumnCount()
      */
      public int getColumnCount() {return getColunas().length;}

    /**

    • Retorna o numero de linhas existentes no modelo
    • @see javax.swing.table.TableModel#getRowCount()
      */
      public int getRowCount() {return getLinhas().size();}

    /**

    • Obtem o valor na linha e coluna
    • @see javax.swing.table.TableModel#getValueAt(int, int)
      */
      public Object getValueAt(int rowIndex, int columnIndex) {
      // Obtem a linha, que é uma String []
      String [] linha = (String [])getLinhas().get(rowIndex);
      // Retorna o objeto que esta na coluna
      return linha[columnIndex];
      }

    public String[] getColunas() {return colunas;}
    public ArrayList getLinhas() {return linhas;}
    public void setColunas(String[] strings) {colunas = strings;}
    public void setLinhas(ArrayList list) {linhas = list;}

    /**

    • Seta o valor na linha e coluna
    • @see javax.swing.table.TableModel#setValueAt(java.lang.Object, int, int)
      /
      public void setValueAt(Object value, int row, int col){
      // Obtem a linha, que é uma String []
      String [] linha = (String [])getLinhas().get(row);
      // Altera o conteudo no indice da coluna passado
      linha[col] = (String)value;
      // dispara o evento de celula alterada
      fireTableCellUpdated(row,col);
      }
      /
      *
    • Retorna se a celula pode ser editada
    • @see javax.swing.table.TableModel#isCellEditable(int, int)
      */
      public boolean isCellEditable(int row, int col){
      return colsEdicao[col];
      }

    /**

    • Adiciona o array na linha
      */
      public void addRow( String [] dadosLinha){
      getLinhas().add(dadosLinha);
      // Informa a jtable de que houve linhas incluidas no modelo
      // COmo adicionamos no final, pegamos o tamanho total do modelo
      // menos 1 para obter a linha incluida.
      int linha = getLinhas().size()-1;
      fireTableRowsInserted(linha,linha);
      return;
      }

    /**

    • Remove a linha pelo indice informado
    • @param row
      */
      public void removeRow(int row){
      getLinhas().remove(0);
      // informa a jtable que houve dados deletados passando a
      // linha reovida
      fireTableRowsDeleted(row,row);
      }

    /**

    • Remove a linha pelo valor da coluna informada
    • @param val
    • @param col
    • @return
      */
      public boolean removeRow(String val, int col){
      // obtem o iterator
      Iterator i = getLinhas().iterator();
      int linha = 0;
      // Faz um looping em cima das linhas
      while(i.hasNext()){
      // Obtem as colunas da linha atual
      String[] linhaCorrente = (String[])i.next();
      linha++;
      // compara o conteudo String da linha atual na coluna desejada
      // com o valor informado
      if( linhaCorrente[col].equals(val) ){
      getLinhas().remove(linha);
      // informa a jtable que houve dados deletados passando a
      // linha removida
      fireTableRowsDeleted(linha,linha);
      return true;
      }
      }
      // Nao encontrou nada
      return false;
      }

    /**

    • Retorna o nome da coluna.
    • @see javax.swing.table.TableModel#getColumnName(int)
      */
      public String getColumnName(int col){
      return getColunas()[col];
      }

}

Hauhauahahau… :shock: Que bagunça… heheehehehe
Mas vamos lá…
O teu problema é que no evento de clique no botão, vc esta adicionando inumeras vezes o scroll no painel, dai um sobrepoe o outro e vira uma zona.
Segue o codigo alterado pra fucnionar: apenas removi a instancia da scroll criada no seu contentpane()

[code] bTable1.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {

			// Aqui esta a correção
			getContentPane&#40;&#41;.remove&#40;scrollTabela&#41;;
			//------------------------------

			scrollTabela = null;
			tabela = null;

			getContentPane&#40;&#41;.add&#40;getScrollTabela&#40;&quot;Tabela1&quot;&#41;,
					BorderLayout.CENTER&#41;;
			System.out.println&#40;&quot;Tabela 1&quot;&#41;;
			pack&#40;&#41;;
			show&#40;&#41;;

		&#125;
	&#125;&#41;;
	bTable2.addMouseListener&#40;new MouseAdapter&#40;&#41; &#123;
		public void mouseClicked&#40;MouseEvent e&#41; &#123;

			// Aqui esta a correção
			getContentPane&#40;&#41;.remove&#40;scrollTabela&#41;;
			//------------------------------

			scrollTabela = null;
			tabela = null;

			getContentPane&#40;&#41;.add&#40;getScrollTabela&#40;&quot;Tabela2&quot;&#41;,
					BorderLayout.CENTER&#41;;

			System.out.println&#40;&quot;Tabela 2&quot;&#41;;
			pack&#40;&#41;;
			show&#40;&#41;;

		&#125;
	&#125;&#41;;

[/code]

Agora, acho melhor tu fazer outra coisa: muda só o modelo da JTable, acho que dá menas bagunça, dai vc so vai trocando o modelo conforme eh clicado em cada botão.

flw!

Valeu mano, deu certo!

Obrigado!