Выбор SWT JFace TableViewer в Windows 7 - PullRequest
1 голос
/ 03 июня 2011

Я использую компонент SWT JFace TableViewer для отображения списка данных.Я реализовал 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. Я попытался захватить событие SWT.HOT в обработчике EraseItem, но это не похожесделать что-нибудь.

Рисунок 2: JFace SWT TableViewer - добавлен обработчик событий EraseItem

Мне немного повезло, добавив обработчик событий PaintItem (как показано ниже), ноМне нужно будет поместить ту же логику относительно выравнивания ячеек в этот код, чтобы он правильно отображалсяКроме того, мое событие рисования запускает и закрашивает корректно отображаемое исправление ВЫБОР цвета 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, но у меня те же симптомы.

Некоторая помощь будет высоко ценится: -)

...