Linahs em jTable!

7 respostas
andre_bento

Olá galera..
Estou precisando de uma ajuda aqui com uma jTable...
O problema é o seguinte.. .estou listando em uma jTable as contas cadastradas no sistema... mas o que está acontecendo é que as contas estão aparecendo de maneira que estão saltando linhas.. .tipo... uma conta cadastrada com a data 08/02/09 esta aparecendo na décima linha... ae vem outra com uma data 22/02/09 e está aparecendo na trigésima linha... não sei por quê isso está ocorrendo... gostaria que elas ficassem sim ordenadas por data... isso elas estão... mas não gostaria que ficassem essas linhas sobrando sem nenhum conteúdo!!!
Segue o código da jTable...

public JPanel criaTabJaneiro(){
		pnlJaneiro = new JPanel();
		pnlJaneiro.setLayout(new BorderLayout());
		pnlTotalContasJaneiro = new JPanel();
		pnlTotalContasJaneiro.setLayout(new FlowLayout(0));
		
		jTableJaneiro = new JTable(controleContas.getTabelModelConsulta());
		scrollTabela = new JScrollPane(jTableJaneiro,ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
		ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
		pnl1.add(scrollTabela);
	
		 
		 
		jTableJaneiro.getColumnModel().getColumn(0).setPreferredWidth(190);   
		jTableJaneiro.getColumnModel().getColumn(0).setResizable(true);
		jTableJaneiro.getColumnModel().getColumn(1).setPreferredWidth(100);   
		jTableJaneiro.getColumnModel().getColumn(1).setResizable(false);   
		jTableJaneiro.getColumnModel().getColumn(2).setPreferredWidth(100);   
		jTableJaneiro.getColumnModel().getColumn(2).setResizable(false); 
		jTableJaneiro.getColumnModel().getColumn(3).setPreferredWidth(190);   
		jTableJaneiro.getColumnModel().getColumn(3).setResizable(true);  
		jTableJaneiro.getColumnModel().getColumn(4).setPreferredWidth(130);   
		jTableJaneiro.getColumnModel().getColumn(4).setResizable(false); 
		
		
		jTableJaneiro.getTableHeader().setReorderingAllowed(true);   
		jTableJaneiro.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_OFF);   
		jTableJaneiro.setColumnSelectionInterval(0,1);   
		jTableJaneiro.setSelectionMode(0);   
		
		
		lblTotalContas = new JLabel("Total de contas a pagar no mês de Janeiro: "+"R$");
		lblTotalContas.setForeground(Color.red);
		lblTotalContas.setFont(new Font("",Font.BOLD,13));
		txtTotalContas = new JTextField(7);
		txtTotalContas.setEditable(false);
		txtTotalContas.setText(calculaTotalContas());
		
		
		pnlTotalContasJaneiro.add(lblTotalContas);
		pnlTotalContasJaneiro.add(txtTotalContas);
	
		pnlJaneiro.add(pnl1,BorderLayout.CENTER);
		pnlJaneiro.add(pnlTotalContasJaneiro,BorderLayout.SOUTH);
		
		return pnlJaneiro;
	}

Se não fui claro em alguma coisa por favor me respondam que tentarei explicar melhor!!!
Agradecido pela ajuda!!!
André Felipe

7 Respostas

C

Para montar a tabela [Conteúdo das Colunas].

public void PreencheTabela() {
		DefaultTableModel tabela = (DefaultTableModel) getJTable().getModel();
		tabela.setNumRows(0);
		tabela.addColumn("Acomodação");
	}

Preencher conteúdo das células de linha e coluna

public void iniTabela() {
		DefaultTableModel tabela = (DefaultTableModel) getJTable().getModel();
		tabela.setNumRows(0);
		ResultSet rs = null;
		rs = Acomodacao.consultarAcomodacao();
		try {
			while (rs.next()) {
				tabela.addRow(new Object[] { rs.getString("nome") });
			}
		} catch (SQLException e) {
			JOptionPane.showMessageDialog(null, e.getMessage(),
					"SCP - Software", JOptionPane.INFORMATION_MESSAGE);
		}
	}

Chamando os métodos

public TelaVisualizacaoReserva() {
		getJContentPane_Principal().add(getJPanel(), BorderLayout.CENTER);
		getJFrame_Principal().setTitle("Mapa de Reserva - Newtec");
		PreencheTabela();
                                iniTabela();
		getJFrame_Principal().setVisible(true);
	}

Espero que tenha ajudado, qualquer dúvida é só falar…

sf.marcius

opa!

pelo que eu entendi, acredito que tenha 2 soluções:

  1. ou vc implementa uma TableModel que garanta a ordem de inserção dos elementos (uma ArrayList, por ex) e já traz os dados ordenados… Parece que Set não garante a ordem dos elementos

  2. ou vc implementa um TableRowSorter e seta na JTable, inserindo assim a funcionalidade de ordenar a jtable por qualquer uma das colunas, clicando no seu header.

[]s

andre_bento

Olá amigos!
Obrigado pela ajuda!!
Estou tentando fazer como amigo sf.marcius falou…
MAs como faço para minha TableRowSorter receber os dados da jTable???
Podem me mandar um código para eu ver como funfa???
Valeu pela ajuda galera!!!

ViniGodoy

Tem ainda a alternativa de fornecer um auto-filtro para seu usuário, e deixar que ele ordene como quiser as linhas.

Dá uma olhada:
http://www.guj.com.br/posts/list/100793.java

sf.marcius

andre_bento:
Olá amigos!
Obrigado pela ajuda!!
Estou tentando fazer como amigo sf.marcius falou…
MAs como faço para minha TableRowSorter receber os dados da jTable???
Podem me mandar um código para eu ver como funfa???
Valeu pela ajuda galera!!!

quem recebe os dados é o TableModel.

o TableRowSorter só provê um meio de ordenar os dados através de uma espécie de wrapper para o underlying model.

dá uma lida qui…
http://java.sun.com/javase/6/docs/api/javax/swing/table/TableRowSorter.html

[]s

andre_bento

Olá galera!!
Consegui resolver esse problema… meu problema estava na hora de preencher com meu resultDados… ele estava com um contador para todas as peletas… o que acontecia é que ele ia ajeitando cada conta em seu mês… mas quando achava uma conta no mês de Janeiro por exemplo ele ia arrumar mas com o contador alto… por isso ficava saltando aquele monte de linhas!!!

Mas agora estou com outro problema… não estou conseguindo delimitar a quantidade de linhas para somente os registros existentes… tipo… .se em Janeiro só tem 5 contas cadastradas só quero que a jTable de Janeiro tenha 5 linhas!!!
Obrigado pela ajuda!!!

sf.marcius

voce implementou um TableModel próprio, ou está usando o DefaultTableModel?

digamos que cada coluna da minha JTable deve representar um atributo da classe Entidade…
eu geralmente crio um método pra preencher a tabela mais ou menos assim (está meio abstraído):

void fillTable(JTable table, Collection<Entidade> entidades) {
    MyTableModel model = (MyTableModel) table.getModel();
    model.clear();
    for (Entidade e : entidades) {
        model.addEntidade(e);
    }
    table.updateUI();
}

MyTableModel seria mais ou menos assim:

public class MyTableModel extends AbstractTableModel
{
    private List<Entidade> elements = new ArrayList<Entidade>();

    public MyTableModel()
    {
        super();
    }

    // implementar aqui os metodos de AbstractTableModel........

    public void addEntidade(Entidade e)
    {
        elements.add(e);
        super.fireTableDataChanged();
    }
    
    public void clear()
    {
        elements.clear();
        super.fireTableDataChanged();
    }
}

e entao usaria:

  • criar JTable;
  • criar MyTableModel
  • setar MyTableModel criado na Jtable
  • efetuar a pesquisa e por o resultado numa collection
  • fillTable(table_criada, dados_pesquisa)

Desse jeito, somente o resultado da pesquisa será mostrada na jtable
sem linhas em branco ou lixo de pesquisas anteriores…

[]'s

Criado 3 de fevereiro de 2009
Ultima resposta 4 de fev. de 2009
Respostas 7
Participantes 4