2016-10-03 92 views
1

點擊可編輯的組合框時,我有關於文本選擇的問題。點擊選擇JavaFX Editable Combobox文本

目前發生的情況是,鼠標光標會移動到輸入的那個位置,並且不會選擇整個文本字段。我想突出顯示/選擇整個文本字段上的點擊,但它沒有這樣做。

我想,關於文本框點擊會做什麼:

Image

這是我的自動完成等級:

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; 
} 

我在這裏創造了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 (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. 
     } 
    }); 

我現在添加的是:

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"); 
      } 
     } 
    }); 

但它所做的只是選擇/突出顯示文本片刻,然後再次刪除突出顯示。

回答

1

你應該嘗試通過作爲下一個文本字段添加一個焦點偵聽器,做到這一點:

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

該代碼可用於的Java 8,對於以前的版本對應的代碼是:

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

該行應該做什麼: Platform.runLater(comboBox.getEditor():: selectAll); 「:: selectAll」究竟做了什麼? –

+0

你使用哪個版本的java? –

+0

這實際上只會使用方法引用在'comboBox.getEditor()'上調用'selectAll()'https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html –