私は(私の目には)ばかげた問題に出くわしました。ただし、これに対する解決策は見つかりません(おそらく、適切な検索キーワードを使用していないため、または簡単な場合は難しすぎるためです。)シナリオ:
500人の顧客がいるコンボボックスがあります。私は1人の貸衣装を選択する必要があります。
Swingでは、リストが表示されて入力を開始すると、入力した文字に自動的にジャンプします。例えば:
アイテム:
- アダム
- ダーク
- フレディ
- ..。
- ロジャー
- スティーブン
- 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;
}
}
});
}
}