combobox - JavaFX: tecla de captura "Enter" presionada
keyevent (1)
Necesito mantener una lista de cadenas de tamaño indeterminado. Pensé que la mejor manera de hacerlo sería a través de un cuadro combinado que tomaría la entrada del usuario y, a su vez, agregar esa entrada del usuario con una pulsación de tecla "Enter" detectada en la lista de elementos de ComboBox y también permitir que el usuario elimine esos elementos mediante una pulsación de tecla "Eliminar".
Esperaba que esta fuera una tarea muy simple manejada de esta manera:
this.cbx.setOnKeyTyped((KeyEvent E) -> {
switch(E.getCode()){
case ENTER:
this.cbx.getItems().add(this.cbx.valueProperty().get());
this.cbx.valueProperty().set("");
E.consume();
break;
case DELETE:
if (this.cbx.getItems().contains(
this.cbx.valueProperty().get()
)) this.cbx.getItems().remove(this.cbx.valueProperty().get());
this.cbx.valueProperty().set("");
E.consume();
break;
}
});
Desafortunadamente, Enter no activa el evento. Entonces claramente estoy equivocado. También probé con onKeyPressed
, y eso tampoco funcionó. ¿Qué necesito hacer para capturar cuando se presionan "Entrar" y "Eliminar" (capta "Shift" bien, lo cual es enloquecedor).
EDIT 1:
También he intentado con
If(E.getCode().Equals(KeyCode.ENTER)){
...
} else if (E.getCode().equals(KeyCode.DELETE)){
...
}
Sin amor.
Editar 2:
En base a la respuesta de James_D a continuación, que me puso en el rumbo correcto, para lograr lo que estaba buscando hacer, empleé el siguiente método:
ComboBox<String> cb = new ComboBox<>();
cb.setEditable(true);
cb.getEditor().addEventFilter(KeyEvent.KEY_PRESSED, (KeyEvent E) -> {
switch(E.getCode()){
case ENTER:{
if (cb.getItems().contains(cb.getEditor().getText()))
E.consume();
else{
cb.getItems().add(cb.getEditor().getText());
cb.getEditor().clear();
E.consume();
}
break;
}
case DELETE:{
if (E.isControlDown() && cb.getItems().contains(cb.getEditor().getText()))
cb.getItems().remove(cb.getEditor().getText());
else if (E.isAltDown()) cb.getItems().clear();
if (E.isControlDown() || E.isAltDown()){
cb.getEditor().clear();
E.consume();
}
break;
}
}
});
¿Está buscando tener un cuadro combinado editable, que agrega elementos a su lista emergente cuando el usuario escribe elementos que no están allí?
Si es así, intente:
import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.ComboBox;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;
public class UpdatingComboBox extends Application {
@Override
public void start(Stage primaryStage) {
ComboBox<String> combo = new ComboBox<>();
combo.setEditable(true);
combo.valueProperty().addListener((obs, oldValue, newValue) -> {
if (newValue != null && ! combo.getItems().contains(newValue)) {
combo.getItems().add(newValue);
}
});
HBox root = new HBox(combo);
root.setAlignment(Pos.TOP_CENTER);
primaryStage.setScene(new Scene(root, 350, 150));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
Para eliminar, lo primero que preguntaría es si realmente desea la funcionalidad tal como la ha descrito. Los usuarios normalmente esperan presionar eliminar en un cuadro combinado editable para eliminar el siguiente carácter, no eliminar un elemento completamente de la lista. Si quieres hacer esto, tienes que ensuciarte un poco las manos y usar un oyente clave. Por alguna razón, agregar el oyente clave al cuadro combinado directamente parece tener resultados algo impredecibles; sin embargo, funciona si lo agrega al campo de texto debajo del cuadro combinado editable:
combo.getEditor().addEventFilter(KeyEvent.KEY_PRESSED, event -> {
if (event.getCode() == KeyCode.DELETE) {
combo.getItems().remove(combo.getValue());
event.consume();
}
});