我有一个带有嵌入式Table控件的StyledText小部件。但是,一旦添加了MeasureItem侦听器来调整表格单元格的大小,表格就会在我第一次滚动时显示在StyledText小部件的顶部,一直保持在那里,直到我一直滚动到期望的位置为止。

这是一个已知的问题?我是在做错什么吗?

程式码片段:

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

关于java - SWT StyledText-具有MeasureItem监听器的表跳到顶部,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4502506/

10-10 22:34