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;
}