Atualizar jTable o inserir registro no banco

32 respostas
P

Ola a todos, estou com um probleminha aqui, criei uma jTable para mostrar os dados no banco, ele mostra tudo certinho, porém quando vou inserir um novo registro ele não atualiza o table, para que isso acontece eu tenho que fechar a tela e abri-la de novo, ja tentei usar fireTableDataChanged e o repaint e nenhum dos dois funcionou, continua o mesmo problema.

public class ProgramaHistoricoTableModel extends AbstractTableModel {  
	private static final long serialVersionUID = 1L;

	private List<ProgramaHistorico> pHistorico;

	public ProgramaHistoricoTableModel() {
		// no construtor, instanciamos o List
		pHistorico  = new ArrayList<ProgramaHistorico>();
	}

	
	public ProgramaHistoricoTableModel(List<ProgramaHistorico> lista) {
		this();
		pHistorico.addAll(lista);
	}

	@Override
	public Class<?> getColumnClass(int coluna) {
		return String.class;
	}

	public int getColumnCount() {
		return 5;
	}

	@Override
	public String getColumnName(int coluna) {
		switch (coluna) {
		case 0:
			return "ProgId"; 
		case 1:
			return "IdHistórico";
		case 2:
			return "Data"; 
		case 3:
			return "Hora"; 
		case 4:
			return "Programador"; 
		
		default:
			return ""; 
		}
	}

	public int getRowCount() {
		return pHistorico.size();
	}

	public Object getValueAt(int linha, int coluna) {
		ProgramaHistorico ph = (ProgramaHistorico)pHistorico.get(linha);
		switch (coluna) {
		case 0:
			return ph.getProgId(); 
		case 1:
			return ph.getIdprogramahistorico();
		case 2:
			return ph.getData(); 
		case 3:
			return ph.getHora(); 
		case 4:
			return ph.getProgramador(); 
		default:
			return null; 
		}
	}

	@Override
	public boolean isCellEditable(int rowIndex, int columnIndex) {
		return false;
	}

	
	public void setValueAt(ProgramaHistorico valor) {
		ProgramaHistorico c = new ProgramaHistorico();
		if (pHistorico.size() != 0){
			c = pHistorico.get(pHistorico.size() + 1);
		}	
		for (int i = 0; i < 4; i++) {
			switch (i) {
			case 0:
				c.setProgId(valor.getProgId()); 
				break;
			case 1:
				c.setProgId(valor.getProgId());
				break;
			case 2:
				c.setProgId(valor.getProgId());
				break;
			case 3:
				c.setProgId(valor.getProgId());
				break;
			}
		}
		fireTableDataChanged();
	}

	
	public void adiciona(ProgramaHistorico ph) {
		pHistorico.add(ph);
		fireTableRowsInserted(pHistorico.size() - 1, pHistorico.size() - 1);
	}

	public void remove(int indice) {
		pHistorico.remove(indice);
		fireTableRowsDeleted(indice, indice);
	}

	
	public int getIndice(Programa c) {
		return pHistorico.indexOf(c);
	}

	
	public void adicionaLista(List<ProgramaHistorico> lista) {
		int i = pHistorico.size();
		pHistorico.addAll(lista);
		fireTableRowsInserted(i, i + lista.size());
	}

	public void limpaLista() {
		int i = pHistorico.size();
		pHistorico.clear();
		fireTableRowsDeleted(0, i - 1);
	}
	
	

}

método que substituiria o table

public void refreshTable(){
		//jtable.repaint();
		model.fireTableDataChanged();
		jtable.repaint();
		JPanelSEProgramas tab = new JPanelSEProgramas();
		tab.instanciaComponentes();
		
	}

desde ja agradeço…até mais

32 Respostas

P

.

M

Mas voce adicionou o novo objeto no model?

P

O que seria isso? Só para subir o post? …
Eu axo que tá faltando vc adicionar o novo objeto no model…
Bom ver que usuários estão dexando o default table model pra lá =)

M

Huahua… depois de tanta gente reclamando do DefaultTableModel o povo realmente ta parando. É tipo um virus, estamos infectando a idéia.

P

Podíamos parar um tempo…
Assim eles sofrem um pouco mais, e talvez desistam da área, dando mais oportunidades pra gente! kkkkk
(Zuera ;D)

V

Posta o código onde você faz a inclusão do novo objeto.
O método refreshTable() é inútil. Pode apaga-lo.

S

Cria um método para preencher o jtable e depois é só chamar caso a gravação do registro ser concluída com sucesso!!

P

aqui eu chamo o método refreshTable que irá setar os valores do objeto

}else {
		dao.createHistorico(prog);
		seProg.refreshTable(prog);
		                				
}

no refresh viou chamar o setValueAte passar o objeto atualizado como parametro

public void refreshTable(ProgramaHistorico prog){
		model.setValueAt(prog);
		model.fireTableDataChanged();
		jtable.repaint();
		
	}

e aqui eu seto os valores…só que a tabela continua a mesma…

public void setValueAt(ProgramaHistorico prog) {
		ProgramaHistorico c = new ProgramaHistorico();
		if (pHistorico.size() != 0){
			c = pHistorico.get(pHistorico.size() + 1);
		}	
		for (int i = 0; i < 4; i++) {
			switch (i) {
			case 0:
				c.setProgId(prog.getProgId()); 
				break;
			case 1:
				c.setIdprogramahistorico(prog.getIdprogramahistorico());
				break;
			case 2:
				c.setProgramador(prog.getProgramador());
				break;
			case 3:
				c.setDescricao(prog.getDescricao());
			case 4:
				c.setData(prog.getData());
			case 5:
				c.setHora(prog.getHora());
				break;
			}
		}
		fireTableDataChanged();
	}
P

eu não consigo entender aonde deveria ser chamado o método setValueAt e onde que eu iria iniciar esses parâmetros, “Valor”, “linha” e “coluna”

V

Não entendi. Você cria um novo objeto e não chama o método adiciona do seu model? Pq vc está chamando o setValueAt?

Para que algo a mais pareça no seu JTable, você deve chamar o método adiciona! Ele é que vai incluir o método na lista interna do model e avisar a table que tem um objeto a mais por lá.

P

sim eu alterei aqui e passei a chamar o método adiciona e passo o objeto com os dados a serem adicionados

model.adiciona(prog);

porém ao debugar o método adicionar percebi que meu List “pHistorico” que deveria conter os outros registro ja existentes esta vazio… pode ser isso?

public void adiciona(ProgramaHistorico ph) {
		pHistorico.add(ph);
		fireTableRowsInserted(pHistorico.size() - 1, pHistorico.size() - 1);
	}

depois do adiciona é preciso chamar outro metodo pa atualizar a Table?

V

Com certeza pode ser isso.

Não, mais nada.

P

pois é…tentei alimentar a lista de novo mais mesmo assim não teve geito…to perdendo as esperanças ja

=/

V

Acho que o primeiro passo é descobrir pq a tua lista tá vazia, se devia estar cheia.

Pode postar o código que usa esse model? O da interface gráfica?

P

o método refreh eu chamo em outra janela…

private JButton getJButtonOk() {
		if (jButtonOk == null) {
			jButtonOk = new JButton();
			jButtonOk.setRequestFocusEnabled(false);
			jButtonOk.setBounds(87, 213, 105, 26);
			jButtonOk.setText("   Ok       ");
			jButtonOk.setIcon(new ImageIcon("C:/ISHistorico/images/icons/20x20/Save.gif"));
			jButtonOk.addActionListener(new java.awt.event.ActionListener() { 
				public void actionPerformed(java.awt.event.ActionEvent e) {    
					 try {
						 	JPanelSEProgramas seProg = new JPanelSEProgramas();
						 	prog = new ProgramaHistorico();
		                	ProgramasDaoImpl<ProgramaHistorico> dao = new ProgramasDaoImpl<ProgramaHistorico>();
		                			prog.setProgId(progid); 
		                			prog.setDescricao(jEditorTextAreaDescricao.getText());
		                			prog.setProgramador(jMaxLenTextFieldProgramador.getText());
		                			prog.setData((GregorianCalendar)jDateTextFieldData.getDate());
		                			prog.setHora(jHHMMTextFieldHoraAtend.getText());
		                			if (alterar){
		                				dao.updateHistorico(prog);
		                			}else {
		                				dao.createHistorico(prog);
		                				seProg.refreshTable(prog);
		                				
		                			}
		                			limpar();
		                }
		                catch (Exception ei){
		                	ei.printStackTrace();
		                }
				}
			});
		}
		return jButtonOk;
	}

e é nele que eu chamo o adicionar

public  JScrollPane instanciaComponentes() { 
		model = new ProgramaHistoricoTableModel();
		model.addTableModelListener(this);
		model.adicionaLista(ProgramasDaoImpl.listarHistoricosProgramas(progId));
		jtable = new JTable();
		jtable.setModel(model);
		scrollPane = new JScrollPane();
		scrollPane.setViewportView(jtable);
		
		jtable.setSize(new Dimension(241, 101));
		scrollPane.setBounds(4, 111, 616, 413);
		
		return scrollPane;
		
	}
	
	public void refreshTable(ProgramaHistorico prog){
		model.adiciona(prog,prog.getProgId());
		instanciaComponentes();
		jtable.repaint();
		
	}
P

ele não acusa erro nenhum, simplesmente a tabela num sofre alteração nenhuma

P

nda?

P

não conseguiu nda ViniGodoy ?

V

Posta todo o código que usa o model. O conteúdo do seu ArrayList não pode estar simplesmente desaparecendo.

P

o model…

public class ProgramaHistoricoTableModel extends AbstractTableModel {  
	private static final long serialVersionUID = 1L;

	private List<ProgramaHistorico> pHistorico;

	public ProgramaHistoricoTableModel() {
		// no construtor, instanciamos o List
		pHistorico  = new ArrayList<ProgramaHistorico>();
	}

	
	public ProgramaHistoricoTableModel(List<ProgramaHistorico> lista) {
		this();
		pHistorico.addAll(lista);
	}

	@Override
	public Class<?> getColumnClass(int coluna) {
		return String.class;
	}

	public int getColumnCount() {
		return 5;
	}

	@Override
	public String getColumnName(int coluna) {
		switch (coluna) {
		case 0:
			return "ProgId"; 
		case 1:
			return "IdHistórico";
		case 2:
			return "Data"; 
		case 3:
			return "Hora"; 
		case 4:
			return "Programador"; 
		
		default:
			return ""; 
		}
	}

	public int getRowCount() {
		return pHistorico.size();
	}

	public Object getValueAt(int linha, int coluna) {
		ProgramaHistorico ph = (ProgramaHistorico)pHistorico.get(linha);
		switch (coluna) {
		case 0:
			return ph.getProgId(); 
		case 1:
			return ph.getIdprogramahistorico();
		case 2:
			SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
			return sdf.format(ph.getData().getTime()); 
		case 3:
			return ph.getHora(); 
		case 4:
			return ph.getProgramador(); 
		default:
			return null; 
		}
	}
	
	
	@Override
	public boolean isCellEditable(int rowIndex, int columnIndex) {
		return false;
	}

	
	/*public void setValueAt(ProgramaHistorico prog) {
		ProgramaHistorico c = new ProgramaHistorico();
		if (pHistorico.size() != 0){
			c = pHistorico.get(pHistorico.size() + 1);
		}	
		for (int i = 0; i < 4; i++) {
			switch (i) {
			case 0:
				c.setProgId(prog.getProgId()); 
				break;
			case 1:
				c.setIdprogramahistorico(prog.getIdprogramahistorico());
				break;
			case 2:
				c.setProgramador(prog.getProgramador());
				break;
			case 3:
				c.setDescricao(prog.getDescricao());
			case 4:
				c.setData(prog.getData());
			case 5:
				c.setHora(prog.getHora());
				break;
			}
		}
		fireTableDataChanged();
	}*/
	
	
	  @Override  
	     public void setValueAt(Object valor, int linha, int coluna) {  
	         // aqui devemos atualizar o valor de nossos Clientes  
	         // vemos em qual linha ele está  
	         ProgramaHistorico c = new ProgramaHistorico();  
	         // e vemos o que será atualizado  
	     	for (int i = 0; i < 6; i++) {
				switch (i) {
				case 0:
					c.setProgId(((ProgramaHistorico) valor).getProgId()); 
					break;
				case 1:
					c.setIdprogramahistorico(((ProgramaHistorico) valor).getIdprogramahistorico());
					break;
				case 2:
					c.setProgramador(((ProgramaHistorico) valor).getProgramador());
					break;
				case 3:
					c.setDescricao(((ProgramaHistorico) valor).getDescricao());
					break;
				case 4:
					c.setData(((ProgramaHistorico) valor).getData());
					break;
				case 5:
					c.setHora(((ProgramaHistorico) valor).getHora());
					break;
				}
			}
	         pHistorico.add(c);
	         // é importante notificar os listeners a cada alteração daew assim...
	         
	         fireTableDataChanged();  
	     }  

	
	public void adiciona(ProgramaHistorico ph, int progId) {
		adicionaLista(ProgramasDaoImpl.listarHistoricosProgramas(progId));
		pHistorico.add(ph);
		fireTableRowsInserted(pHistorico.size() - 1, pHistorico.size() - 1);
	}

	public void remove(int indice) {
		pHistorico.remove(indice);
		fireTableRowsDeleted(indice, indice);
	}

	
	public int getIndice(Programa c) {
		return pHistorico.indexOf(c);
	}

	
	public void adicionaLista(List<ProgramaHistorico> lista) {
		int i = pHistorico.size();
		pHistorico.addAll(lista);
		fireTableRowsInserted(i, i + lista.size());
	}

	public void limpaLista() {
		int i = pHistorico.size();
		pHistorico.clear();
		fireTableRowsDeleted(0, i - 1);
	}
	
	

}

neste metodo refrehTbale eu chamo o “adiciona” do model

public void refreshTable(ProgramaHistorico prog){
	  	model.adiciona(prog,prog.getProgId());
		model.adicionaLista(ProgramasDaoImpl.listarHistoricosProgramas(progId));
		jtable.setModel(model);
		jtable.repaint();
	}

e mesme alimenta minha lista novamente através do “listarHistoricosProgramas(progId)” a taberla não é alterada…

V

Põe o código todo da classe onde o método refreshTable está. Eu havia pedido o código que usa o model, não o código do model em si. Esse vc já havia postado e aparentemente está certo.

Como eu já falei ali atrás, não deveria haver um método como o refreshTable.

P

ops..foi mals..

public class JPanelSEProgramas extends javax.swing.JFrame implements TableModelListener  {

	
	private JPanel jPanelSE = null;
	
	private JLabel jLabelNome = null;
	private JMaxLenTextField jMaxLenTextFieldNome = null;
	private JMaxLenTextField jMaxLenTextFieldDesc = null;
	private JLabel jLabelProgId = null;
	private JNumberTextField jNumberTextFieldProgId = null;
	private String msg = null;
	private int progId = 0;
	private boolean alterar = false;
	private String descricao = null;  //  @jve:decl-index=0:
	
	private JButton jButtonIncluir;
	private JButton jButtonAlterar;
	private JButton jButtonExcluir;
	private JButton jButtonOk;
	private JButton jButtonDescricao;
	
	private ProgramaHistoricoTableModel model;
	private JScrollPane scrollPane;
	
	Programa prog = new Programa(); //  @jve:decl-index=0:
	private ProgramasDaoImpl progDao;//  @jve:decl-index=0:
	
	
	public static final int MODULO_LAB = 0;
	public static final int MODULO_TAB = 1;
	public static final int MODULO_ADM = 2;
	public static final String MODULO_LIST[] = {"LAB","TAB","ADM"};  //  @jve:decl-index=0:
	
	
	private String desc;  //  @jve:decl-index=0:
	
	TableModel m = new DefaultTableModel();  
	JTable jtable = new JTable(m);  
	
	private JLabel jLabelModulo = null;
	private JComboBox jComboBoxModulo = null;
	
	public JPanelSEProgramas(List<Programa> list) {
		alterar = true;
		progId = list.get(0).getProgId();
		instanciaComponentes();
		initialize();
		initializeComponents(list);
	}
	
	public JPanelSEProgramas() {
		instanciaComponentes();
		initialize();
	}
	
	
	
	public void initialize(){
		this.setBounds(new Rectangle(0, 0, 740, 600));
		this.add(getJPanelSE(), java.awt.BorderLayout.CENTER);
		this.setTitle("Cadastro de Programas");
	}
	
	public void initializeComponents(List<Programa> list){
		jNumberTextFieldProgId.setNumber(list.get(0).getProgId());
		jNumberTextFieldProgId.setEnabled(false);
		msg = list.get(0).getDescricao();
		jMaxLenTextFieldNome.setText(list.get(0).getNomePrograma());
		jComboBoxModulo.setSelectedIndex(list.get(0).getModulo());
		} 
	
	private JPanel getJPanelSE(){
		if(jPanelSE == null){ 
			jPanelSE = new JPanel();	
			jPanelSE.setBounds(0, 0, 731, 584);
			jPanelSE.setLayout(null);
			jPanelSE.add(getJButtonIncluir());
			jPanelSE.add(getJButtonAlterar());
			jPanelSE.add(getJButtonExcluir());
			jPanelSE.add(getJButtonOk());
			jPanelSE.add(getJButtonDescricao());
			jPanelSE.add(getJLabelProgId());
			jPanelSE.add(getJLabelNome());
			jPanelSE.add(getJLabelModulo());
			jPanelSE.add(getJNumberTextFieldProgId());
			jPanelSE.add(getJMaxLenTextFieldNome());
			jPanelSE.add(getJComboBoxModulo());
			add(scrollPane);
	}
		return 	jPanelSE;
	}
	
/****************************************   NOME   *********************************************/
	
	
	private JLabel getJLabelNome() {
		if (jLabelNome == null){
			jLabelNome = new JLabel();
			jLabelNome.setBounds(12, 31, 47, 16);
			jLabelNome.setText("Nome");
			jLabelNome.setLabelFor(jMaxLenTextFieldNome);
		}
		return jLabelNome;
	}
	
	private JMaxLenTextField getJMaxLenTextFieldNome() {
		if (jMaxLenTextFieldNome == null){
			jMaxLenTextFieldNome = new JMaxLenTextField();
			jMaxLenTextFieldNome.setBounds(73, 27, 241, 20);
		}
		return jMaxLenTextFieldNome;
	}
	
/****************************************   PROGID   *********************************************/
	
	
	
	private JLabel getJLabelProgId() {
		if (jLabelProgId == null){
			jLabelProgId = new JLabel();
			jLabelProgId.setBounds(12, 9, 47, 16);
			jLabelProgId.setText("ProgID");
			jLabelProgId.setLabelFor(jComboBoxModulo);
		}
		return jLabelProgId;
	}
	
	private JNumberTextField getJNumberTextFieldProgId() {
		if (jNumberTextFieldProgId == null){
			jNumberTextFieldProgId = new JNumberTextField();
			jNumberTextFieldProgId.setBounds(73, 5, 97, 20);
		}
		return jNumberTextFieldProgId;
	}
	
	/****************************************   MÓDULO   *********************************************/
	
	
	
	private JLabel getJLabelModulo() {
		if (jLabelModulo == null){
			jLabelModulo = new JLabel();
			jLabelModulo.setBounds(12, 53, 47, 16);
			jLabelModulo.setText("Módulo");
			jLabelModulo.setLabelFor(jComboBoxModulo);
		}
		return jLabelModulo;
	}
	
	private JComboBox getJComboBoxModulo() {
		if (jComboBoxModulo == null) {
			jComboBoxModulo = new JComboBox();
			jComboBoxModulo.setBounds(73, 49, 138, 20);
			for (int i = 0; i < MODULO_LIST.length; i++) {
				jComboBoxModulo.addItem(MODULO_LIST[i]);
			}
		}
		return jComboBoxModulo;
	}
	
	
/****************************************   OUTROS   *********************************************/	
	
	private JButton getJButtonIncluir() {
		if (jButtonIncluir == null) {
			jButtonIncluir = new JButton();
			jButtonIncluir.setRequestFocusEnabled(false);
			jButtonIncluir.setIcon(new ImageIcon("C:/ISHistorico/images/icons/20x20/DocumentIn.gif"));
			jButtonIncluir.setBounds(631, 111, 98, 26);
			jButtonIncluir.setText("Incluir");
			jButtonIncluir.addActionListener(new java.awt.event.ActionListener() {   
				public void actionPerformed(java.awt.event.ActionEvent e) {  
					new JPanelSeHistorico(progId).setVisible(true);
					
				} 
			
			});
		}
		return jButtonIncluir;
	}
	
	
	private JButton getJButtonAlterar() {
		if (jButtonAlterar == null) {
			jButtonAlterar = new JButton();
			jButtonAlterar.setRequestFocusEnabled(false);
			jButtonAlterar.setIcon(new ImageIcon("C:/ISHistorico/images/icons/20x20/DocumentDraw.gif"));
			jButtonAlterar.setBounds(631, 141, 98, 26);
			jButtonAlterar.setText("Alterar");
			jButtonAlterar.addActionListener(new java.awt.event.ActionListener() { 
				public void actionPerformed(java.awt.event.ActionEvent e) { 
					int a = jtable.getSelectedRow();
					//Programa p = new Programa();
					List<ProgramaHistorico> list = new ArrayList<ProgramaHistorico>();
					int progId = ((Integer)jtable.getModel().getValueAt(a,0));  
					progDao = new ProgramasDaoImpl();
					list = progDao.loadHistoricoProgramaByProgId(progId);
					new JPanelSeHistorico(list).setVisible(true);
				}  
			});
		}
		return jButtonAlterar;
	}
	
	private JButton getJButtonExcluir() {
		if (jButtonExcluir == null) {
			jButtonExcluir = new JButton();
			jButtonExcluir.setRequestFocusEnabled(false);
			jButtonExcluir.setIcon(new ImageIcon("C:/ISHistorico/images/icons/20x20/DocumentDelete.gif"));
			jButtonExcluir.setBounds(631, 171, 98, 26);
			jButtonExcluir.setText("Excluir");
			jButtonExcluir.addActionListener(new java.awt.event.ActionListener() { 
				public void actionPerformed(java.awt.event.ActionEvent e) {   
					int a = jtable.getSelectedRow();
					ProgramaHistorico p = new ProgramaHistorico();
					List<ProgramaHistorico> list = new ArrayList<ProgramaHistorico>();
					int progId = ((Integer)jtable.getModel().getValueAt(a,0));  
					progDao = new ProgramasDaoImpl();
					list = progDao.loadHistoricoProgramaByProgId(progId);
						p.setIdprogramahistorico(list.get(0).getIdprogramahistorico());
						p.setProgId(list.get(0).getProgId());
						p.setDescricao(list.get(0).getDescricao());
						p.setProgramador(list.get(0).getProgramador());
						p.setData( list.get(0).getData());
						p.setHora(list.get(0).getHora());
					
					progDao.removeHistorico(p);
				}
			});
		}
		return jButtonExcluir;
	}
	
	
	private JButton getJButtonOk() {
 		if (jButtonOk == null) {
			jButtonOk = new JButton();
			jButtonOk.setRequestFocusEnabled(false);
			jButtonOk.setBounds(73, 76, 105, 26);
			jButtonOk.setText("   Ok       ");
			jButtonOk.setIcon(new ImageIcon("C:/ISHistorico/images/icons/20x20/Save.gif"));
			
			jButtonOk.addActionListener(new java.awt.event.ActionListener() { 
				public void actionPerformed(java.awt.event.ActionEvent e) { 
					 
		                try {
		                	ProgramasDaoImpl<Programa> dao = new ProgramasDaoImpl<Programa>();
		                	JPanelSpEditDescricaoPrograma spDesc = new JPanelSpEditDescricaoPrograma();
		                			String a = jMaxLenTextFieldNome.getText();
		                			if (!jMaxLenTextFieldNome.getText().trim().equals("") && jNumberTextFieldProgId.getNumber().intValue() > 0 ){
		                				if (comparaProgId(jNumberTextFieldProgId.getNumber().intValue())){
		                					JOptionPane.showMessageDialog(null, "ProgId ja cadastrado!");
		                				}else{
		                			prog.setNomePrograma(jMaxLenTextFieldNome.getText()); 
		                			prog.setProgId(jNumberTextFieldProgId.getNumber().intValue());
		                			prog.setModulo(jComboBoxModulo.getSelectedIndex());
		                			prog.setDescricao(descricao);
		                			prog.setDescricao(spDesc.getDesc());
		                			if (alterar){
		                				dao.update(prog);
		                			}else {
		                				dao.create(prog);
		                				List<Programa> list = dao.listarProgramas();
		                				ProgramaTableModel modell = new ProgramaTableModel(list);
		                				modell.adiciona(prog);
		                				instanciaComponentes();
		                				
		                			}
		                			limpar(); }
		                			
		                }else {
		                	JOptionPane.showMessageDialog(null, "Todos os campos devem ser informados");
		                }
		                		
		                }
		                catch (Exception ei){
		                	ei.printStackTrace();
		                }
				}
			});
		}
		return jButtonOk;
	}
	
	
	private JButton getJButtonDescricao() {
		if (jButtonDescricao == null) {
			jButtonDescricao = new JButton();
			jButtonDescricao.setRequestFocusEnabled(false);
			jButtonDescricao.setBounds(209, 76, 105, 26);
			jButtonDescricao.setText("Descrição");
			jButtonDescricao.addActionListener(new java.awt.event.ActionListener() { 
				public void actionPerformed(java.awt.event.ActionEvent e) {    
					try {
						if (alterar){
							new JPanelSpEditDescricaoPrograma(msg).setVisible(true);
						}else {
							new JPanelSpEditDescricaoPrograma().setVisible(true);
						}
					}catch (Exception ei){
						ei.printStackTrace();
						}
					}
			}); 
		}
		return jButtonDescricao;
	}
	
	public void fechar(){
		this.setVisible(false); 
	}
	
	public void limpar(){
		jMaxLenTextFieldNome = null;
		jNumberTextFieldProgId = null;
		this.setVisible(false);
		
		
	}
	
	public  JScrollPane instanciaComponentes() { 
		model = new ProgramaHistoricoTableModel();
		model.addTableModelListener(this);
		model.adicionaLista(ProgramasDaoImpl.listarHistoricosProgramas(progId));
		jtable = new JTable();
		jtable.setModel(model);
		scrollPane = new JScrollPane();
		scrollPane.setViewportView(jtable);
		
		jtable.setSize(new Dimension(241, 101));
		scrollPane.setBounds(4, 111, 616, 413);
		jtable.getColumnModel().getColumn(0).setMaxWidth(65);
		jtable.getColumnModel().getColumn(1).setMaxWidth(65);
		jtable.getColumnModel().getColumn(2).setMaxWidth(95);
		jtable.getColumnModel().getColumn(3).setMaxWidth(65);
		jtable.getColumnModel().getColumn(4).setMaxWidth(330);
		jtable.repaint();
		return scrollPane;
		
	}
	
	public void refreshTable(ProgramaHistorico prog){
	  	model.adiciona(prog,prog.getProgId());
		model.adicionaLista(ProgramasDaoImpl.listarHistoricosProgramas(progId));
		jtable.setModel(model);
		jtable.repaint();
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
		prog.setDescricao(descricao);
		}
	
	public String getDescricao() {
		return descricao;
	}
	
	
	public void tableChanged(TableModelEvent arg0) {
		// TODO Auto-generated method stub
		
	}
	
	public boolean comparaProgId(int progId){
		ProgramasDaoImpl<Programa> dao = new ProgramasDaoImpl<Programa>();
		List<Programa> list = dao.loadProgramaByProgId(progId);
		if (list.size() > 0){
			return true;
		}else {
			return false;
		}
	}
}
V

Por que existe outro model sendo criado no método adicionar?

Você deveria estar chamando o método adicionar sobre o model que está na tabela, não sobre um novo model. Tente refatorar seu código para:

  1. Só haver uma única criação de model. Na sua tela tem 3.
  2. Só haver uma única chamada à instanciaComponentes.

Quando mexer nos dados da JTable, você precisa atualizar o model que está dentro do JTable. E não em qualquer JTable, mas na que está sendo exibida.
Se criar um model novo e chamar adicionar nesse model novo, nada será exibido mesmo.

P

é que u possuo duas tabelas… uma de programas, e outra programaHistoricos

só que a tabela “programasHistoricos” se encontra na janela JPanelSEProgramas, e a tabela “programas” na janela JPanelSelectProgramas

V

Como eu falei, você nunca deverá ter que chamar instanciaComponentes mais de uma vez. Cada vez que você chama esse método, você estará criando um model novo. E isso está errado.

Quando você criar um novo objeto, você deve:

  1. Salvar esse objeto em seu dao;
  2. Chamar o método adiciona do seu model.

Mais nada. Não é necessário dar refresh() na JTable, ou criar novas instâncias do model. Aliás, tome muito cuidado com isso. Duplicar componentes por acidente gera bugs dificílimos de corrigi (acredite, eu mesmo já me descabelei várias vezes por isso).

Por isso, certifique-se em primeira mão que:

  1. O model só é criado uma única vez. E depois é esse mesmo model que é usado;
  2. O JTable também é criado só uma vez. E está mesmo usando o model criado no passo anterior.
  3. O painel onde o JTable está também é o mesmo painel que é chamado todas as vezes.

Sintomas para problemas disso são os que você citou. Você cria a tabela, preenche e na hora do debug o model está vazio, por exemplo. Obviamente, pq o model que você está vendo na hora do debug não é o mesmo que você usou na hora de criar o JTable.

P

tirei as outra criações do model, agora ele só cria dentro do metodo instanciaComponentes , e esta chamando o metodo instanciaComponentes so uma vez…e adivinha…

continua do mesmo geito

IOEghIEIEHoiEHIHEOIUE

P

sim, mais eu preciso desse metodo refresh pois eu insiro os dados em outra janela…que é só para inserção…e depois de salva-lo em banco eu chamo JPanelSEPrograma.refresh() para atualizar a tabela

V

Ainda tem caroço nesse angu… Acho que é hora de botar o depurador em ação.

Coloca um breakpoint na hora de adicionar, e na hora de desenhar a tabela. Vai ser um pouco chato. Você precisa se certificar que após adicionar um novo objeto:

  1. O método adiciona do seu model é chamado
  2. A lista (que deve ter os dados que estão sendo exibidos na tabela), ganha efetivamente mais um registro;
  3. Que o TableRowsInserted é chamado.
  4. Que na hora de repintar a tabela, a lista que o model está usando contém mesmo um objeto a mais do que tinha antes.

Tenta acompanhar certinho aí o que ocorre. O TableModel me parece bastante certo, então é quase certeza que o problema não é ele.

P

acho q agora estaa no caminho…fiz algumas alterações aqui, e verifiquei no debug quando ele seta o model no jTable, o list du model esta atualizado td certinhoo, e dentro do jTable, a lista foi inserida corretamente, …porém a tabela não altera…mais pelo menos deu uma afunilada em algumas possibilidades, o problema deve estar no meu “repaint” ou no meu JFrame…segue o fonte da tela inteira do JFrame

package br.com.is.ishistorico.gui;



import java.awt.BorderLayout;
import java.awt.Dimension;

import javax.swing.DefaultComboBoxModel;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;

import um.filteredtext.JNumberTextField;

import br.com.is.commons.ui.combobox.JConditionsComboBox;
import br.com.is.commons.ui.textfield.JMaxLenTextField;
import br.com.is.ishistorico.dao.ProgramasDaoImpl;
import br.com.is.ishistorico.model.Programa;
import br.com.is.ishistorico.model.ProgramaHistorico;
import br.com.is.ishistorico.model.ProgramaHistoricoTableModel;
import br.com.is.ishistorico.model.ProgramaTableModel;

import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.border.EmptyBorder;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;

public class JPanelSEProgramas extends javax.swing.JFrame implements TableModelListener  {

	
	private JPanel jPanelSE = null;
	
	private JLabel jLabelNome = null;
	private JMaxLenTextField jMaxLenTextFieldNome = null;
	private JMaxLenTextField jMaxLenTextFieldDesc = null;
	private JLabel jLabelProgId = null;
	private JNumberTextField jNumberTextFieldProgId = null;
	private String msg = null;
	private int progId = 0;
	private boolean alterar = false;
	private String descricao = null;  //  @jve:decl-index=0:
	
	private JButton jButtonIncluir;
	private JButton jButtonAlterar;
	private JButton jButtonExcluir;
	private JButton jButtonOk;
	private JButton jButtonDescricao;
	
	private ProgramaHistoricoTableModel model = new ProgramaHistoricoTableModel();
	private JScrollPane scrollPane;
	
	Programa prog = new Programa(); //  @jve:decl-index=0:
	private ProgramasDaoImpl progDao;//  @jve:decl-index=0:
	
	
	public static final int MODULO_LAB = 0;
	public static final int MODULO_TAB = 1;
	public static final int MODULO_ADM = 2;
	public static final String MODULO_LIST[] = {"LAB","TAB","ADM"};  //  @jve:decl-index=0:
	
	
	private String desc;  //  @jve:decl-index=0:
	
	JTable jtable = new JTable();;  
	
	private JLabel jLabelModulo = null;
	private JComboBox jComboBoxModulo = null;
	
	public JPanelSEProgramas(List<Programa> list) {
		alterar = true;
		progId = list.get(0).getProgId();
		instanciaComponentes();
		initialize();
		initializeComponents(list);
	}
	
	public JPanelSEProgramas() {
		instanciaComponentes();
		initialize();
	}
	
	
	
	public void initialize(){
		this.setBounds(new Rectangle(0, 0, 740, 600));
		this.add(getJPanelSE(), java.awt.BorderLayout.CENTER);
		this.setTitle("Cadastro de Programas");
	}
	
	public void initializeComponents(List<Programa> list){
		jNumberTextFieldProgId.setNumber(list.get(0).getProgId());
		jNumberTextFieldProgId.setEnabled(false);
		msg = list.get(0).getDescricao();
		jMaxLenTextFieldNome.setText(list.get(0).getNomePrograma());
		jComboBoxModulo.setSelectedIndex(list.get(0).getModulo());
		} 
	
	private JPanel getJPanelSE(){
		if(jPanelSE == null){ 
			jPanelSE = new JPanel();	
			jPanelSE.setBounds(0, 0, 731, 584);
			jPanelSE.setLayout(null);
			jPanelSE.add(getJButtonIncluir());
			jPanelSE.add(getJButtonAlterar());
			jPanelSE.add(getJButtonExcluir());
			jPanelSE.add(getJButtonOk());
			jPanelSE.add(getJButtonDescricao());
			jPanelSE.add(getJLabelProgId());
			jPanelSE.add(getJLabelNome());
			jPanelSE.add(getJLabelModulo());
			jPanelSE.add(getJNumberTextFieldProgId());
			jPanelSE.add(getJMaxLenTextFieldNome());
			jPanelSE.add(getJComboBoxModulo());
			add(scrollPane);
	}
		return 	jPanelSE;
	}
	
/****************************************   NOME   *********************************************/
	
	
	private JLabel getJLabelNome() {
		if (jLabelNome == null){
			jLabelNome = new JLabel();
			jLabelNome.setBounds(12, 31, 47, 16);
			jLabelNome.setText("Nome");
			jLabelNome.setLabelFor(jMaxLenTextFieldNome);
		}
		return jLabelNome;
	}
	
	private JMaxLenTextField getJMaxLenTextFieldNome() {
		if (jMaxLenTextFieldNome == null){
			jMaxLenTextFieldNome = new JMaxLenTextField();
			jMaxLenTextFieldNome.setBounds(73, 27, 241, 20);
		}
		return jMaxLenTextFieldNome;
	}
	
/****************************************   PROGID   *********************************************/
	
	
	
	private JLabel getJLabelProgId() {
		if (jLabelProgId == null){
			jLabelProgId = new JLabel();
			jLabelProgId.setBounds(12, 9, 47, 16);
			jLabelProgId.setText("ProgID");
			jLabelProgId.setLabelFor(jComboBoxModulo);
		}
		return jLabelProgId;
	}
	
	private JNumberTextField getJNumberTextFieldProgId() {
		if (jNumberTextFieldProgId == null){
			jNumberTextFieldProgId = new JNumberTextField();
			jNumberTextFieldProgId.setBounds(73, 5, 97, 20);
		}
		return jNumberTextFieldProgId;
	}
	
	/****************************************   MÓDULO   *********************************************/
	
	
	
	private JLabel getJLabelModulo() {
		if (jLabelModulo == null){
			jLabelModulo = new JLabel();
			jLabelModulo.setBounds(12, 53, 47, 16);
			jLabelModulo.setText("Módulo");
			jLabelModulo.setLabelFor(jComboBoxModulo);
		}
		return jLabelModulo;
	}
	
	private JComboBox getJComboBoxModulo() {
		if (jComboBoxModulo == null) {
			jComboBoxModulo = new JComboBox();
			jComboBoxModulo.setBounds(73, 49, 138, 20);
			for (int i = 0; i < MODULO_LIST.length; i++) {
				jComboBoxModulo.addItem(MODULO_LIST[i]);
			}
		}
		return jComboBoxModulo;
	}
	
	
/****************************************   OUTROS   *********************************************/	
	
	private JButton getJButtonIncluir() {
		if (jButtonIncluir == null) {
			jButtonIncluir = new JButton();
			jButtonIncluir.setRequestFocusEnabled(false);
			jButtonIncluir.setIcon(new ImageIcon("C:/ISHistorico/images/icons/20x20/DocumentIn.gif"));
			jButtonIncluir.setBounds(631, 111, 98, 26);
			jButtonIncluir.setText("Incluir");
			jButtonIncluir.addActionListener(new java.awt.event.ActionListener() {   
				public void actionPerformed(java.awt.event.ActionEvent e) {  
					new JPanelSeHistorico(progId).setVisible(true);
					
				} 
			
			});
		}
		return jButtonIncluir;
	}
	
	
	private JButton getJButtonAlterar() {
		if (jButtonAlterar == null) {
			jButtonAlterar = new JButton();
			jButtonAlterar.setRequestFocusEnabled(false);
			jButtonAlterar.setIcon(new ImageIcon("C:/ISHistorico/images/icons/20x20/DocumentDraw.gif"));
			jButtonAlterar.setBounds(631, 141, 98, 26);
			jButtonAlterar.setText("Alterar");
			jButtonAlterar.addActionListener(new java.awt.event.ActionListener() { 
				public void actionPerformed(java.awt.event.ActionEvent e) { 
					int a = jtable.getSelectedRow();
					//Programa p = new Programa();
					List<ProgramaHistorico> list = new ArrayList<ProgramaHistorico>();
					int progId = ((Integer)jtable.getModel().getValueAt(a,0));  
					progDao = new ProgramasDaoImpl();
					list = progDao.loadHistoricoProgramaByProgId(progId);
					new JPanelSeHistorico(list).setVisible(true);
				}  
			});
		}
		return jButtonAlterar;
	}
	
	private JButton getJButtonExcluir() {
		if (jButtonExcluir == null) {
			jButtonExcluir = new JButton();
			jButtonExcluir.setRequestFocusEnabled(false);
			jButtonExcluir.setIcon(new ImageIcon("C:/ISHistorico/images/icons/20x20/DocumentDelete.gif"));
			jButtonExcluir.setBounds(631, 171, 98, 26);
			jButtonExcluir.setText("Excluir");
			jButtonExcluir.addActionListener(new java.awt.event.ActionListener() { 
				public void actionPerformed(java.awt.event.ActionEvent e) {   
					int a = jtable.getSelectedRow();
					ProgramaHistorico p = new ProgramaHistorico();
					List<ProgramaHistorico> list = new ArrayList<ProgramaHistorico>();
					int progId = ((Integer)jtable.getModel().getValueAt(a,0));  
					progDao = new ProgramasDaoImpl();
					list = progDao.loadHistoricoProgramaByProgId(progId);
						p.setIdprogramahistorico(list.get(0).getIdprogramahistorico());
						p.setProgId(list.get(0).getProgId());
						p.setDescricao(list.get(0).getDescricao());
						p.setProgramador(list.get(0).getProgramador());
						p.setData( list.get(0).getData());
						p.setHora(list.get(0).getHora());
					
					progDao.removeHistorico(p);
				}
			});
		}
		return jButtonExcluir;
	}
	
	
	private JButton getJButtonOk() {
 		if (jButtonOk == null) {
			jButtonOk = new JButton();
			jButtonOk.setRequestFocusEnabled(false);
			jButtonOk.setBounds(73, 76, 105, 26);
			jButtonOk.setText("   Ok       ");
			jButtonOk.setIcon(new ImageIcon("C:/ISHistorico/images/icons/20x20/Save.gif"));
			
			jButtonOk.addActionListener(new java.awt.event.ActionListener() { 
				public void actionPerformed(java.awt.event.ActionEvent e) { 
					 
		                try {
		                	ProgramasDaoImpl<Programa> dao = new ProgramasDaoImpl<Programa>();
		                	JPanelSpEditDescricaoPrograma spDesc = new JPanelSpEditDescricaoPrograma();
		                			String a = jMaxLenTextFieldNome.getText();
		                			if (!jMaxLenTextFieldNome.getText().trim().equals("") && jNumberTextFieldProgId.getNumber().intValue() > 0 ){
		                				if (comparaProgId(jNumberTextFieldProgId.getNumber().intValue())){
		                					JOptionPane.showMessageDialog(null, "ProgId ja cadastrado!");
		                				}else{
		                			prog.setNomePrograma(jMaxLenTextFieldNome.getText()); 
		                			prog.setProgId(jNumberTextFieldProgId.getNumber().intValue());
		                			prog.setModulo(jComboBoxModulo.getSelectedIndex());
		                			prog.setDescricao(descricao);
		                			prog.setDescricao(spDesc.getDesc());
		                			if (alterar){
		                				dao.update(prog);
		                			}else {
		                				dao.create(prog);
		                				
		                			}
		                			limpar(); }
		                			
		                }else {
		                	JOptionPane.showMessageDialog(null, "Todos os campos devem ser informados");
		                }
		                		
		                }
		                catch (Exception ei){
		                	ei.printStackTrace();
		                }
				}
			});
		}
		return jButtonOk;
	}
	
	
	private JButton getJButtonDescricao() {
		if (jButtonDescricao == null) {
			jButtonDescricao = new JButton();
			jButtonDescricao.setRequestFocusEnabled(false);
			jButtonDescricao.setBounds(209, 76, 105, 26);
			jButtonDescricao.setText("Descrição");
			jButtonDescricao.addActionListener(new java.awt.event.ActionListener() { 
				public void actionPerformed(java.awt.event.ActionEvent e) {    
					try {
						if (alterar){
							new JPanelSpEditDescricaoPrograma(msg).setVisible(true);
						}else {
							new JPanelSpEditDescricaoPrograma().setVisible(true);
						}
					}catch (Exception ei){
						ei.printStackTrace();
						}
					}
			}); 
		}
		return jButtonDescricao;
	}
	
	public void fechar(){
		this.setVisible(false); 
	}
	
	public void limpar(){
		jMaxLenTextFieldNome = null;
		jNumberTextFieldProgId = null;
		this.setVisible(false);
		
		
	}
	
	public  JScrollPane instanciaComponentes() { 
		
		model.addTableModelListener(this);
		model.adicionaLista(ProgramasDaoImpl.listarHistoricosProgramas(progId));
		
		jtable.setModel(model);
		scrollPane = new JScrollPane();
		scrollPane.setViewportView(jtable);
		
		jtable.setSize(new Dimension(241, 101));
		scrollPane.setBounds(4, 111, 616, 413);
		jtable.getColumnModel().getColumn(0).setMaxWidth(65);
		jtable.getColumnModel().getColumn(1).setMaxWidth(65);
		jtable.getColumnModel().getColumn(2).setMaxWidth(95);
		jtable.getColumnModel().getColumn(3).setMaxWidth(65);
		jtable.getColumnModel().getColumn(4).setMaxWidth(330);
		//jtable.repaint();
		return scrollPane;
		
	}
	
	public void refreshTable(ProgramaHistorico prog){
		//model.adicionaLista(ProgramasDaoImpl.listarHistoricosProgramas(progId));
	  	model.adiciona(prog,prog.getProgId());
		jtable.setModel(model);
		jtable.repaint();
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
		prog.setDescricao(descricao);
		}
	
	public String getDescricao() {
		return descricao;
	}
	
	
	public void tableChanged(TableModelEvent arg0) {
		// TODO Auto-generated method stub
		
	}
	
	public boolean comparaProgId(int progId){
		ProgramasDaoImpl<Programa> dao = new ProgramasDaoImpl<Programa>();
		List<Programa> list = dao.loadProgramaByProgId(progId);
		if (list.size() > 0){
			return true;
		}else {
			return false;
		}
	}
}
V

Estranho pq quando tudo está correto, não é necessário fazer repaint, refresh ou qualquer coisa desse tipo. Basta disparar os eventos do model, e a própria table se encarregará de se repintar.

P

pois é e os valores estão no model, isto é…ele atualiza certinho…será que não teria uma forma de dar um “refresh” no proprio frame? e ele re-fazer a table?

V

Estranho, pq não existe necessidade de refresh em lugar nenhum. Geralmente, situações assim aconteciam quando algum componente disparava uma exceção durante a pintura, o que impedia a JTable de fazer o refresh correto.

Criado 19 de março de 2010
Ultima resposta 26 de mar. de 2010
Respostas 32
Participantes 5