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>Preferences>Java>Code Generation>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];
}
}