为何DefaultListModel的getSelectedIndex始终返回0?如何获取选中索引?
解决AutoCompleteTextField无法获取实际选中项索引的问题
你遇到的问题根源在于DefaultListModel本身不维护选中状态,它只是存储数据的容器,getSelectedIndex()方法在这里并不能反映用户实际选中的选项。正确的做法是从AutoCompleteTextField组件本身获取选中信息,而非直接调用模型的方法。
以下是两种可行的解决方式:
方式一:通过文本框内容匹配模型中的索引
用户选择选项后,AutoCompleteTextField的文本内容会同步为选中项的内容,因此可以通过文本内容在模型中查找对应的索引:
labelACField.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent evt) { if (filteredIdObjs != null) { // 获取文本框当前的内容 String selectedContent = labelACField.getText(); // 在DefaultListModel中查找该内容对应的索引 selectedIdx = options.indexOf(selectedContent); // 如果是自定义对象,确保对象的equals方法已正确实现 } } });
方式二:直接获取下拉列表的选中索引
如果你的AutoCompleteTextField实现提供了获取内部下拉JList的方法(比如getList()),可以直接通过JList获取选中索引:
labelACField.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent evt) { if (filteredIdObjs != null) { // 获取AutoCompleteTextField内部的下拉列表 JList<?> dropdownList = labelACField.getList(); // 从下拉列表中获取实际选中的索引 selectedIdx = dropdownList.getSelectedIndex(); } } });
额外注意事项
- 确保你的
filter方法正确实现:空的filter方法可能导致模型数据未正确过滤,影响索引匹配,需要根据输入文本更新模型中的选项集合。 - 如果模型中存储的是自定义对象而非字符串,必须重写对象的
equals和hashCode方法,否则indexOf无法正确找到对应对象的索引。
内容的提问来源于stack exchange,提问作者Daniel Tsai
相关产品推荐
相关产品推荐

