1

我正在使用 SWT JFaceTableViewer组件来显示数据列表。我已经实现了IColorProvider提供自定义的前景色和背景色。在大多数情况下,我提供带有浅色背景的黑色前景文本。但是,在某些情况下,我使用带有白色前景文本的深色背景颜色。这会导致 Windows 7 出现问题,即选择颜色为淡蓝色。

Windows 7 上发生的情况是,当我的表中的深色项目(行选择)被选择时,背景颜色是淡蓝色选择颜色。但是,前景色仍然是白色,您看不到它(请参阅下面的图 1)。

图 1:JFace SWT TableViewer - 在 Windows 7 中选择的行

  1. 首先,我在这里做错了吗?

  2. 其次,我尝试了以下方法来解决这个问题(关于 HOT 事件绘画的任何想法?):

    table.addListener(SWT.EraseItem, new Listener() {
        public void handleEvent(Event event) {
            System.out.println(event);
            boolean selected = (event.detail & SWT.SELECTED) == 0;
    
            event.detail &= ~SWT.HOT;
            TableItem item = (TableItem) event.item;
            int clientWidth = table.getClientArea().width;
            GC gc = event.gc;
            Color oldForeground = gc.getForeground();
            Color oldBackground = gc.getBackground();
            if (selected) {
                gc.setForeground(ColourHelper.WHITE);
                gc.setBackground(ColourHelper.WHITE);
                gc.fillRectangle(0, event.y, clientWidth, event.height);
            } else {
                gc.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_TITLE_BACKGROUND_GRADIENT));                 
                gc.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_TITLE_BACKGROUND));                  
                gc.fillGradientRectangle(0, event.y, clientWidth, event.height, true);
            }
    
            gc.setForeground(oldForeground);
            gc.setBackground(oldBackground);
            event.detail &= ~SWT.SELECTED;
        }
    });
    

当我重新运行我的测试应用程序时,我得到以下信息。选定的行现在已修复,但“悬停”的表行仍然存在问题,如图 2 所示。我试图在 EraseItem 处理程序中捕获 SWT.HOT 事件,但似乎没有做任何事。

图 2:JFace SWT TableViewer - 添加了 EraseItem 事件处理程序

我确实很幸运地添加了 PaintItem 事件处理程序(如下所示),但我必须在此代码中放置与单元格对齐相同的逻辑才能正确呈现。此外,我的绘画事件会触发并在正确渲染的 SELECTED Windows 7 颜色修复上绘画。

table.addListener(SWT.PaintItem, new Listener() {
    public void handleEvent(Event event) {

        boolean hot = (event.detail & SWT.HOT) == 0;
        if (hot) System.out.println("HOT!");
        if ((event.detail & SWT.HOT & ~SWT.SELECTED) == 0)
            return;
        event.detail &= ~SWT.HOT;
        final int TEXT_MARGIN = 3;
        GC gc = event.gc;

        gc.setForeground(ColourHelper.BLACK);
        gc.setBackground(ColourHelper.BLACK);

        TableItem item = (TableItem) event.item;
        item.setBackground(ColourHelper.BLACK);
        item.setForeground(ColourHelper.BLACK);
        String text = item.getText(event.index);
        int yOffset = 0;
        if (event.index == 1) {
            Point size = event.gc.textExtent(text);
            yOffset = Math.max(0, (event.height - size.y) / 2);
        }
        event.gc.drawText(text, event.x + TEXT_MARGIN, event.y + yOffset, true);
    }
});

总之,也许我做错了什么IColourProvider,就这么简单?Table或者,或TableViewer组件中存在错误。我已经通过下载 RCP 3.6.1 升级到最新版本,但我有同样的症状。

一些帮助将不胜感激:-)

4

0 回答 0