Windows 7中的SWT JFace TableViewer选择

时间:2011-06-03 10:08:52

标签: java user-interface swt jface tableviewer

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

在Windows 7上发生的事情是当我选择表格中的深色项目(行选择)时,背景颜色是淡蓝色选择颜色。但是,前景色仍为白色,您无法看到它(参见下面的图1)。

Figure 1: JFace SWT TableViewer - Row Selected in 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;
        }
    });
    
  3. 当我重新运行我的测试应用程序时,我得到以下内容。选中的行现在已经修复,但是如图2所示,表格行仍然存在“悬停”的问题。我试图在EraseItem处理程序中捕获SWT.HOT事件,但似乎没有做任何事。

    Figure 2: JFace SWT TableViewer - Added EraseItem Event Handler

    我确实有一些运气添加了PaintItem事件处理程序(如下所示),但我必须在此代码中放置与单元格对齐相同的逻辑,以便正确呈现。此外,我的paint事件会在正确呈现SELECTED Windows 7 Color修复程序时触发并绘制。

    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做错了,这很简单吗?或者,TableTableViewer组件中存在错误。我通过下载RCP 3.6.1升级到最新版本,但我有相同的症状。

    非常感谢一些帮助: - )

0 个答案:

没有答案