具有多列的组合框 - 按键搜索
ComboBox with multiple columns - search by key
我有一个显示 2 列的 JComboBox。现在我想启用对所有列的按键搜索。示例:
Column1 | Column2
A1 | S1
A2 | B1
A3 | P1
第一列的按键搜索在 JComboBox 的默认 KeySelectionManager 实现中运行良好。但是,我也希望能够搜索第二列,这意味着当我按 'B' 时,第二个项目被选中。
我查看了 KeySelectionManager,但没有找到任何有用的信息。我附上了 ComboBox 的屏幕截图来说明我的意思。
感谢您的指点。
检查 JComboBox 源代码中的 Key SelectionManager 实现
class DefaultKeySelectionManager implements KeySelectionManager, Serializable {
public int selectionForKey(char aKey,ComboBoxModel aModel) {
....
for ( i = ++currentSelection, c = aModel.getSize() ; i < c ; i++ ) {
Object elem = aModel.getElementAt(i);
if (elem != null && elem.toString() != null) {
v = elem.toString().toLowerCase();
if ( v.length() > 0 && v.charAt(0) == aKey )
return i;
}
}
因此请尝试重写您模型的 Element 的 class toString() 方法以包含两列。
如果您在组合框中显示两列,那么您必须使用自定义渲染器。
所以也许 Combo Box With Custom Renderer 中介绍的方法可以提供帮助。博客中的解决方案将渲染器和KeySelectionManager 合并为一个class。您需要做的就是实现 getDisplayValue()
方法以 return 渲染器的文本。
在您的情况下,您有两段文本要呈现和搜索,因此您可以将 getDisplayValue()
方法更改为 return 要显示的文本列表。
然后渲染器可以使用列表中的两个项目,class 的 getNextMatch()
方法也将被修改以检查列表中的每个项目是否匹配。
我有一个显示 2 列的 JComboBox。现在我想启用对所有列的按键搜索。示例:
Column1 | Column2
A1 | S1
A2 | B1
A3 | P1
第一列的按键搜索在 JComboBox 的默认 KeySelectionManager 实现中运行良好。但是,我也希望能够搜索第二列,这意味着当我按 'B' 时,第二个项目被选中。
我查看了 KeySelectionManager,但没有找到任何有用的信息。我附上了 ComboBox 的屏幕截图来说明我的意思。
感谢您的指点。
检查 JComboBox 源代码中的 Key SelectionManager 实现
class DefaultKeySelectionManager implements KeySelectionManager, Serializable {
public int selectionForKey(char aKey,ComboBoxModel aModel) {
....
for ( i = ++currentSelection, c = aModel.getSize() ; i < c ; i++ ) {
Object elem = aModel.getElementAt(i);
if (elem != null && elem.toString() != null) {
v = elem.toString().toLowerCase();
if ( v.length() > 0 && v.charAt(0) == aKey )
return i;
}
}
因此请尝试重写您模型的 Element 的 class toString() 方法以包含两列。
如果您在组合框中显示两列,那么您必须使用自定义渲染器。
所以也许 Combo Box With Custom Renderer 中介绍的方法可以提供帮助。博客中的解决方案将渲染器和KeySelectionManager 合并为一个class。您需要做的就是实现 getDisplayValue()
方法以 return 渲染器的文本。
在您的情况下,您有两段文本要呈现和搜索,因此您可以将 getDisplayValue()
方法更改为 return 要显示的文本列表。
然后渲染器可以使用列表中的两个项目,class 的 getNextMatch()
方法也将被修改以检查列表中的每个项目是否匹配。