0

您好 :) 我首先使用的是 Java 6。

特征

当您使用 时JComboBox,您通常可以通过键入字符来选择一个条目。这很好。

问题

不幸的是,如果您的条目是 HTML 字符串,例如"<html><b>foo</b> <i>bar</i></html>". 顺便说一句,我主要使用 HTML 来以不同的颜色显示我的条目。

解决办法,不好

所以,为了解决这个问题,我通过改变实现了我自己的 KeySelectionListener JComboBox$DefaultKeySelectionManager,如果条目以"<html>".

这样可行。但是:我错误地认为默认使用的是JComboBox$DefaultKeySelectionManager. 为什么?因为它只处理输入的第一个字符。对于具有许多以相同字符开头的条目的长列表,这根本不方便。

处理输入框中的所有字符的好方法是BasicComboBoxUI$DefaultKeySelectionManager(这是默认设置)。问题是,这个与嵌套的 ComboBoxUI 交互。它接受它JList并调用getNextMatch(prefix, …)。可悲的是JList.getNextMatch()不关心 HTML 条目。

我不能简单地将 BasicComboBoxUI 扩展为具有不同的 JList 实现,因为给定的 LAF 决定使用哪个 UI。

有任何想法吗?我猜 Java 7 没有解决这个问题?

4

1 回答 1

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());
于 2012-05-09T16:56:25.297 回答