使用带有MatchingTextHighlighter的JXTable时错误突出显示

时间:2011-09-01 16:07:10

标签: java swing swingx jxtable swingx-highlighter

基本问题:

在更改TableColumn的宽度时,方法SwingUtilities.layoutCompoundLabel(..)将参数Rectangle textR设置为旧值(或'之前的值')。
我怎样才能获得当前(真实)的Rectangle值?


一些背景信息和错误修正:

我使用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 ) );

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

three bugs in one picture

  1. 情况:JLabel的文字完全可见 问题:列越宽(使用列标题调整大小),荧光笔将向右移动越多(从匹配的字符开始)。

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

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

  4. 第一个错误可以通过在{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;
    }
    

    出现两个较小的问题:
    一个是如果匹配区域从第一个Label字符开始,则荧光笔会更多地离开一个像素。如果使用列标题调整列的宽度,则第二个是在中心对齐列中的高亮点 - 单像素跳跃。
    两个(加上一个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设置为旧值。在调整列的大小时,文本矩形的计算宽度似乎是“后面的一个事件”。因此,荧光笔的位置是错误的。

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

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

0 个答案:

没有答案