2010-12-21 8 views
3

Ich habe ein StyledText-Widget mit eingebetteten Table-Steuerelementen. Nachdem ich jedoch einen MeasureItem-Listener hinzugefügt habe, um die Größe der Tabellenzellen anzupassen, wird die Tabelle beim ersten Bildlauf oben im Widget "StilledText" angezeigt und verbleibt dort, bis ich den gesamten Bildlauf bis zur erwarteten Position durchgeblättert habe.SWT StyledText - Tabelle mit MeasureItem-Listener springt nach oben

Ist dies ein bekanntes Problem? Mache ich gerade etwas falsch?

Code-Snippet:

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

Antwort

2

Ich habe keine Ahnung, warum tust du das, aber trotzdem ..

Ihr Tisch ist nicht angemessen nach der Erstellung befindet, und es „sitzt“ auf Basis Koordinaten (0, 0). Also musst du den Tisch an der richtigen Stelle finden.

Fügen Sie diese Zeile nach styledText.setStyleRange(style); und es wird funktionieren, wie Sie brauchen.

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

Und es ist dann nicht notwendig, diese Linie zu haben, können Sie es löschen können ..

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

Ich verstehe immer noch nicht, warum die MeasureListener „verursacht“ das Problem (erzwingt es eine Farbe ? den Tisch sichtbar machen?) - aber das löst das Problem definitiv. Vielen Dank! – Rini