基本问题:
在更改 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 ) );
如果突出显示字符,则会出现三个错误:
情况:JLabel 的文本完全可见。
问题:列越宽(使用列标题调整大小),荧光笔越向右漂移(远离匹配的字符)。情况: JLabel 的文本部分可见(用省略号绘制...),但突出显示的字符串完全可见。
问题:在调整列宽时,荧光笔位置从一个像素到一个字符是错误的。情况:JLabel 的文本和突出显示的字符串部分可见(荧光笔应该在省略号上)
问题:省略号上的荧光笔在调整列宽时宽度错误(从无像素到正确宽度)。
这是在左对齐列中也可见的唯一错误(荧光笔始终具有正确的宽度,但有时会跳到右侧)。
第一个错误可以通过注释掉textR.x
2 行来修复(从 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
设置为旧值。在调整列大小时,文本矩形的计算宽度似乎是“一个事件落后”。正因为如此,荧光笔的位置是错误的。
有没有人有办法解决这个问题?
感谢您阅读所有这些...