0

こんにちは:)私は最初にJava6を使用しています。

特徴

を使用している場合JComboBox、通常は文字を入力してエントリを選択できます。いいですね。

問題

残念ながら、エントリがHTML文字列の場合、これは機能しません"<html><b>foo</b> <i>bar</i></html>"。ちなみに、私は主にエントリをさまざまな色で表示するためにHTMLを使用しています。

解決策、悪い

JComboBox$DefaultKeySelectionManagerしたがって、これを解決するために、エントリが。で始まる場合は、基本的にすべてのタグを無視して、を変更することにより、独自のKeySelectionListenerを実装しまし"<html>"た。

それはうまくいきます。しかし:私はデフォルトで使用されるものがであると考えるのは間違っていましたJComboBox$DefaultKeySelectionManager。なんで?入力された最初の文字のみを処理するためです。同じ文字で始まるエントリが多数ある長いリストの場合、これはまったく便利ではありません。

ボックスに入力されたすべての文字を処理するのが良い方法ですBasicComboBoxUI$DefaultKeySelectionManager(これがデフォルトです)。問題は、これがネストされたComboBoxUIと相互作用することです。それを取り、JList呼び出しますgetNextMatch(prefix, …)。悲しいことJList.getNextMatch()に、HTMLエントリは気にしません。

指定されたLAFが使用されるUIを決定するため、BasicComboBoxUIを単純に拡張して別のJList実装を作成することはできません。

何か案は?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 に答える