选择JavaFX可编辑的组合框文本 [英] Select JavaFX Editable Combobox text on click

查看:333
本文介绍了选择JavaFX可编辑的组合框文本的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在点击可编辑的Combobox时有一个关于文本选择的问题。



目前的情况是,鼠标光标只是到达输入的那个地方,未选择整个文本字段。我想突出/选择整个文本字段的点击,但它不这样做。



我想要的点击文本字段将做: p>



这是我的AutoComplete类:

  public class AutoCompleteComboBoxListener< T>实现EventHandler< KeyEvent> {

private ComboBox comboBox;
private StringBuilder sb;
private ObservableList< T>数据;
private boolean moveCaretToPos = false;
private int caretPos;
private button button;

public AutoCompleteComboBoxListener(final ComboBox comboBox,final Button button){
this.comboBox = comboBox;
sb = new StringBuilder();
data = comboBox.getItems();

this.comboBox.setEditable(true);

this.button = button;

this.comboBox.setOnKeyPressed(new EventHandler< KeyEvent>(){

@Override
public void handle(KeyEvent t){
System。 out.println(misaja);
System.out.println(t);

comboBox.hide();
}
});
this.comboBox.setOnKeyReleased(AutoCompleteComboBoxListener.this);
}

@Override
public void handle(KeyEvent event){

System.out.println(nonoh);
System.out.println(event.getCode());
UI.bitLogger.logging(String.valueOf(event.getCode()));

if(event.getCode()==(KeyCode.ENTER)){
System.out.println(erki);
button.fire();
}

if(event.getCode()== KeyCode.UP){
caretPos = -1;
moveCaret(comboBox.getEditor()。getText()。length());
return;
} else if(event.getCode()== KeyCode.DOWN){
if(!comboBox.isShowing()){
comboBox.show();
} b $ b caretPos = -1;
moveCaret(comboBox.getEditor()。getText()。length());
return;
} else if(event.getCode()== KeyCode.BACK_SPACE){
moveCaretToPos = true;
caretPos = comboBox.getEditor()。getCaretPosition();
} else if(event.getCode()== KeyCode.DELETE){
moveCaretToPos = true;
caretPos = comboBox.getEditor()。getCaretPosition();
}

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

ObservableList list = FXCollections.observableArrayList();
for(int i = 0; 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();
}
}

private void moveCaret(int textLength){
if(caretPos == -1){
comboBox.getEditor()。positionCaret (textLength);
} else {
comboBox.getEditor()。positionCaret(caretPos);
}
moveCaretToPos = false;
}

我在这里创建ComboBox:

  final ComboBox comboBox = new ComboBox(options); 
comboBox.setPrefWidth(320);

comboBox.setValue();

// ComboBox comboBox = new ComboBox();

new AutoCompleteComboBoxListener<>(comboBox,goButton);

comboBox.addEventFilter(KeyEvent.KEY_RELEASED,new EventHandler< KeyEvent>(){
@Override
public void handle(KeyEvent ke){
if getCode()== KeyCode.ENTER){
//System.out.println(\"ENTER was released);
goButton.fire();
}
}
});

comboBox.addEventFilter(MouseEvent.MOUSE_PRESSED,new EventHandler< MouseEvent>(){
@Override
public void handle(MouseEvent mouseEvent){
System.out。 println(mouse click detected2!+ mouseEvent.getSource());
//comboBox.getEditor()。requestFocus();
//comboBox.getEditor()。requestFocus();
//comboBox.requestFocus();
//comboBox.getEditor()。selectAll();
//comboBox.requestFocus();
//这些都不起作用。
}
});

我现在添加的是:

  comboBox.getEditor()。focusedProperty()。addListener(new ChangeListener ()
{
@Override
public void changed(ObservableValue< ?extends Boolean> arg0,Boolean oldPropertyValue,Boolean newPropertyValue)
{
if(newPropertyValue)
{
System.out.println(Textfield on focus);
comboBox.requestFocus();
comboBox.getEditor()。selectAll();
}
else
{
System.out.println );
}
}
});

但是它所做的只是选择/突出显示文本一段时间,然后删除突出显示

解决方案

您应该尝试通过在文本框添加焦点侦听器,如下所示:

  comboBox.getEditor()。focusedProperty()。addListener(
(observable,oldValue,newValue) - > {
if(newValue){
//当字段获取焦点时选择字段的内容
Platform.runLater(comboBox.getEditor():: selectAll);
}
}
);

此代码适用于 Java 8 ,对于以前的版本,相应的代码:

  comboBox.getEditor()。focusedProperty()。addListener(
new ChangeListener< Boolean& b $ b @Override
public void changed(final ObservableValue< ;? extends Boolean> observable,
final Boolean oldValue,final Boolean newValue){
if(newValue){
Platform。 runLater(
new Runnable(){
@Override
public void run(){
comboBox.getEditor()。selectAll();
}
}
);
}
}
}
);


I have a question regarding text selection when clicking on the editable Combobox.

Currently what happens, is that the mouse cursor just goes to that place of the input and does not select the whole text field. I would like to highlight/select whole textfield on the click, but it doesn't do that.

What I want that a click on the textfield would do:

This is my AutoComplete class:

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

private ComboBox comboBox;
private StringBuilder sb;
private ObservableList<T> data;
private boolean moveCaretToPos = false;
private int caretPos;
private Button button;

public AutoCompleteComboBoxListener(final ComboBox comboBox, final Button button) {
    this.comboBox = comboBox;
    sb = new StringBuilder();
    data = comboBox.getItems();

    this.comboBox.setEditable(true);

    this.button = button;

    this.comboBox.setOnKeyPressed(new EventHandler<KeyEvent>() {

        @Override
        public void handle(KeyEvent t) {
            System.out.println("misaja");
            System.out.println(t);

            comboBox.hide();
        }
    });
    this.comboBox.setOnKeyReleased(AutoCompleteComboBoxListener.this);
}

@Override
public void handle(KeyEvent event) {

    System.out.println("nonoh");
    System.out.println(event.getCode());
    UI.bitLogger.logging(String.valueOf(event.getCode()));

    if (event.getCode() == (KeyCode.ENTER)) {
        System.out.println("erki");
        button.fire();
    }

    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;
    } else if (event.getCode() == KeyCode.BACK_SPACE) {
        moveCaretToPos = true;
        caretPos = comboBox.getEditor().getCaretPosition();
    } else if (event.getCode() == KeyCode.DELETE) {
        moveCaretToPos = true;
        caretPos = comboBox.getEditor().getCaretPosition();
    }

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

    ObservableList 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();
    }
}

private void moveCaret(int textLength) {
    if (caretPos == -1) {
        comboBox.getEditor().positionCaret(textLength);
    } else {
        comboBox.getEditor().positionCaret(caretPos);
    }
    moveCaretToPos = false;
}

I am creating the ComboBox here:

    final ComboBox comboBox = new ComboBox(options);
    comboBox.setPrefWidth(320);

    comboBox.setValue("");

    //ComboBox comboBox = new ComboBox();

    new AutoCompleteComboBoxListener<>(comboBox, goButton);

    comboBox.addEventFilter(KeyEvent.KEY_RELEASED, new EventHandler<KeyEvent>() {
        @Override
        public void handle(KeyEvent ke) {
            if (ke.getCode() == KeyCode.ENTER) {
                //System.out.println("ENTER was released");
                goButton.fire();
            }
        }
    });

    comboBox.addEventFilter(MouseEvent.MOUSE_PRESSED, new EventHandler<MouseEvent>() {
        @Override
        public void handle(MouseEvent mouseEvent) {
            System.out.println("mouse click detected2! " + mouseEvent.getSource());
            //comboBox.getEditor().requestFocus();
            //comboBox.getEditor().requestFocus();
            //comboBox.requestFocus();
            //comboBox.getEditor().selectAll();
            //comboBox.requestFocus();
            //None of these seem to work.
        }
    });

What I added now is this:

 comboBox.getEditor().focusedProperty().addListener(new ChangeListener<Boolean>()
    {
        @Override
        public void changed(ObservableValue<? extends Boolean> arg0, Boolean oldPropertyValue, Boolean newPropertyValue)
        {
            if (newPropertyValue)
            {
                System.out.println("Textfield on focus");
                comboBox.requestFocus();
                comboBox.getEditor().selectAll();
            }
            else
            {
                System.out.println("Textfield out focus");
            }
        }
    });

But all it does is that it selects/highlights the text for just a moment and then removes the highlight once again.

解决方案

You should try to do it by adding a focus listener on the textfield as next:

comboBox.getEditor().focusedProperty().addListener(
    (observable, oldValue, newValue) -> {
        if (newValue) {
            // Select the content of the field when the field gets the focus.
            Platform.runLater(comboBox.getEditor()::selectAll);
        }
    }
);

This code is for Java 8, for previous versions the corresponding code is:

comboBox.getEditor().focusedProperty().addListener(
    new ChangeListener<Boolean>() {
        @Override
        public void changed(final ObservableValue<? extends Boolean> observable, 
                            final Boolean oldValue, final Boolean newValue) {
            if (newValue) {
                Platform.runLater(
                    new Runnable() {
                        @Override
                        public void run() {
                            comboBox.getEditor().selectAll();
                        }
                    }
                );
            }
        }
    }
);

这篇关于选择JavaFX可编辑的组合框文本的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆