Auto-complete em ComboBox com textProperty().addListener

116 views
Skip to first unread message

Max Artur Zardini Júnior

unread,
Dec 22, 2015, 3:39:05 PM12/22/15
to JavaFX-BR
Olá amigos e amigas! Sou iniciante em JavaFX, entusiasta desta linguagem! Tudo que venho descobrindo devo à internet e às dicas dos colegas que postam em fóruns e tanto nos ajudam. Desculpem pelos equívocos dos termos técnicos da linguagem!

Há 2 meses venho quebrando a cabeça em projeto de média complexidade. Durante o desenvolvimento de uma das telas, houve a necessidade de criar um ComboBox editável e listar as opções vindas do banco. Todavia, para agilizar a inserção dos termos na TableView, resolvi criar um auto-complete do editor de texto do ComboBox. Depois de pesquisar por 3 dias, finalmente consegui implementar exatamente do jeito que eu queria e compartilho o código com vocês (servindo também para consultas futuras).

Funcionamento: À medida que os dados vão sendo inseridos no editor do ComboBox, caractere por caractere, busca-se nos itens do ComboBox a primeira ocorrência. Ao encontrar, completa o editor do ComboBox com o primeiro termo encontrado.

//Variáveis:
int posCursor;
String VALOR, parteVALOR, strParteAteCursor;
boolean VARRER = true;
ObservableList<String> olApresentacao = FXCollections.observableArrayList(
"COMPRIMIDO", "AMPOLA", "BOLSA", "FRASCO", "CÁPSULA", "PASTILHA", "GOTA(S)", "ML");


//Método de chamada - dentro da classe principal que extende Initializable:
cbPrescApresentacao.getEditor().textProperty().addListener((ObservableValue<? extends String> observable, String oldValue, String newValue) -> {
Platform.runLater(() -> {
autoCompleteComboBox_Fast(cbPrescApresentacao, olApresentacao);
});
});

//Método responsável pelo funcionamento do autocomplete:
private void autoCompleteComboBox_Fast(ComboBox cb, ObservableList ol) {
//Referenciando as variáveis
posCursor = cb.getEditor().getCaretPosition();
strParteAteCursor = cb.getEditor().getText(0, posCursor);
VARRER = true; // Variável controle que irá para o ciclo FOR após encontrar a primeira ocorrência

if (posCursor > 0) {
for (int i = 0; i < ol.size(); i++) { //Percorrendo todas as opções do ObservableList:
VALOR = (String) cb.getItems().get(i);//Restringindo o tamanho para evitar quebra do substring acima do permitido:
if (VALOR.length() >= strParteAteCursor.length()) {//Verificando se o comprimento do valor do Array é maior do que o comprimento do termo digitado:
if (VARRER == true && strParteAteCursor.toUpperCase().equals(VALOR.substring(0, strParteAteCursor.length()))) { //Comparando o valor e termo digitado
VARRER = false; //O ciclo for deverá parar após encontrar a primeira ocorrência
cb.getEditor().setText((String) ol.get(i));//Pega a posição atual do cursor;
cb.getEditor().positionCaret(posCursor);//Deixa o cursor no lugar correto;
}
}
}
} else {
cb.getEditor().setText("");
}
}




É logico que pode ser melhorado, mas serve de base para outras implementações.




Olival Paulino

unread,
Dec 22, 2015, 5:51:26 PM12/22/15
to java...@googlegroups.com
Já sofri muito com esse combobox e tableview.
Obrigado por compartilhar a ideia Max.
Abraço.

Olival Paulino
Graduando em Ciência da Computação - UFAL






--

---
Você está recebendo esta mensagem porque se inscreveu no grupo "JavaFX-BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para javafx-br+...@googlegroups.com.
Para obter mais opções, acesse https://groups.google.com/d/optout.

Rui Kelson

unread,
Dec 22, 2015, 9:40:27 PM12/22/15
to java...@googlegroups.com
Olá amigos!

Também estou engressando agora na plataforma javaFX.
Será que alguém pode me passar materiais dessas bibliotecas, ou me dizer
onde encontrar?

Grato,

Rui Kelson
Reply all
Reply to author
Forward
0 new messages