Problemas com Jdialog e o Jlist

0 respostas
A

Olá, estou tentando implementar um Jlist popup. Semelhante a quelas listas de completar códico, como a do NetBeans. Que após precionar 'Ctrl + espaço' lhe tras uma lista com as possiveis combinações para completar o que estava sendo digitado.
Até o momento consegui consegui um bom resultado com o seguinte código. entretanto existêm alguns problemas a serem resolvidos.
A lista só é apresentada após precinardo ctrl+espaço duas vezes.
Após feita uma pesquisa o filtro de conteudo da lista, não esta correto trazendo valores que não deveriam estar sendo exibidos.
E o tamanho da janela popup, após agulmas consultas fica desproporcional a lista.

public class TSField extends JTextField {

    public TSField() {
        popup.setFocusableWindowState(false);
        popup.setUndecorated(true);
        popup.getContentPane().setLayout(new FlowLayout(CENTER, 0, 0));
        popup.setModal(false);
        popup.add(lista);
        lista.setBorder(new BevelBorder(1));
        lista.setFocusable(true);

        addFocusListener(new FocusAdapter() {

            @Override
            public void focusLost(FocusEvent e) {
                popup.setVisible(false);
            }
        });
        addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                if (popup.isVisible()) {
                    setText((String) lista.getSelectedValue());
                    popup.setVisible(false);
                    lista.setSelectedIndex(-1);
                }
            }
        });
        addKeyListener(new KeyAdapter() {

            @Override
            public void keyPressed(KeyEvent e) {
                if (e.isControlDown() && e.getKeyCode() == KeyEvent.VK_SPACE) {
                    showSelectionList();
                } else if (KeyEvent.VK_BACK_SPACE == e.getKeyCode()) {
                    popup.setVisible(false);
                } else if (popup.isVisible()) {
                    selectListItens(e);
                }
            }
        });
    }

    private void showSelectionList() {
        lista.setListData(filtralista(getText()));
        popup.setSize(lista.getWidth(), lista.getHeight());
        popup.setLocation((int) getLocationOnScreen().getX(), (int) getLocationOnScreen().getY() + (getHeight()));
        popup.setVisible(true);
        selection = -1;
        lista.clearSelection();
        popup.repaint();
    }

    private void selectListItens(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_DOWN) {
            selection++;
            if (selection > lista.getModel().getSize() - 1) {
                selection = 0;
            }
            lista.setSelectedIndex(selection);
        } else if (e.getKeyCode() == KeyEvent.VK_UP) {
            selection--;
            if (selection < 0) {
                selection = lista.getModel().getSize() - 1;
            }
            lista.setSelectedIndex(selection);
        }
    }

    private Object[] filtralista(String prefix) {
        ArrayList<String> listaRetorno = new ArrayList<String>();
        for (String s : data) {
            if (s.startsWith(prefix)) {
                listaRetorno.add(s);
            }
        }
        return listaRetorno.toArray();
    }
    private JDialog popup = new JDialog();
    private String[] data = {"aaaaaa", "aaaaaa", "bbbb", "bbbbb", "bcbdfbb", "efedsdsf", "wdsdsfds", "opefdwee", "cdewfef", "easa", "lodfdosf", "jiasodsa", "idsfpsef", "oweqc"};
    private JList lista = new JList(data);
    private int selection = -1;
}
Criado 11 de agosto de 2008
Respostas 0
Participantes 1