2016-06-05 12 views
0

Ich erstelle eine Editor-Erweiterung zu Eclipse, und für einen Teil des Editors muss ich einfache grafische Teile zeichnen. Von dem, was ich verstehe, sollte ich in der Lage sein, das Eclipse-Widget Canvas zu verwenden. Die paintControl-Methode des PaintListener, die der Zeichenfläche hinzugefügt wird, wird jedoch nie aufgerufen. Ich gehe davon aus, dass mir ein entscheidender einfacher Teil fehlt, aber ich kann es nicht finden. Hier ist der Code, der erstellt, fügt hinzu und ruft neu zeichnen auf der Leinwand.Eclipse-Canvas paintListener nie aufgerufen

void createGraphicPage() { 
    Composite composite = new Composite(getContainer(), SWT.NONE); 
    drawWidget = new Canvas(composite, SWT.NONE); 

    FormLayout layout = new FormLayout(); 
    drawWidget.setLayout(layout); 
    drawWidget.addPaintListener(new PaintListener() { 
     @Override 
     public void paintControl(PaintEvent e) { 
      System.out.println("inDrawWidget"); 
      Rectangle r = drawWidget.getClientArea(); 
      e.gc.drawOval(0, 0, r.width, r.height); 
     } 
    }); 
    drawWidget.redraw(); 
    int index = addPage(composite); 
    setPageText(index, "Graphics Editor"); 
} 
+0

Das Festlegen eines Layouts auf dem 'drawedWidget' ist nicht notwendig, da Sie dem übergeordneten Element (das 'composite') kein Layout zugewiesen haben. Wie groß ist das 'drawedWidget'? –

+0

Ich habe versucht, das gleiche Layout auf Composite ohne Unterschied im Verhalten einzustellen. Bei Größe nehme ich an, du meinst r Breite und Höhe? Ich weiß nicht, was sie sind, da die Methode nie aufgerufen wird, kann ich sie nicht debuggen oder drucken: S Wenn ich DrawWidget.getClientArea() außerhalb des Paintlistener aufrufen, bekomme ich Breite und Höhe 0. Sollten sie nicht etwas vom Eltern erben zusammengesetzt? Wenn ich getContainer.getClientArea() aufrufen bekomme ich die Größe (0, -20) – Xaja

+1

Die 'width und height 0' von 'drawnWidget' ist der Grund, warum der PaintListener nie aufgerufen wird. Kinder erben keine Layouts oder Größen von ihren Eltern. Weisen Sie dem übergeordneten Element ein geeignetes Layout zu, siehe [Grundlegendes zu Layouts in SWT] (https://www.eclipse.org/articles/article.php?file=Article-Understanding-Layouts/index.html) für weitere Informationen zu Layouts in SWT . –

Antwort

0

Sie benötigen ein Layout auf jeden Composite zu setzen, die Steuerelemente enthält, und in der Regel Layoutdaten auf den Kontrollen. Also:

Composite composite = new Composite(getContainer(), SWT.NONE); 
composite.setLayout(new GridLayout()); 

Canvas drawWidget = new Canvas(composite, SWT.NONE); 
drawWidget.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); 

drawWidget.addPaintListener(new PaintListener() { 
    @Override 
    public void paintControl(final PaintEvent e) { 
     System.out.println("inDrawWidget"); 
     final Rectangle r = drawWidget.getClientArea(); 
     e.gc.drawOval(0, 0, r.width, r.height); 
    } 
}); 

Ich habe ein GridLayout die Composite und GridData Layoutdaten zu den Canvas hinzugefügt. Die GridData macht die Canvas nutzen alle verfügbaren Speicherplatz.

Verwandte Themen