JavaFX Combo Box with Search Autocomplete
JavaFX is a java framework for building cross-platform desktop application under the Java Platform, i have been doing JavaFX programming for the last couples of months and been feel really happy.
It's good practice to build a desktop application UI, instead of web-based UI, i mean, and the thing that it's under Java, it has lot of supporting tools and libraries. Yeah Java has been sucks on the UI, even me as I've been doing web for years, i feel really frustrated doing UI programming for the first time in Java.
It is hard to find for example a library to support a combo box with search functionality, you can find it a lot's of lots library in Javascript, but Java, i'd say none, i should implement it myself, and it's been really difficult as i don't think i have enough experiences in JavaFX.
So here's a simple implementation of JavaFX combo box with search autocomplete. Create a class name it AutoCompleteBox.java:
It's good practice to build a desktop application UI, instead of web-based UI, i mean, and the thing that it's under Java, it has lot of supporting tools and libraries. Yeah Java has been sucks on the UI, even me as I've been doing web for years, i feel really frustrated doing UI programming for the first time in Java.
It is hard to find for example a library to support a combo box with search functionality, you can find it a lot's of lots library in Javascript, but Java, i'd say none, i should implement it myself, and it's been really difficult as i don't think i have enough experiences in JavaFX.
So here's a simple implementation of JavaFX combo box with search autocomplete. Create a class name it AutoCompleteBox.java:
import javafx.application.Platform; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.event.Event; import javafx.event.EventHandler; import javafx.scene.control.ComboBox; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyEvent; import javafx.scene.input.MouseButton; import javafx.scene.input.MouseEvent; public class AutoCompleteBox implements EventHandlerAnd to use it, just instantiate your combo box as a parameter, for example:{ private ComboBox comboBox; final private ObservableList data; private Integer sid; public AutoCompleteBox(final ComboBox comboBox) { this.comboBox = comboBox; this.data = comboBox.getItems(); this.doAutoCompleteBox(); } public AutoCompleteBox(final ComboBox comboBox, Integer sid) { this.comboBox = comboBox; this.data = comboBox.getItems(); this.sid = sid; this.doAutoCompleteBox(); } private void doAutoCompleteBox() { this.comboBox.setEditable(true); this.comboBox.getEditor().focusedProperty().addListener((observable, oldValue, newValue) -> { if(newValue){//mean onfocus this.comboBox.show(); } }); this.comboBox.getEditor().setOnMouseClicked(event ->{ if(event.getButton().equals(MouseButton.PRIMARY)){ if(event.getClickCount() == 2){ return; } } this.comboBox.show(); }); this.comboBox.getSelectionModel().selectedIndexProperty().addListener((observable, oldValue, newValue) -> { moveCaret(this.comboBox.getEditor().getText().length()); }); this.comboBox.setOnKeyPressed(t -> comboBox.hide()); this.comboBox.setOnKeyReleased(AutoCompleteBox.this); if(this.sid!=null) this.comboBox.getSelectionModel().select(this.sid); } @Override public void handle(KeyEvent event) { if ( event.getCode() == KeyCode.UP || event.getCode() == KeyCode.DOWN || event.getCode() == KeyCode.RIGHT || event.getCode() == KeyCode.LEFT || event.getCode() == KeyCode.HOME || event.getCode() == KeyCode.END || event.getCode() == KeyCode.TAB ) { return; } if(event.getCode() == KeyCode.BACK_SPACE){ String str = this.comboBox.getEditor().getText(); if (str != null && str.length() > 0) { str = str.substring(0, str.length() - 1); } if(str != null){ this.comboBox.getEditor().setText(str); moveCaret(str.length()); } this.comboBox.getSelectionModel().clearSelection(); } if(event.getCode() == KeyCode.ENTER && comboBox.getSelectionModel().getSelectedIndex()>-1) return; setItems(); } private void setItems() { ObservableList list = FXCollections.observableArrayList(); for (Object datum : this.data) { String s = this.comboBox.getEditor().getText().toLowerCase(); if (datum.toString().toLowerCase().contains(s.toLowerCase())) { list.add(datum.toString()); } } if(list.isEmpty()) this.comboBox.hide(); this.comboBox.setItems(list); this.comboBox.show(); } private void moveCaret(int textLength) { this.comboBox.getEditor().positionCaret(textLength); } }
ComboBox myComboBox = new ComboBox(); //usually list of combobox items here new AutoCompleteBox ( myComboBox );This is screenshot for sample: