Lógica com JList e banco de dados

5 respostas
S

Olá pessoal,
Tenho um código de exemplo que copiei no site do java sobre o uso dinâmico do JList. Nesse exemplo, é possível adicionar e remover itens na lista dinâmicamente. Agora eu quero implementar essa solução usando um banco de dados, ou seja, não quero que o item/registro seja incluído só na JList, também quero inserir o registro no banco de dados. Excluir e incluir o registro no banco de dados é tranquilo assim como exibir a lista na primeira vez que o programa é executado, minha maior dificuldade está em recuperar essas informações do banco de dados para serem exibidas no JList após uma inclusão ou uma exclusão de um item/registro.
Abaixo tenho as duas classes do arquivo de exemplo, uma classe para adicionar e outra para remover um ítem da lista. Não consegui entender a lógica de como o JList atualiza a lista dinamicamente, para que no local onde essa atualização ocorre, colocar os comandos que carregam os registros diretamente do banco de dados. Alguém poderia me dar uma ajuda com essa lógica?

Grato,
Sérgio

Remover ITEM/Registro:

class FireListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            int index = list.getSelectedIndex();
            if (list.getSelectedIndex() == -1) {
            	JOptionPane.showMessageDialog(null,"Você precisa selecionar uma pasta para excluir!");
            }
            else {
                listModel.remove(index);

                int size = listModel.getSize();

                if (size == 0) {
                    fireButton.setEnabled(false);

                } else {
                    if (index == listModel.getSize()) {
                        index--;
                    }
                    list.setSelectedIndex(index);
                    list.ensureIndexIsVisible(index);
                }            	
            }
        }
    }

Inserir ITEM/Registro:

class HireListener implements ActionListener, DocumentListener {
        private boolean alreadyEnabled = false;
        private JButton button;

        public HireListener(JButton button) {
            this.button = button;
        }

        public void actionPerformed(ActionEvent e) {
            String name = employeeName.getText();

            if (name.equals("") || alreadyInList(name)) {
                Toolkit.getDefaultToolkit().beep();
                employeeName.requestFocusInWindow();
                employeeName.selectAll();
                return;
            }

            int index = list.getSelectedIndex();
            if (index == -1) {
                index = 0;
            } else {
                index++;
            }

            listModel.insertElementAt(employeeName.getText(), index);
            employeeName.requestFocusInWindow();
            employeeName.setText("");

            list.setSelectedIndex(index);
            list.ensureIndexIsVisible(index);
        }

        protected boolean alreadyInList(String name) {
            return listModel.contains(name);
        }

        public void insertUpdate(DocumentEvent e) {
            enableButton();
        }

        public void removeUpdate(DocumentEvent e) {
            handleEmptyTextField(e);
        }

        public void changedUpdate(DocumentEvent e) {
            if (!handleEmptyTextField(e)) {
                enableButton();
            }
        }

        private void enableButton() {
            if (!alreadyEnabled) {
                button.setEnabled(true);
            }
        }

        private boolean handleEmptyTextField(DocumentEvent e) {
            if (e.getDocument().getLength() <= 0) {
                button.setEnabled(false);
                alreadyEnabled = false;
                return true;
            }
            return false;
        }
    }

5 Respostas

mauricioadl

um jeito simples de fazer isso, é extender a classe DefaultListModel e dentro dela vc faz a consulta no banco de dados e vai preenchendo a lista e um array interno, conforme vc for excluindo os elementos da lista, vc tambem vai excluindo do array e do banco de dados.

desculpe, mas nao consegui me expressar de forma melhor.

conseguiu entender?

mauricioadl

fiz um exemplo, rss

public class MinhaLista extends DefaultListModel {
	private List seusItens;
	
	public MinhaLista() {
		seusItens = new ArrayList();
	}
	
	public void carregaDados(){
		ResultSet rs = suaConnectionComBancoDeDados.createStatement().executeQuery("select * from bla bla bla");
		while(rs.next()){
			addElement(rs.getString("campo_da_tabela"));
		}
	}
	
	@Override
	public void removeElementAt(int index) {		
		super.removeElementAt(index);		
		excluiDoBancoDeDados(seusItens.get(index));
		seusItens.remove(index);		
	}
	
	private void excluiDoBancoDeDados(Object object) {
		// aqui vc faz a logica da exclusao.		
	}

	@Override
	public void addElement(Object obj) {
		super.addElement(obj);
		seusItens.add(obj);
	}
}
S

Olá Maurício,

Vou implementar a sua solução para ver como vai ficar a atualização da lista no JList. Eu estava conseguindo incluir e excluir do banco de dados, mas na hora de atualizar a JList após a inclusão ou exclusão ela ficava estática, ou seja, a lista não era atualizada na JList.

Grato,
Sérgio

mauricioadl

depois, de solucionado, pontue as resposta e marque o topico como [RESOLVIDO]

S

Olá Pessoal,

Consegui resolver o problema, não sei se é a melhor forma ou a forma correta para se resolver isso.
O que pude descobrir é que o JList funciona de maneira diferente do JTable. Talvez esse seja o grande problema que as pessoas tem na hora de se trabalhar com o JList, imaginar que o JList funciona da mesma forma que o JTable.
O JList atualiza dinâmicamente a sua lista quando um novo ítem é inserido ou excluído. Com o JTable você pode mandar recarregar a sua tabela após uma atualização, remoção ou inserção de um novo registro que tudo será exibido novamente considerando a situação atual dos dados no momento que você manda recarregar a JTable. O Jlist não me permite isso. A inclusão ou exclusão de um registro em uma tabela do banco de dados, por exemplo, deve ser tratada de maneira distinta da inclusão desse mesmo registro na lista do JList. Foi usando essa lógica que consegui resolver o problema. Estou pensando em escrever um artido com os códigos para explicar melhor como funciona o JList incluindo as diferenças com o JTabel.

Grato à todos.
Sérgio

Criado 7 de julho de 2011
Ultima resposta 26 de jul. de 2011
Respostas 5
Participantes 2