2010-12-21 2 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 
MeasureListener이 문제가 (이 페인트를 강제 않습니다 "원인"왜 난 아직도 이해가 안
+0

? 테이블을 표시 설정?) -하지만이 문제는 확실히 해결됩니다. 고맙습니다! – Rini