gpt4 book ai didi

combobox - JavaFX:捕获 "Enter"键按下

转载 作者:行者123 更新时间:2023-12-01 00:57:22 24 4
gpt4 key购买 nike

我需要保留一个不确定大小的字符串列表。我认为最好的方法是通过一个组合框来获取用户输入,然后在检测到“Enter”键时将该用户输入添加到 ComboBox 项目列表中,并允许用户删除这些项目通过“删除”键击。

我曾希望这将是一个非常简单的任务,像这样处理:

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

不幸的是, Enter 不会触发该事件。所以很明显我错了。
我也试过 onKeyPressed ,这也不起作用。
当按下“Enter”和“Delete”时我需要做什么来捕获(它可以很好地选择“Shift”,这很令人抓狂)。

编辑 1:

也试过
If(E.getCode().Equals(KeyCode.ENTER)){
...
} else if (E.getCode().equals(KeyCode.DELETE)){
...
}

没爱。

编辑2:

根据下面 James_D 的回答,这让我走上了正确的道路,为了完成我想要做的事情,我采用了以下方法:
    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;
}
}
});

最佳答案

您是否正在寻找一个可编辑的组合框,当用户输入不存在的项目时,该组合框将项目添加到其弹出列表中?

如果是这样,请尝试:

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

对于删除,我要问的第一件事是您是否真的想要您所描述的功能。用户通常希望在可编辑的组合框中按删除键来删除下一个字符,而不是从列表中完全删除一个项目。如果你真的想这样做,你必须让你的手更脏一点,并使用一个关键的听众。出于某种原因,直接在组合框中添加关键监听器似乎会产生一些不可预测的结果;但是,如果您将其添加到可编辑组合框下方的文本字段中,它会起作用:
    combo.getEditor().addEventFilter(KeyEvent.KEY_PRESSED, event -> {
if (event.getCode() == KeyCode.DELETE) {
combo.getItems().remove(combo.getValue());
event.consume();
}
});

关于combobox - JavaFX:捕获 "Enter"键按下,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26512143/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com