2017-07-18 1 views
1

Je suis en train de mettre à jour juste une partie d'une toile dans SWT, mais je ne comprends pas comment le faire.swt: Comment mettre à jour (redessiner) seulement une partie d'une toile

Je lis tht je dois utiliser le setClipping, la documentation dit en effet: « Définit la zone du récepteur qui peut être modifiée en tirant des opérations sur la zone rectangulaire spécifiée par l'argument Spécification NULL pour le rectangle reprend le. la zone de détourage du destinataire à sa valeur d'origine. "

donc j'ai juste essayé, mais sans succès, voici un exemple simple:

import org.eclipse.swt.SWT; 
import org.eclipse.swt.events.*; 
import org.eclipse.swt.graphics.*; 
import org.eclipse.swt.layout.*; 
import org.eclipse.swt.widgets.*; 


public class SimpleCanvas { 

    boolean manualDraw=false; 
    public void run() { 
     Display display = new Display(); 
     Shell shell = new Shell(display); 
     shell.setText("Canvas Example"); 
     createContents(shell); 
     shell.open(); 
     while (!shell.isDisposed()) { 
      if (!display.readAndDispatch()) { 
       display.sleep(); 
      } 
     } 
     display.dispose(); 
    } 

    /** 
    * Creates the main window's contents 
    * 
    * @param shell the main window 
    */ 
    private void createContents(Shell shell) { 
     shell.setLayout(new FillLayout()); 

     // Create a canvas 
     Canvas canvas = new Canvas(shell, SWT.NONE); 

     // Create a button on the canvas 
     Button button = new Button(shell, SWT.PUSH); 
     button.setBounds(10, 10, 300, 40); 
     button.setText("TEST"); 
     button.addListener(SWT.Selection, new Listener() { 
      public void handleEvent(Event e) { 
       switch (e.type) { 
       case SWT.Selection: 
        manualDraw=true; 
        canvas.redraw(); 
        break; 
       } 
      } 
     }); 

     // Create a paint handler for the canvas 
     canvas.addPaintListener(new PaintListener() { 
      public void paintControl(PaintEvent e) { 

       if (manualDraw){ 
        e.gc.setForeground(e.display.getSystemColor(SWT.COLOR_GREEN)); 
        e.gc.setClipping(90,90,60,60); 
        e.gc.drawRectangle(90,90,30,30); 
        return ; 
       } 


       Rectangle rect = ((Canvas) e.widget).getBounds(); 
       e.gc.setForeground(e.display.getSystemColor(SWT.COLOR_RED)); 
       e.gc.drawText("DRAW TEXT", 0, 0); 
       e.gc.dispose(); 
      } 
     }); 
    } 

    /** 
    * The application entry point 
    * 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     new SimpleCanvas().run(); 
    } 
} 

Pouvez-vous s'il vous plaît aidez-moi à comprendre ce que je fais mal?

Merci d'avance.

+0

On ne sait pas ce que vous attendez. setClipping ne modifie que le GC actuel, donc dans votre exemple seul le drawRectangle est affecté. –

+0

J'appréhende ce que j'ai écrit dans le titre .. Il suffit de mettre à jour une partie de la toile: en laissant la corde là et en ajoutant le rectangle ... Mais j'ai trouvé le problème auquel je vais répondre ... – navy1978

Répondre

1

J'ai trouvé le problème. Afin de mettre à jour seulement une partie de la toile que je ne dois pas appeler:

canvas.redraw(); 

et le dessin il une partie de la toile, mais plutôt obtenir le GC de toile et utiliser le setClipping là, donc invoquer quelque chose comme ça:

public void redrawCanvas (Canvas canvas) { 
     GC gc = new GC(canvas); 
     gc.setClipping(90,90,60,60); 
     gc.drawRectangle(90,90,30,30); 
     gc.dispose(); 
    }