1

我正在尝试制作一个 ComboBox,它具有从其项目中搜索匹配项的功能。

这是我所做的代码示例,

ObservableList<String> ab = FXCollections.observableArrayList("z", "asxdf", "abasdf", "bcasdf", "b", "bc", "bcd", "c");

final ComboBox box = new ComboBox(ab);
box.setEditable(true);

box.setOnKeyReleased(new EventHandler<KeyEvent>() {
   @Override
   public void handle(KeyEvent t) {

      box.show();

      for (String item : items) {
         if (item.startsWith(box.getEditor().getText())) {

             box.getSelectionModel().select(item); //which selects the item.

             break;
         }
      }
   }
});

现在的问题是box.getSelectionModel().select(item);选择在 ComboBox 中键入的特定项目,但我不想选择该项目,我只想像鼠标悬停时那样悬停(聚焦)该项目。

谁能告诉我要替换的代码box.getSelectionModel().select(item);并帮助我解决这个问题。

4

2 回答 2

4

您可以通过以下代码从 ComboBox 获取 ListView:

ListView<?> lv = ((ComboBoxListViewSkin) getSkin()).getListView();

然后您可以专注于该项目:

lv.getFocusModel().focus(N);

或者只是滚动到它:

lv.scrollTo(N)
于 2016-04-11T12:09:51.463 回答
1

回复晚了,但是我今天将一个洞应用程序从 Swing 迁移到 FX 后才遇到这个问题。我正在使用 Java 8。(仍然)

这就是我让它工作的方式。希望它会有所帮助,以防有人仍然有这个问题。

public class MyComboBox extends ComboBox<String> {
    public EditorComboBox() {

        // this event is created when the internal listView is displayed
        setOnShowing(event -> {
            ComboBoxListViewSkin<?> skin = (ComboBoxListViewSkin<?>)getSkin();
            if (skin != null) {
                ((ListView<?>) skin.getPopupContent()).scrollTo(getSelectionModel().getSelectedIndex());
            }
        });
    }
}
于 2020-04-20T14:29:10.320 回答