Вставка изображения в ячейку таблицы JFace вызывает появление пробела для изображения в первом столбце

Итак, у меня проблема: когда я добавляю изображение в любой столбец таблицы JFace, первый столбец также ведет себя так, как будто в нем есть изображение, а текст имеет отступ по размеру этого изображения.

Вот скриншот, иллюстрирующий мою точку зрения с кодом, необходимым для ее создания. Есть ли способ предотвратить это, потому что это действительно действует на мой фитиль?

С уважением,

Глен х

введите здесь описание изображения

package widgets;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.StyledCellLabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.PaletteData;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Display;

import org.eclipse.swt.widgets.Shell;

public class ComponentTest {

    private static Image image;

    public static void main(String[] args) {
        final Display display = new Display();
        final Shell shell = new Shell(display);
        shell.setLayout(new GridLayout(1, true));

        TableViewer viewer1 = getViewer(shell, true);
        TableViewer viewer2 = getViewer(shell, false);

        List<String> rows = new ArrayList<String>();
        rows.add("Row 1");
        rows.add("Row 2");

        viewer1.setInput(rows);
        viewer2.setInput(rows);

        shell.pack();
        shell.open();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
        display.dispose();
    }

    private static TableViewer getViewer(final Shell shell, boolean addImage) {
        TableViewer viewer = new TableViewer(shell, SWT.FULL_SELECTION
                | SWT.H_SCROLL | SWT.V_SCROLL | SWT.NONE);

        viewer.setContentProvider(ArrayContentProvider.getInstance());

        viewer.getTable().setLayoutData(
                new GridData(SWT.FILL, SWT.FILL, true, true));

        TableViewerColumn col = new TableViewerColumn(viewer, SWT.NONE);
        col.getColumn().setWidth(100);
        col.getColumn().setText("Text Column");
        col.setLabelProvider(new StyledCellLabelProvider() {
            @Override
            public void update(ViewerCell cell) {
                cell.setText((String) cell.getElement());
            }
        });

        col = new TableViewerColumn(viewer, SWT.NONE);
        col.getColumn().setWidth(100);
        col.getColumn().setText("Second Text Column");
        col.setLabelProvider(new StyledCellLabelProvider() {
            @Override
            public void update(ViewerCell cell) {
                cell.setText((String) cell.getElement());
            }
        });

        if (addImage) {
            col = new TableViewerColumn(viewer, SWT.NONE);
            col.getColumn().setWidth(100);
            col.getColumn().setText("Image Column");
            col.setLabelProvider(new StyledCellLabelProvider() {
                @Override
                public void update(ViewerCell cell) {
                    cell.setImage(getImage(shell.getDisplay()));
                }
            });
        }
        viewer.getTable().setHeaderVisible(true);

        return viewer;
    }

    // make a little green square
    private static Image getImage(Display display) {
        if (image == null) {
            PaletteData palette = new PaletteData(0xFF, 0xFF00, 0xFF0000);
            ImageData imageData = new ImageData(16, 16, 24, palette);

            for (int x = 0; x < 16; x++) {
                for (int y = 0; y < 16; y++) {
                    imageData.setPixel(x, y, 0xFF00);
                }
            }
            ;
            image = new Image(display, imageData);
        }
        return image;
    }
}

person Link19    schedule 28.09.2012    source источник


Ответы (3)


Это довольно раздражающая ошибка при использовании Windows. Вы можете использовать грязное исправление, пропустив первый столбец (не используя его) и установив его ширину равной нулю.

Насколько я правильно помню, это приведет к некоторым незначительным сбоям при использовании MacOS.

person Baz    schedule 28.09.2012
comment
Мне потребовалось 3 часа, чтобы сузить причину, по которой я получил пробел, еще полчаса я потратил на гугление проблемы без особого удовольствия и еще полчаса, чтобы написать сценарий и опубликовать его здесь. Вам потребовалось 3 минуты, чтобы ответить на мой вопрос. Слава, мой друг, слава. - person Link19; 28.09.2012
comment
@GlenLamb Некоторое время назад я столкнулся с той же проблемой. Вот почему я знал, как ответить на ваш вопрос ;) - person Baz; 28.09.2012

У меня была та же проблема, и я обошел ее, используя StyledCellLabelProvider с рисованием владельца и переопределением метода рисования для рисования изображения. Дело в том, что не стоит устанавливать изображение ячейки просмотра, потому что это даст баг. Я отправил пример кода в отчет об ошибке Eclipse.

person Henno Vermeulen    schedule 15.03.2013

Строка TableItem: 301: Я вижу здесь проблему с кодом SWT.

if (code == 0) return new RECT ();
            if (!getImage) {
                RECT iconRect = new RECT ();
                iconRect.left = OS.LVIR_ICON;
                parent.ignoreCustomDraw = true;
                code = OS.SendMessage (hwnd, OS. LVM_GETITEMRECT, row, iconRect);
                parent.ignoreCustomDraw = false;
                if (code != 0) rect.left = iconRect.right;


//****problem
    code = OS.SendMessage (hwnd, OS. LVM_GETITEMRECT, row, iconRect);

для первого средства просмотра таблиц с изображением здесь код равен 1, поэтому отрисовка текста начинается с iconRect правой координаты. для второй таблицы просмотра без изображения код равен нулю. поэтому он всегда начинается с фактических границ.

Если вы действительно хотите исправить это в CellStyleStyledCellLabelProvider, я бы посоветовал вам переопределить метод рисования там.

person sambi reddy    schedule 28.09.2012
comment
Это интересно, потому что в отчете об ошибке обвиняется window. - person Link19; 28.09.2012
comment
да. Это окна. переопределите метод рисования и проигнорируйте ViewerCell.getTextBounds() для первого столбца и нарисуйте свой текст, если хотите, чтобы он работал, пока окна SWT не будут исправлены. - person sambi reddy; 28.09.2012
comment
Рисование текста на самом деле также не работает, потому что фон, который он рисует вокруг текста, белый, а не прозрачный, из-за чего блики выглядят ужасно, намного хуже, чем пробел. - person Link19; 29.09.2012
comment
Используйте GC.drawText (String string, int x, int y, boolean isTransparent) - person sambi reddy; 29.09.2012