“清除选择”后未显示AutoComplete javaFx ComboBox项

时间:2019-06-09 14:05:50

标签: javafx combobox

我试图在javafx中创建一个自动完成的组合框,但我几乎完成了,但是每次我尝试提交并清除选择项时,用户都可以选择另一种选择,除了上次选择的项之外,所有项都会被隐藏

//这是我使用的此类,将普通的组合框变成了自动完成框

public class AutoCompleteComboBoxListener<T> implements EventHandler<KeyEvent> {

    private ComboBox<T> comboBox;
    private ObservableList<T> data;
    private boolean moveCaretToPos = false;
    private int caretPos;


    public AutoCompleteComboBoxListener(final ComboBox<T> comboBox) {
        this.comboBox = comboBox;
        data = comboBox.getItems();

        this.comboBox.setEditable(true);
        this.comboBox.setOnKeyReleased(AutoCompleteComboBoxListener.this);
        this.showOnFocus();

    }

    @Override
    public void handle(KeyEvent event) {


        if(event.getCode() == KeyCode.UP) {
            caretPos = -1;
            moveCaret(comboBox.getEditor().getText().length());
            return;
        } else if(event.getCode() == KeyCode.DOWN) {
            if(!comboBox.isShowing())
                comboBox.show();

            caretPos = -1;
            moveCaret(comboBox.getEditor().getText().length());
            return;
        }

        if (event.getCode() == KeyCode.RIGHT || event.getCode() == KeyCode.LEFT
                || event.isControlDown() || event.getCode() == KeyCode.HOME
                || event.getCode() == KeyCode.END || event.getCode() == KeyCode.TAB) {
            return;
        }

        System.out.println(caretPos);

        comboBox.hide();



        if(event.getCode() == KeyCode.BACK_SPACE) {
            moveCaretToPos = true;
            caretPos = comboBox.getEditor().getCaretPosition();
        } else if(event.getCode() == KeyCode.DELETE) {
            moveCaretToPos = true;
            caretPos = comboBox.getEditor().getCaretPosition();
        }



        ObservableList<T> list = FXCollections.observableArrayList();
        for (int i=0; i<data.size(); i++) {
            if(data.get(i).toString().toLowerCase().startsWith(
                    AutoCompleteComboBoxListener.this.comboBox
                            .getEditor().getText().toLowerCase())) {
                list.add(data.get(i));
            }
        }
        String t = comboBox.getEditor().getText();

        comboBox.setItems(list);
        comboBox.getEditor().setText(t);
        if(!moveCaretToPos) {
            caretPos = -1;
        }
        moveCaret(t.length());
        if(!list.isEmpty()) {
            comboBox.show();
            String editorText;
            editorText=comboBox.getEditor().getText();
            list.sort((a, b) -> Integer.compare(a.toString().length(), b.toString().length()));
            comboBox.getSelectionModel().selectFirst();
            comboBox.getEditor().setText(editorText);
            moveCaret(comboBox.getSelectionModel().getSelectedItem().toString().length());
        }
        if (event.getCode()==KeyCode.ENTER){
            comboBox.hide();
            comboBox.getEditor().setText(comboBox.getSelectionModel().getSelectedItem().toString());

        }
    }

    private void moveCaret(int textLength) {

        if(caretPos == -1)
            comboBox.getEditor().positionCaret(textLength);
        else
            comboBox.getEditor().positionCaret(caretPos);

        moveCaretToPos = false;
    }

    public void showOnFocus(){
        this.comboBox.focusedProperty().addListener((obs, oldVal, newVal) ->
                this.comboBox.show());
    }
}

//,这就是“提交”按钮所做的组合框

button.setOnAction(e-> { 
    combo1.getSelectionModel().clearSelection();
    combo1.getSelectionModel().clearSelection(); 
});

0 个答案:

没有答案