1

基本的な質問:

TableColumnの幅を変更している間、メソッド SwingUtilities.layoutCompoundLabel(..)はパラメーターRectangle textRを古い値(または「前の値」)に設定します。
現在の(実際の)長方形の値を取得するにはどうすればよいですか?


いくつかの背景情報とバグ修正:

SwingLabs-Demos のMatchingTextHighlighter.javaを使用しています(例はSearchDemo.javaです)

JXTableセルで見つかった文字だけをマークするのは非常に良いスタートです。ただし、セルコンテンツの配置をからに変更する、蛍光ペンの位置に問題が発生します。LEFT

table.getColumnExt( 1 ).setCellRenderer( new DefaultTableRenderer( null, SwingConstants.RIGHT ) );

また

table.getColumnExt( 1 ).setCellRenderer( new DefaultTableRenderer( null, SwingConstants.CENTER ) );

文字が強調表示されると、次の3つのバグが発生します。

1枚の写真に3つのバグ

  1. 状況:JLabelのテキストが完全に表示されます。
    問題:列の幅が広くなると(列ヘッダーを使用してサイズが変更される)、蛍光ペンが右にドリフトします(一致した文字からのawaaay)。

  2. 状況:JLabelのテキストは部分的に表示されますが(省略記号でペイントされています...)、強調表示された文字列は完全に表示されます。
    問題:列幅のサイズを変更しているときに、蛍光ペンの位置が1ピクセルから1文字に間違っています。

  3. 状況:JLabelのテキストと強調表示された文字列が部分的に表示されます(強調表示は省略記号上にある必要があります)
    問題:列幅のサイズ変更中に、省略記号の強調表示の幅が間違っています(ピクセルなしから正しい幅まで)。
    これは、左揃えの列にも表示される唯一のバグです(蛍光ペンの幅は常に正しいですが、右にジャンプすることがあります)。

最初のバグは、2行でコメントアウトすることで修正できますtextR.x(MatchingTextHighlighter.javaの327行目から)。

if (start == 0) {
    // start highlight from the start of the field
    highlightx = /* textR.x + */ xOffset;
} else {
    // Calculate the width of the unhighlighted text to get the
    // start of the highlighted region.
    String strToStart = text.substring(0, start);
    highlightx = /* textR.x + */ fm.stringWidth(strToStart) + xOffset;
}

2つの小さな問題が発生します
。1つは、一致した領域が最初のラベル文字で始まる場合、蛍光ペンがさらに1ピクセル左に始まることです。2つ目は、蛍光ペンです。列ヘッダーを使用して列の幅のサイズを変更した場合、中央揃えの列で1ピクセルジャンプします。
両方(およびRightToLeft-Error)は、これらの変更(MatchingTextHighlighter.javaの397行目から開始)で修正できます。

    return textR.x;//respect the icon and start the highlight at the beginning of the text not at 0
} else if (horizAlignment == SwingConstants.RIGHT
        || (horizAlignment == SwingConstants.TRAILING && leftToRight)  //fix for rtol: ! deleted
        || (horizAlignment == SwingConstants.LEADING && !leftToRight))  //fix for rtol: ! added
{
    return viewR.width - textR.width;
} else if (horizAlignment == SwingConstants.CENTER) {
    return Math.round((viewR.width - textR.width) / 2f) - 1;  //round a float to prevent a one-pixel-jumping Highlighter 

3番目のバグは、(XMatchingTextHighlighter.javaの48行目を変更する)ことで部分的に修正できます。

int end = /* myTextR.x + */ fm.stringWidth(text) + offset;

これで、蛍光ペンは常に省略記号の最初のピクセルから始まります。修正してください。:-)
しかし、列のサイズを変更している間、幅は変化し続けます、エラー!:-(

MatchingTextHighlighter.javaの2番目と3番目のバグ(残りの半分)をデバッグした後、ユーティリティメソッドの呼び出しだと思います

String clippedText = SwingUtilities.layoutCompoundLabel(.....)

パラメータtextRを古い値に設定します。列のサイズを変更しているときに、計算されたテキストの長方形の幅が「1イベント遅れている」ように見えます。このため、蛍光ペンの位置が間違っています。

誰かがこれを修正するアイデアを持っていますか?

これをすべて読んでくれてありがとう...

4

0 に答える 0