gpt4 book ai didi

组合框跳转到键入的字符

转载 作者:行者123 更新时间:2023-12-04 14:15:37 25 4
gpt4 key购买 nike

我偶然发现了一个愚蠢的问题。但是我没有找到解决方案(也许是因为没有使用正确的搜索关键字,或者在可能的时候变得太困难了。)
设想:

我有一个有500个客户的组合框。我必须选择一个客户。

在Swing中,当列表下降并且您开始输入文字时,它会自动跳到输入的字母。例如。:

项目:

  • 亚当
  • Dirk
  • 弗雷迪
  • ...
  • 罗杰
  • 史蒂文
  • Z人

  • 打开组合框列表时,我只输入'R',然后它突然跳到以'R'开头的第一个客户。在javafx 2中,似乎没有这种行为...是否有一些我必须启用的选项,还是应该做一些事情,例如使用 可编辑的组合框,并制作一个在每次按键时触发的 filter()方法?

    编辑:基于布彭德拉答案的解决方案:
    public class FilterComboBox<T> extends ComboBox<T> {
    private final FilterComboBox<T> fcbo = this;

    //private FilterComboBox fcbo = this;
    private ObservableList<T> items;
    private ObservableList<T> filter;
    private String s;
    private Object selection;

    private class KeyHandler implements EventHandler< KeyEvent> {

    private SingleSelectionModel<T> sm;

    public KeyHandler() {
    sm = getSelectionModel();
    s = "";
    }

    @Override
    public void handle(KeyEvent event) {
    filter.clear();
    // handle non alphanumeric keys like backspace, delete etc
    if (event.getCode() == KeyCode.BACK_SPACE && s.length() > 0) {
    s = s.substring(0, s.length() - 1);
    } else {
    s += event.getText();
    }

    if (s.length() == 0) {
    fcbo.setItems(items);
    sm.selectFirst();
    return;
    }
    //System.out.println(s);
    if (event.getCode().isLetterKey()) {
    for (T item : items) {
    if (item.toString().toUpperCase().startsWith(s.toUpperCase())) {

    filter.add(item);
    //System.out.println(item);

    fcbo.setItems(filter);

    //sm.clearSelection();
    //sm.select(item);

    }
    }
    sm.select(0);
    }

    }
    }

    public FilterComboBox(final ObservableList<T> items) {
    super(items);
    this.items = items;
    this.filter = FXCollections.observableArrayList();

    setOnKeyReleased(new KeyHandler());

    this.focusedProperty().addListener(new ChangeListener() {
    @Override
    public void changed(ObservableValue observable, Object oldValue, Object newValue) {
    if (newValue == false) {
    s = "";
    fcbo.setItems(items);
    fcbo.getSelectionModel().select((T)selection);
    }

    }
    });

    this.getSelectionModel().selectedItemProperty().addListener(new ChangeListener() {
    @Override
    public void changed(ObservableValue observable, Object oldValue, Object newValue) {
    if (newValue != null) {
    selection = (Object) newValue;
    }

    }
    });
    }

    }

    最佳答案

    过滤器组合框的最简单形式如下所示。但这需要更多的工作来完善它。
    另外,如果列表很大(如您的情况),则可能会出现性能问题,因为我们每次按键时都会遍历整个集合。

    public class FilterComboBox extends ComboBox< String > {
    private ObservableList< String > items;

    private class KeyHandler implements EventHandler< KeyEvent > {

    private SingleSelectionModel< String > sm;
    private String s;

    public KeyHandler() {
    sm = getSelectionModel();
    s = "";
    }

    @Override
    public void handle( KeyEvent event ) {
    // handle non alphanumeric keys like backspace, delete etc
    if( event.getCode() == KeyCode.BACK_SPACE && s.length()>0)
    s = s.substring( 0, s.length() - 1 );
    else s += event.getText();

    if( s.length() == 0 ) {
    sm.selectFirst();
    return;
    }
    System.out.println( s );
    for( String item: items ) {
    if( item.startsWith( s ) ) sm.select( item );
    }
    }

    }

    public FilterComboBox( ObservableList< String > items ) {
    super( items );
    this.items = items;

    setOnKeyReleased( new KeyHandler() );
    }
    }

    关于组合框跳转到键入的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13362607/

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