私は SWT/JFace テクノロジーにかなり慣れていないので、頭がおかしくなるという問題を発見しました。Eclipse RCP アプリケーションには、ラベル プロバイダーによってラベルとアイコンを提供する JFace TreeViewer を使用して SWT ツリーを配置したビューがあります。顧客の要求により、ツリーの背景色は濃い青、フォントの色は白です。この色の組み合わせにより、ノードが選択されたときにノードのテキストがうまく表示されず、テキストがツリー領域に収まらず、ノード上にマウス ポインターを置いたときに表示されなくなります。どういうわけか「ネイティブのハイライト」が表示されます。これは、次の図に示すことができます。
一方、マウスを置いたノードが選択されていない場合、この問題は発生しません。強調表示すると、フォントの色が変わり、見やすくなります。これは、次の図に示すことができます。
いくつかの調査を行った後、イベントのリスナーを追加することで、選択したノードの背景色を変更してから選択を無効にできることがわかりました。SWT.EraseItem
これにより、独自の選択背景スタイルを定義し、ノードが選択されていないときに OS を強制的に強調表示するためにのSWT.SELECTED
フラグを無効にすることもできます。event.detail
private final class EraseItemListener implements Listener {
public void handleEvent(Event event) {
// Only perform the node highlight when it is selected.
if ((event.detail & SWT.SELECTED) == SWT.SELECTED) {
// Modify background, emulate Windows highlighting.
...
// Set Windows that we do not want to draw this item as a selection (we have already highlighted the item in our way).
event.detail &= ~SWT.SELECTED;
}
}
}
この「解決策」は合理的です。主な欠点は、私の選択スタイルが Windows 7 の既定のビジュアル テーマにしか適合しないことです。これらの「Windows クラシック」または「ハイ コントラスト」では、視覚化の問題が発生します。さらに (そしてこれが最も厄介な問題です)、SWT.EraseItem
(イベントを処理するコードがなくても) のリスナーを追加すると、2 つの新しい問題が発生します。
これにより、次の図に示すように、SWT または JFace のいずれかがツリー ノードのアイコンを間違った場所に描画します。
ツリーのルート ノードのハイライトは完全に間違っています。次の画像でわかるように、ノードは 2 つの異なる方法で強調表示され、アイコンが繰り返されているように見えます。
私の質問は基本的に2つです。
主な問題に対するより簡単な解決策があると思いますか? 私が望むのは、選択したノード(最初の画像のノード)を2番目の画像と同じ方法で表示することです。選択したノードの前景色を変更して見やすくしたいと考えています。
このアプローチを使用する場合
SWT.EraseItem
、アイコンを正しい場所に表示する方法はありますか? この動作は既知のバグですか?
前もって感謝します。