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 ) );

如果突出显示字符,则会出现三个错误:

一张图片中的三个错误

  1. 情况:JLabel 的文本完全可见。
    问题:列越宽(使用列标题调整大小),荧光笔越向右漂移(远离匹配的字符)。

  2. 情况: JLabel 的文本部分可见(用省略号绘制...),但突出显示的字符串完全可见。
    问题:在调整列宽时,荧光笔位置从一个像素到一个字符是错误的。

  3. 情况:JLabel 的文本和突出显示的字符串部分可见(荧光笔应该在省略号上)
    问题:省略号上的荧光笔在调整列宽时宽度错误(从无像素到正确宽度)。
    这是在左对齐列中也可见的唯一错误(荧光笔始终具有正确的宽度,但有时会跳到右侧)。

一个错误可以通过注释掉textR.x2 行来修复(从 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;
}

出现了两个较小的问题:
一个是如果匹配区域从第一个标签字符开始,则荧光笔开始向左多一个像素。如果使用列标题调整列的宽度,则第二个是在中心对齐的列中突出显示一个像素的跳跃。
两者(加上 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 

第三个错误可以通过(更改 XMatchingTextHighlighter.java 中的第 48 行)部分修复:

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

现在荧光笔总是从省略号的第一个像素开始,修复!:-)
但是在调整列大小时宽度会不断变化,错误!:-(

在调试了MatchingTextHighlighter.java 中的第二个和(剩下的一半)第三个错误之后,我认为对实用程序方法的调用

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

将参数textR设置为旧值。在调整列大小时,文本矩形的计算宽度似乎是“一个事件落后”。正因为如此,荧光笔的位置是错误的。

有没有人有办法解决这个问题?

感谢您阅读所有这些...

4

0 回答 0