SWT StyleledText - таблица с MexerItem Слушатель прыгает вверх

StackOverflow https://stackoverflow.com/questions/4502506

  •  12-10-2019
  •  | 
  •  

Вопрос

У меня есть виджет StyledText с встроенными элементами управления таблицей. Однако, как только я добавлю слушателя MeartiTem, чтобы настроить размер ячеек таблицы, таблица появляется в верхней части виджета StyleDext, когда я впервые прокручиваю, оставаясь там, пока я не прокручиваю всю дорогу до ожидаемого местоположения.

Это известная проблема? Я просто что -то делаю не так?

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

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();
    }
}
Это было полезно?

Решение

Я понятия не имею, почему ты это делаешь, но в любом случае ..

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

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

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

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

table.setVisible(false); // *** prevents table from IMMEDIATELY jumping
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top