你好:)我正在使用Java 6,开始。
当您使用JComboBox
时,通常可以通过键入字符来选择条目。这很好。
不幸的是,如果你的条目是HTML字符串,例如,这不起作用。 "<html><b>foo</b> <i>bar</i></html>"
。顺便说一下,我主要使用HTML来显示不同颜色的条目。
因此,为了解决这个问题,我通过更改JComboBox$DefaultKeySelectionManager
实现了自己的KeySelectionListener,如果条目以"<html>"
开头,则基本上忽略所有标记。
有效。 但是:我错误地认为默认情况下使用的是JComboBox$DefaultKeySelectionManager
。为什么?因为它只处理输入的第一个字符。对于包含许多以相同char开头的条目的长列表,这根本不方便。
处理框中输入的所有字符的好处是BasicComboBoxUI$DefaultKeySelectionManager
(这是默认值)。问题是,这个与嵌套ComboBoxUI交互。它需要JList
并调用getNextMatch(prefix, …)
。可悲的是JList.getNextMatch()
并不关心HTML条目。
我不能简单地将BasicComboBoxUI扩展为具有不同的JList实现,因为给定的LAF决定使用哪个UI。
有什么想法吗?我想,Java 7并没有解决这个问题?
答案 0 :(得分:2)
这确实是一个皮塔饼,我也遇到了同样的问题。最后,组合框使用模型中包含的对象的toString()方法进行键选择。最简单的方法是将所有HTML字符串包装到具有toString()方法的对象中,这些对象返回用于选择的文本,并使用单元格渲染器来呈现HTML。例如:
public class HtmlOption {
private final String rawText;
private final String htmlText;
private HtmlOption(String rawText, String htmlText) {
this.rawText = rawText;
this.htmlText = htmlText;
}
public String toString() {
return this.rawText;
}
// getters, equals and hashCode omitted
}
然后用这些对象填充你的组合:
model.addElement(new HtmlOption("foo bar", "<html><b>foo</b> <i>bar</i></html>"));
并将渲染器设置为组合框
setText(((HtmlOption) value).getHtmlText());