我偶然发现(在我眼中)一个愚蠢的问题。但是我没有找到解决方案(可能是因为没有使用正确的搜索关键字,或者在很容易的时候让它变得太难了..)场景:
我有一个包含 500 个客户的组合框。我必须选择一个客户。
在 Swing 中,当列表关闭并且您开始输入时,它会自动跳转到输入的字母。例如:
项目:
- 亚当
- 短剑
- 弗雷迪
- ...
- 罗杰
- 史蒂文
- Z人
当组合框列表打开时,我只需输入“R”,然后在摇摆中,它会跳转到以“R”开头的第一个客户。在 javafx 2 中,它似乎没有这种行为......是否有一些我必须启用的选项,或者我应该做一些事情,比如使用可编辑的组合框,并制作一个filter()
在每次按键时触发的方法?
编辑:基于 Bhupendra 的答案的解决方案:
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;
}
}
});
}
}