さて、ここに解決策があります。
JLabel
つまり、ハイライトを手動で描画するようにサブクラス化できます。メソッドをオーバーライドpaintComponent
して実際の描画を行いFontMetrics
、強調表示された領域を描画する場所を計算するために使用します。
耐え難いほど詳細な答えは次のとおりです。
基本的に、JLabel
ものを強調表示できるサブクラスを作成できます。私はこのようにします。多少異なる方法で行うこともできます:
強調表示する部分をラベルに伝えるメソッドを追加します。これは、強調表示された領域が 1 つだけ必要であると仮定すると、次のようになります。
public void highlightRegion(int start, int end) {
// Set some field to tell you where the highlight starts and ends...
}
複数の領域が必要な場合は、単純なフィールドの代わりに ArrayList を使用してください。強調表示を解除する方法もおそらく役立つでしょう。
paintComponent
ここで、 のメソッドをオーバーライドする必要がありますJLabel
。ここでは、いくつかの個別の手順を実行する必要があり、さまざまな方法または何かで整理する必要がある場合があります。簡単にするために、すべてを paint メソッドに入れます。
@Override
protected void paintComponent(Graphics g) {
...
最初に、ハイライトの物理的な寸法を把握する必要があります。これは、niceFontMetrics
クラスを使用して行うことができます。FontMetrics
使用している のクラスを作成しますFont
。
FontMetrics metrics = new FontMetrics(getFont());
これで、ハイライトとなる長方形を作成するために必要なすべての情報を取得できます。開始位置、高さ、幅が必要です。これを取得するには、JLabel
次のように のテキストの2 つの部分文字列が必要です。
String start = getText().substring(0, startOfHighlight);
String text = getText().substring(startOfHighlight, endOfHighlight);
//You may also need to account for some offsets here:
int startX = metrics.stringWidth(start);
int startY = 0; //You probably have some vertical offset to add here.
int length = metrics.stringWidth(text);
int height = metrics.getHeight();
これで、残りのラベルを描画する前に、強調表示された領域を描画できます。
g.fillRect(startX, startY, length, height);
super.paintComponent(g);
}
もちろん、ハイライトを複数の行にまたがらせたい場合は、さらに作業が必要になります。
不思議に思っているなら、私は実際に以前にこのようなことを書きました。気まぐれで、 から独自のテキスト領域タイプのコンポーネントを作成することにしましたJPanel
。これは基本的に、強調表示を処理する方法でした。車輪の再発明は、実際のプロジェクトではばかげているかもしれませんが、役に立つかもしれないランダムなことを教えてくれます...