2010-12-21 75 views
3

我有一個帶嵌入式表格控件的StyledText小部件。但是,一旦我添加一個MeasureItem偵聽器來調整表格單元格的大小,表格會在我第一次滾動時出現在StyledText窗口小部件的頂部,直到我滾動到預期位置。SWT StyledText - 帶MeasureItem偵聽器的表跳轉到頂部

這是一個已知的問題?我只是做錯了什麼?

代碼片段:

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(); 
    } 
} 

回答

2

我不知道,你爲什麼這樣做,但無論如何..

你的表是不是位於創建後適當,而且「坐」在基地座標(0,0)。所以你必須把桌子放在正確的地方。

styledText.setStyleRange(style);之後加上此行,它將按需要工作。

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

然後它是沒有必要的,有這條線,你可以將其刪除..

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

我還是不明白,爲什麼MeasureListener「造成」的問題(它迫使塗料?設置表格可見?) - 但這絕對可以解決問題。謝謝! – Rini 2011-08-24 14:28:10