Max Artur Zardini Júnior
unread,Dec 22, 2015, 3:39:05 PM12/22/15Sign in to reply to author
Sign in to forward
You do not have permission to delete messages in this group
Sign in to report message
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
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.