JComboBox:如何获得适用于HTML条目的键选择?

时间:2012-05-09 16:39:19

标签: java swing jcombobox

你好:)我正在使用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并没有解决这个问题?

1 个答案:

答案 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());