SWT StyledText - таблица с прослушивателем MeasureItem переходит наверх - PullRequest
3 голосов
/ 21 декабря 2010

У меня есть виджет StyledText со встроенными элементами управления таблицей.Однако после добавления прослушивателя MeasureItem для настройки размера ячеек таблицы таблица появляется в верхней части виджета StyledText при первой прокрутке, оставаясь там до тех пор, пока не прокрутите весь путь до ожидаемого местоположения.1002 * Это известная проблема?Я что-то не так делаю?

Фрагмент кода:

import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.PaintObjectEvent;
import org.eclipse.swt.custom.PaintObjectListener;
import org.eclipse.swt.custom.StyleRange;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.graphics.GlyphMetrics;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;

public class JumpingTable {

    public static void main(String[] args) {
        // Initialize GUI
        Display display = new Display();
        Shell shell = new Shell(display);

        // Create editor
        StyledText styledText = new StyledText(shell, SWT.V_SCROLL);
        shell.setLayout(new FillLayout());

        // Insert lots of text
        for (int i=0; i<100; ++i) {
            styledText.append("Lorem ipsum\r\n");
        }

        // Create table
        Table table = new Table(styledText, SWT.NONE);
        table.setVisible(false); // *** prevents table from IMMEDIATELY jumping
        for (int i=0; i<3; ++i) {
            TableColumn column = new TableColumn(table, SWT.NONE);
            column.setWidth(100);
        }
        for (int i=0; i<3; ++i) {
            TableItem row = new TableItem(table, SWT.NONE);
            row.setText(new String[] {"a", "b", "c"});
        }

        // Place table
        int tableOffset = styledText.getCharCount();
        styledText.append("\uFFFC");  // Object Replacement Code
        StyleRange style = new StyleRange();
        style.start = tableOffset;
        style.length = 1;
        style.data = table;
        //table.pack();
        table.setSize(300, 150);  // accomodate MeasureItem's sizing
        Rectangle rect = table.getBounds();
        int ascent = 2*rect.height/3;
        int descent = rect.height - ascent;
        style.metrics = new GlyphMetrics(ascent, descent, rect.width);
        styledText.setStyleRange(style);

        // Draw table
        styledText.addPaintObjectListener(new PaintObjectListener() {

            @Override
            public void paintObject(PaintObjectEvent event) {
                Table table = (Table) event.style.data;
                table.setVisible(true);
                int y = event.y + event.ascent - event.style.metrics.ascent;
                table.setLocation(event.x, y);
            }   
        });

        // Adjust sizing
        table.addListener(SWT.MeasureItem, new Listener() {

            @Override
            public void handleEvent(Event event) {
                if (event.type == SWT.MeasureItem) {
                    event.width = 100;
                    event.height = 50;
                }
            }   
        });

        // Display GUI
        shell.open();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch())
                display.sleep();
        }

        // Clean up
        display.dispose();
    }
}

1 Ответ

2 голосов
/ 26 июля 2011

Понятия не имею, зачем вы это делаете, но в любом случае ..

Ваша таблица не расположена надлежащим образом после создания, и она "сидит" на базовых координатах (0, 0).Таким образом, вы должны расположить таблицу в нужном месте.

Добавьте эту строку после styledText.setStyleRange(style);, и она будет работать так, как вам нужно.

table.setLocation(styledText.getLocationAtOffset(styledText.getCharCount()));

И тогда нет необходимости иметь этострока, вы можете удалить его ..

table.setVisible(false); // *** prevents table from IMMEDIATELY jumping
...