1. 程式人生 > >SWT(JFace)體驗之Canvas(畫布)

SWT(JFace)體驗之Canvas(畫布)

說道畫圖,我們首先要介紹一下SWT的GC類。

view plaincopy to clipboardprint?
package swt_jface.demo10;  
import org.eclipse.swt.SWT;  
import org.eclipse.swt.custom.CLabel;  
import org.eclipse.swt.graphics.GC;  
import org.eclipse.swt.graphics.Image;  
import org.eclipse.swt.widgets.Display;  
import org.eclipse.swt.widgets.Shell;  
public class GCCreation {  
      
    Display display = new Display();  
    Shell shell = new Shell(display);  
    public GCCreation() {  
          
        Image image = new Image(display, "C:/icons/eclipse.gif");  
        Image image2 = new Image(display, image.getImageData());  
        GC gc = new GC(image2);  
        gc.setForeground(display.getSystemColor(SWT.COLOR_WHITE));  
        gc.drawOval(10, 10, 90, 40);  
        gc.dispose();  
          
        CLabel label = new CLabel(shell, SWT.NULL);  
        label.setImage(image);  
        label.setBounds(10, 10, 130, 130);  
          
        CLabel label2 = new CLabel(shell, SWT.NULL);  
        label2.setImage(image2);  
        label2.setBounds(150, 10, 130, 130);  
        shell.pack();  
        shell.open();  
          
        while (!shell.isDisposed()) {  
            if (!display.readAndDispatch()) {  
                display.sleep();  
            }  
        }  
        display.dispose();  
    }  
    public static void main(String[] args) {  
        new GCCreation();  
    }  

package swt_jface.demo10;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class GCCreation {
 
 Display display = new Display();
 Shell shell = new Shell(display);
 public GCCreation() {
  
  Image image = new Image(display, "C:/icons/eclipse.gif");
  Image image2 = new Image(display, image.getImageData());
  GC gc = new GC(image2);
  gc.setForeground(display.getSystemColor(SWT.COLOR_WHITE));
  gc.drawOval(10, 10, 90, 40);
  gc.dispose();
  
  CLabel label = new CLabel(shell, SWT.NULL);
  label.setImage(image);
  label.setBounds(10, 10, 130, 130);
  
  CLabel label2 = new CLabel(shell, SWT.NULL);
  label2.setImage(image2);
  label2.setBounds(150, 10, 130, 130);
  shell.pack();
  shell.open();
  
  while (!shell.isDisposed()) {
   if (!display.readAndDispatch()) {
    display.sleep();
   }
  }
  display.dispose();
 }
 public static void main(String[] args) {
  new GCCreation();
 }
}

接下來請參看以下示例:

演示程式碼1:

view plaincopy to clipboardprint?
package swt_jface.demo10;  
import org.eclipse.swt.SWT;  
import org.eclipse.swt.events.PaintEvent;  
import org.eclipse.swt.events.PaintListener;  
import org.eclipse.swt.widgets.Canvas;  
import org.eclipse.swt.widgets.Display;  
import org.eclipse.swt.widgets.Shell;  
public class CanvasExample {  
      
    Display display = new Display();  
    Shell shell = new Shell(display);  
    public CanvasExample() {  
        Canvas canvas = new Canvas(shell, SWT.NULL);  
        canvas.setBounds(10, 10, 200, 100);  
        canvas.addPaintListener(new PaintListener() {  
            public void paintControl(PaintEvent e) {  
                e.gc.drawRoundRectangle(10, 10, 180, 80, 10, 10);  
            }  
        });  
          
        shell.pack();  
        shell.open();  
          
        while (!shell.isDisposed()) {  
            if (!display.readAndDispatch()) {  
                display.sleep();  
            }  
        }  
        display.dispose();  
    }  
    public static void main(String[] args) {  
        new CanvasExample();  
    }  

package swt_jface.demo10;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class CanvasExample {
 
 Display display = new Display();
 Shell shell = new Shell(display);
 public CanvasExample() {
  Canvas canvas = new Canvas(shell, SWT.NULL);
  canvas.setBounds(10, 10, 200, 100);
  canvas.addPaintListener(new PaintListener() {
   public void paintControl(PaintEvent e) {
    e.gc.drawRoundRectangle(10, 10, 180, 80, 10, 10);
   }
  });
  
  shell.pack();
  shell.open();
  
  while (!shell.isDisposed()) {
   if (!display.readAndDispatch()) {
    display.sleep();
   }
  }
  display.dispose();
 }
 public static void main(String[] args) {
  new CanvasExample();
 }
}

演示程式碼2:(三角)

view plaincopy to clipboardprint?
package swt_jface.demo10;  
import org.eclipse.swt.SWT;  
import org.eclipse.swt.events.PaintEvent;  
import org.eclipse.swt.events.PaintListener;  
import org.eclipse.swt.graphics.Image;  
import org.eclipse.swt.graphics.Region;  
import org.eclipse.swt.layout.FillLayout;  
import org.eclipse.swt.widgets.Canvas;  
import org.eclipse.swt.widgets.Display;  
import org.eclipse.swt.widgets.Shell;  
public class Clipping {  
      
    Display display = new Display();  
    Shell shell = new Shell(display);  
    public Clipping() {  
          
        shell.setLayout(new FillLayout());  
          
        final Canvas canvas = new Canvas(shell, SWT.NULL);  
        final Image image = new Image(display, "C:/icons/eclipse.gif");  
        canvas.addPaintListener(new PaintListener() {  
            public void paintControl(PaintEvent e) {  
                Region region = new Region();  
                region.add(new int[]{60, 10, 10, 100, 110, 100});  
                e.gc.setClipping(region);  
                  
                e.gc.drawImage(image, 0, 0);  
            }  
        });  
        shell.setSize(200, 140);  
        shell.open();  
          
        while (!shell.isDisposed()) {  
            if (!display.readAndDispatch()) {  
                display.sleep();  
            }  
        }  
        display.dispose();  
    }  
    public static void main(String[] args) {  
        new Clipping();  
    }  

package swt_jface.demo10;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Region;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class Clipping {
 
 Display display = new Display();
 Shell shell = new Shell(display);
 public Clipping() {
  
  shell.setLayout(new FillLayout());
  
  final Canvas canvas = new Canvas(shell, SWT.NULL);
  final Image image = new Image(display, "C:/icons/eclipse.gif");
  canvas.addPaintListener(new PaintListener() {
   public void paintControl(PaintEvent e) {
    Region region = new Region();
    region.add(new int[]{60, 10, 10, 100, 110, 100});
    e.gc.setClipping(region);
    
    e.gc.drawImage(image, 0, 0);
   }
  });
  shell.setSize(200, 140);
  shell.open();
  
  while (!shell.isDisposed()) {
   if (!display.readAndDispatch()) {
    display.sleep();
   }
  }
  display.dispose();
 }
 public static void main(String[] args) {
  new Clipping();
 }
}

演示程式碼3:(動態畫布)

view plaincopy to clipboardprint?
package swt_jface.demo10;  
import org.eclipse.swt.SWT;  
import org.eclipse.swt.events.PaintEvent;  
import org.eclipse.swt.events.PaintListener;  
import org.eclipse.swt.graphics.GC;  
import org.eclipse.swt.graphics.Image;  
import org.eclipse.swt.graphics.Point;  
import org.eclipse.swt.graphics.Rectangle;  
import org.eclipse.swt.layout.FillLayout;  
import org.eclipse.swt.widgets.Canvas;  
import org.eclipse.swt.widgets.Display;  
import org.eclipse.swt.widgets.Shell;  
public class DoubleBuffer {  
      
    Display display = new Display();  
    Shell shell = new Shell(display);  
    public DoubleBuffer() {  
          
        shell.setLayout(new FillLayout());  
          
        final Canvas canvas = new Canvas(shell, SWT.NULL);  
        canvas.addPaintListener(new PaintListener() {  
            public void paintControl(PaintEvent e) {  
                Point size = canvas.getSize();  
                int x1 = (int) (Math.random() * size.x);  
                int y1 = (int) (Math.random() * size.y);  
                int x2 = Math.max(canvas.getBounds().width - x1 - 10, 50);  
                int y2 = Math.max(canvas.getBounds().height - y1 - 10, 50);  
                e.gc.drawRoundRectangle(x1, y1, x2, y2, 5, 5);  
                display.timerExec(100, new Runnable() {  
                    public void run() {  
                        canvas.redraw();  
                    }  
                });  
                  
            }  
        });  
        final Canvas doubleBufferedCanvas = new Canvas(shell, SWT.NO_BACKGROUND);  
        doubleBufferedCanvas.addPaintListener(new PaintListener() {  
            public void paintControl(PaintEvent e) {  
                Image image = (Image) doubleBufferedCanvas.getData("double-buffer-image");  
                if (image == null 
                    || image.getBounds().width != doubleBufferedCanvas.getSize().x  
                    || image.getBounds().height != doubleBufferedCanvas.getSize().y) {  
                    image =  
                        new Image(  
                            display,  
                        doubleBufferedCanvas.getSize().x,  
                        doubleBufferedCanvas.getSize().y);  
                        doubleBufferedCanvas.setData("double-buffer-image", image);  
                }  
                GC imageGC = new GC(image);  
                imageGC.setBackground(e.gc.getBackground());  
                imageGC.setForeground(e.gc.getForeground());  
                imageGC.setFont(e.gc.getFont());  
                Rectangle imageSize = image.getBounds();  
                imageGC.fillRectangle(0, 0, imageSize.width + 1, imageSize.height + 1);  
                Point size = doubleBufferedCanvas.getSize();  
                int x1 = (int) (Math.random() * size.x);  
                int y1 = (int) (Math.random() * size.y);  
                int x2 = Math.max(doubleBufferedCanvas.getBounds().width - x1 - 10, 50);  
                int y2 = Math.max(doubleBufferedCanvas.getBounds().height - y1 - 10, 50);  
                imageGC.drawRoundRectangle(x1, y1, x2, y2, 5, 5);  
                e.gc.drawImage(image, 0, 0);  
                imageGC.dispose();  
                display.timerExec(100, new Runnable() {  
                    public void run() {  
                        doubleBufferedCanvas.redraw();  
                    }  
                });  
            }  
        });  
        shell.setSize(300, 200);  
        shell.open();  
          
        while (!shell.isDisposed()) {  
            if (!display.readAndDispatch()) {  
                display.sleep();  
            }  
        }  
        display.dispose();  
    }  
    public static void main(String[] args) {  
        new DoubleBuffer();  
    }  

package swt_jface.demo10;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class DoubleBuffer {
 
 Display display = new Display();
 Shell shell = new Shell(display);
 public DoubleBuffer() {
  
  shell.setLayout(new FillLayout());
  
  final Canvas canvas = new Canvas(shell, SWT.NULL);
  canvas.addPaintListener(new PaintListener() {
   public void paintControl(PaintEvent e) {
    Point size = canvas.getSize();
    int x1 = (int) (Math.random() * size.x);
    int y1 = (int) (Math.random() * size.y);
    int x2 = Math.max(canvas.getBounds().width - x1 - 10, 50);
    int y2 = Math.max(canvas.getBounds().height - y1 - 10, 50);
    e.gc.drawRoundRectangle(x1, y1, x2, y2, 5, 5);
    display.timerExec(100, new Runnable() {
     public void run() {
      canvas.redraw();
     }
    });
    
   }
  });
  final Canvas doubleBufferedCanvas = new Canvas(shell, SWT.NO_BACKGROUND);
  doubleBufferedCanvas.addPaintListener(new PaintListener() {
   public void paintControl(PaintEvent e) {
    Image image = (Image) doubleBufferedCanvas.getData("double-buffer-image");
    if (image == null
     || image.getBounds().width != doubleBufferedCanvas.getSize().x
     || image.getBounds().height != doubleBufferedCanvas.getSize().y) {
     image =
      new Image(
       display,
      doubleBufferedCanvas.getSize().x,
      doubleBufferedCanvas.getSize().y);
      doubleBufferedCanvas.setData("double-buffer-image", image);
    }
    GC imageGC = new GC(image);
    imageGC.setBackground(e.gc.getBackground());
    imageGC.setForeground(e.gc.getForeground());
    imageGC.setFont(e.gc.getFont());
    Rectangle imageSize = image.getBounds();
    imageGC.fillRectangle(0, 0, imageSize.width + 1, imageSize.height + 1);
    Point size = doubleBufferedCanvas.getSize();
    int x1 = (int) (Math.random() * size.x);
    int y1 = (int) (Math.random() * size.y);
    int x2 = Math.max(doubleBufferedCanvas.getBounds().width - x1 - 10, 50);
    int y2 = Math.max(doubleBufferedCanvas.getBounds().height - y1 - 10, 50);
    imageGC.drawRoundRectangle(x1, y1, x2, y2, 5, 5);
    e.gc.drawImage(image, 0, 0);
    imageGC.dispose();
    display.timerExec(100, new Runnable() {
     public void run() {
      doubleBufferedCanvas.redraw();
     }
    });
   }
  });
  shell.setSize(300, 200);
  shell.open();
  
  while (!shell.isDisposed()) {
   if (!display.readAndDispatch()) {
    display.sleep();
   }
  }
  display.dispose();
 }
 public static void main(String[] args) {
  new DoubleBuffer();
 }
}

演示程式碼4:(圖片)

view plaincopy to clipboardprint?
package swt_jface.demo10;  
import org.eclipse.swt.SWT;  
import org.eclipse.swt.events.PaintEvent;  
import org.eclipse.swt.events.PaintListener;  
import org.eclipse.swt.graphics.GC;  
import org.eclipse.swt.graphics.Image;  
import org.eclipse.swt.graphics.ImageData;  
import org.eclipse.swt.graphics.ImageLoader;  
import org.eclipse.swt.layout.FillLayout;  
import org.eclipse.swt.widgets.Canvas;  
import org.eclipse.swt.widgets.Control;  
import org.eclipse.swt.widgets.Display;  
import org.eclipse.swt.widgets.Shell;  
public class DrawImages {  
      
    Display display = new Display();  
    Shell shell = new Shell(display);  
    public DrawImages() {  
          
        shell.setLayout(new FillLayout());  
        Canvas canvas = new Canvas(shell, SWT.NULL);  
        final Image image = new Image(display, "C:/icons/eclipse.gif");  
        canvas.addPaintListener(new PaintListener() {  
            public void paintControl(PaintEvent e) {  
                e.gc.drawImage(image, 10, 10);  
                e.gc.drawImage(image, 0, 0, 100, 100, 200, 10, 200, 50);  
                  
            }  
        });  
        shell.setSize(430, 200);  
        shell.open();  
        captureControl(canvas, "canvas.bmp");  
        while (!shell.isDisposed()) {  
            if (!display.readAndDispatch()) {  
                display.sleep();  
            }  
        }  
        display.dispose();  
    }  
      
    public static void captureControl(Control control, String file) {  
        GC gc = new GC(control);  
        Image image = new Image(control.getDisplay(), control.getSize().x, control.getSize().y);  
        gc.copyArea(image, 0, 0);  
        ImageLoader loader = new ImageLoader();  
        loader.data = new ImageData[] { image.getImageData() };  
        loader.save(file, SWT.IMAGE_BMP);  
        gc.dispose();  
    }  
    public static void main(String[] args) {  
        new DrawImages();  
    }  

package swt_jface.demo10;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.ImageLoader;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class DrawImages {
 
 Display display = new Display();
 Shell shell = new Shell(display);
 public DrawImages() {
  
  shell.setLayout(new FillLayout());
  Canvas canvas = new Canvas(shell, SWT.NULL);
  final Image image = new Image(display, "C:/icons/eclipse.gif");
  canvas.addPaintListener(new PaintListener() {
   public void paintControl(PaintEvent e) {
    e.gc.drawImage(image, 10, 10);
    e.gc.drawImage(image, 0, 0, 100, 100, 200, 10, 200, 50);
    
   }
  });
  shell.setSize(430, 200);
  shell.open();
  captureControl(canvas, "canvas.bmp");
  while (!shell.isDisposed()) {
   if (!display.readAndDispatch()) {
    display.sleep();
   }
  }
  display.dispose();
 }
 
 public static void captureControl(Control control, String file) {
  GC gc = new GC(control);
  Image image = new Image(control.getDisplay(), control.getSize().x, control.getSize().y);
  gc.copyArea(image, 0, 0);
  ImageLoader loader = new ImageLoader();
  loader.data = new ImageData[] { image.getImageData() };
  loader.save(file, SWT.IMAGE_BMP);
  gc.dispose();
 }
 public static void main(String[] args) {
  new DrawImages();
 }
}

演示程式碼5:(畫線)

view plaincopy to clipboardprint?
package swt_jface.demo10;  
import org.eclipse.swt.SWT;  
import org.eclipse.swt.events.PaintEvent;  
import org.eclipse.swt.events.PaintListener;  
import org.eclipse.swt.layout.FillLayout;  
import org.eclipse.swt.widgets.Canvas;  
import org.eclipse.swt.widgets.Display;  
import org.eclipse.swt.widgets.Shell;  
public class Drawings {  
    Display display = new Display();  
    Shell shell = new Shell(display);  
    public Drawings() {  
          
        shell.setLayout(new FillLayout());  
        Canvas canvas = new Canvas(shell, SWT.BORDER);  
        canvas.setBackground(display.getSystemColor(SWT.COLOR_WHITE));  
        canvas.addPaintListener(new PaintListener() {  
            public void paintControl(PaintEvent e) {  
                  
                e.gc.drawString("SWT.LINE_SOLID (default)", 10, 10);  
                e.gc.drawString("SWT.LINE_DASH", 10, 30);  
                e.gc.drawString("SWT.LINE_DOT", 10, 50);  
                e.gc.drawString("SWT.LINE_DASHDOT", 10, 70);  
                e.gc.drawString("SWT.LINE_DASHDOTDOT", 10, 90);  
                e.gc.drawString("Line width = 1 (default)", 10, 120);  
                e.gc.drawString("Line width = 3", 10, 140);  
                  
                int start = 150;  
                e.gc.setLineWidth(1);  
                e.gc.setLineStyle(SWT.LINE_SOLID);  
                e.gc.drawLine(start, 15, start + 200, 15);  
                e.gc.setLineStyle(SWT.LINE_DASH);  
                e.gc.drawLine(start, 35, start + 200, 35);  
                e.gc.setLineStyle(SWT.LINE_DOT);  
                e.gc.drawLine(start, 55, start + 200, 55);  
                e.gc.setLineStyle(SWT.LINE_DASHDOT);  
                e.gc.drawLine(start, 75, start + 200, 75);  
                e.gc.setLineStyle(SWT.LINE_DASHDOTDOT);  
                e.gc.drawLine(start, 95, start + 200, 95);  
                  
                e.gc.setLineStyle(SWT.LINE_SOLID);  
                e.gc.drawLine(start, 125, start + 200, 125);  
                e.gc.setLineWidth(3);  
                e.gc.drawLine(start, 145, start + 200, 145);  
                  
                int[] points = new int[3 * 2];  
                points[0] = 10;  
                points[1] = 10;  
                points[2] = 10;   
                points[3] = 100;  
                points[4] = 100;   
                points[5] = 100;  
                e.gc.drawPolyline(points);  
                  
                e.gc.setLineStyle(SWT.LINE_SOLID);  
                e.gc.setBackground(display.getSystemColor(SWT.COLOR_DARK_GREEN));  
                e.gc.fillArc(10, 10, 200, 100, 0, -90);  
                e.gc.setLineStyle(SWT.LINE_DOT);  
                e.gc.drawLine(0, 60, 220, 60);  
                e.gc.drawLine(110, 0, 110, 120);  
            }  
        });  
          
        shell.pack();  
        shell.open();  
          
        while (!shell.isDisposed()) {  
            if (!display.readAndDispatch()) {  
                display.sleep();  
            }  
        }  
        display.dispose();  
    }  
    public static void main(String[] args) {  
        new Drawings();  
    }  

package swt_jface.demo10;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class Drawings {
 Display display = new Display();
 Shell shell = new Shell(display);
 public Drawings() {
  
  shell.setLayout(new FillLayout());
  Canvas canvas = new Canvas(shell, SWT.BORDER);
  canvas.setBackground(display.getSystemColor(SWT.COLOR_WHITE));
  canvas.addPaintListener(new PaintListener() {
   public void paintControl(PaintEvent e) {
    
    e.gc.drawString("SWT.LINE_SOLID (default)", 10, 10);
    e.gc.drawString("SWT.LINE_DASH", 10, 30);
    e.gc.drawString("SWT.LINE_DOT", 10, 50);
    e.gc.drawString("SWT.LINE_DASHDOT", 10, 70);
    e.gc.drawString("SWT.LINE_DASHDOTDOT", 10, 90);
    e.gc.drawString("Line width = 1 (default)", 10, 120);
    e.gc.drawString("Line width = 3", 10, 140);
    
    int start = 150;
    e.gc.setLineWidth(1);
    e.gc.setLineStyle(SWT.LINE_SOLID);
    e.gc.drawLine(start, 15, start + 200, 15);
    e.gc.setLineStyle(SWT.LINE_DASH);
    e.gc.drawLine(start, 35, start + 200, 35);
    e.gc.setLineStyle(SWT.LINE_DOT);
    e.gc.drawLine(start, 55, start + 200, 55);
    e.gc.setLineStyle(SWT.LINE_DASHDOT);
    e.gc.drawLine(start, 75, start + 200, 75);
    e.gc.setLineStyle(SWT.LINE_DASHDOTDOT);
    e.gc.drawLine(start, 95, start + 200, 95);
    
    e.gc.setLineStyle(SWT.LINE_SOLID);
    e.gc.drawLine(start, 125, start + 200, 125);
    e.gc.setLineWidth(3);
    e.gc.drawLine(start, 145, start + 200, 145);
    
    int[] points = new int[3 * 2];
    points[0] = 10;
    points[1] = 10;
    points[2] = 10;
    points[3] = 100;
    points[4] = 100;
    points[5] = 100;
    e.gc.drawPolyline(points);
    
    e.gc.setLineStyle(SWT.LINE_SOLID);
    e.gc.setBackground(display.getSystemColor(SWT.COLOR_DARK_GREEN));
    e.gc.fillArc(10, 10, 200, 100, 0, -90);
    e.gc.setLineStyle(SWT.LINE_DOT);
    e.gc.drawLine(0, 60, 220, 60);
    e.gc.drawLine(110, 0, 110, 120);
   }
  });
  
  shell.pack();
  shell.open();
  
  while (!shell.isDisposed()) {
   if (!display.readAndDispatch()) {
    display.sleep();
   }
  }
  display.dispose();
 }
 public static void main(String[] args) {
  new Drawings();
 }
}

演示程式碼6:(文字效果)

view plaincopy to clipboardprint?
package swt_jface.demo10;  
import org.eclipse.swt.SWT;  
import org.eclipse.swt.events.PaintEvent;  
import org.eclipse.swt.events.PaintListener;  
import org.eclipse.swt.graphics.Font;  
import org.eclipse.swt.graphics.Image;  
import org.eclipse.swt.graphics.Point;  
import org.eclipse.swt.graphics.Rectangle;  
import org.eclipse.swt.layout.FillLayout;  
import org.eclipse.swt.widgets.Canvas;  
import org.eclipse.swt.widgets.Display;  
import org.eclipse.swt.widgets.Shell;  
public class DrawText {  
      
    Display display = new Display();  
    Shell shell = new Shell(display);  
    public DrawText() {  
          
        shell.setLayout(new FillLayout());  
          
        final Canvas canvas = new Canvas(shell, SWT.NO_BACKGROUND);  
          
        final Image image = new Image(display, "C:/icons/eclipse.gif");  
        canvas.addPaintListener(new PaintListener() {  
            public void paintControl(PaintEvent e) {  
                  
                Rectangle size = image.getBounds();  
                e.gc.drawImage(image, 0, 0, size.width, size.height, 0, 0, canvas.getSize().x, canvas.getSize().y);  
                Font font = new Font(display, "Tahoma", 18, SWT.BOLD);  
                e.gc.setFont(font);  
                e.gc.setForeground(display.getSystemColor(SWT.COLOR_WHITE));  
                e.gc.setBackground(display.getSystemColor(SWT.COLOR_BLUE));  
                String english = "SWT rocks!";  
                String chinese = "/u4e2d/u6587/u6c49/u5b57/u6d4b/u8bd5";  
                e.gc.drawString(english, 10, 10);  
                e.gc.drawString(chinese, 10, 80, true);  
                String text = "Text to be drawn in the center";  
                Point textSize = e.gc.textExtent(text);  
                e.gc.drawText(text, (canvas.getSize().x - textSize.x)/2, (canvas.getSize().y - textSize.y)/2);  
                font.dispose();  
            }  
        });  
        shell.setSize(300, 150);  
        shell.open();  
          
        while (!shell.isDisposed()) {  
            if (!display.readAndDispatch()) {  
                display.sleep();  
            }  
        }  
        display.dispose();  
    }  
      
    public static void main(String[] args) {  
        new DrawText();  
    }  

package swt_jface.demo10;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class DrawText {
 
 Display display = new Display();
 Shell shell = new Shell(display);
 public DrawText() {
  
  shell.setLayout(new FillLayout());
  
  final Canvas canvas = new Canvas(shell, SWT.NO_BACKGROUND);
  
  final Image image = new Image(display, "C:/icons/eclipse.gif");
  canvas.addPaintListener(new PaintListener() {
   public void paintControl(PaintEvent e) {
    
    Rectangle size = image.getBounds();
    e.gc.drawImage(image, 0, 0, size.width, size.height, 0, 0, canvas.getSize().x, canvas.getSize().y);
    Font font = new Font(display, "Tahoma", 18, SWT.BOLD);
    e.gc.setFont(font);
    e.gc.setForeground(display.getSystemColor(SWT.COLOR_WHITE));
    e.gc.setBackground(display.getSystemColor(SWT.COLOR_BLUE));
    String english = "SWT rocks!";
    String chinese = "/u4e2d/u6587/u6c49/u5b57/u6d4b/u8bd5";
    e.gc.drawString(english, 10, 10);
    e.gc.drawString(chinese, 10, 80, true);
    String text = "Text to be drawn in the center";
    Point textSize = e.gc.textExtent(text);
    e.gc.drawText(text, (canvas.getSize().x - textSize.x)/2, (canvas.getSize().y - textSize.y)/2);
    font.dispose();
   }
  });
  shell.setSize(300, 150);
  shell.open();
  
  while (!shell.isDisposed()) {
   if (!display.readAndDispatch()) {
    display.sleep();
   }
  }
  display.dispose();
 }
 
 public static void main(String[] args) {
  new DrawText();
 }
}

演示程式碼7:(T型)

view plaincopy to clipboardprint?
package swt_jface.demo10;  
import org.eclipse.swt.SWT;  
import org.eclipse.swt.events.PaintEvent;  
import org.eclipse.swt.events.PaintListener;  
import org.eclipse.swt.graphics.Image;  
import org.eclipse.swt.graphics.ImageData;  
import org.eclipse.swt.graphics.PaletteData;  
import org.eclipse.swt.graphics.RGB;  
import org.eclipse.swt.layout.FillLayout;  
import org.eclipse.swt.widgets.Canvas;  
import org.eclipse.swt.widgets.Display;  
import org.eclipse.swt.widgets.Shell;  
public class Palettes {  
      
    Display display = new Display();  
    Shell shell = new Shell(display);  
    public Palettes() {  
        shell.setLayout(new FillLayout());  
        PaletteData paletteData = new PaletteData(0xFF0000, 0x00FF00, 0x0000FF);  
        ImageData imageData = new ImageData(100, 100, 24, paletteData);  
        for (int i = 0; i < 100; i++) { // each column.  
            for (int j = 0; j < 100; j++) { // each row.  
                if (j < 30 || (i > 35 && i < 65))  
                    imageData.setPixel(i, j, 0xFF);  
                else 
                    imageData.setPixel(i, j, 0xFFFF00);  
            }  
        }  
//              int pixelValue = imageData.getPixel(50, 50);  
//              int redComponent = pixelValue & imageData.palette.redMask;  
//              int greenComponent = pixelValue & imageData.palette.greenMask;  
//              int blueComponent = pixelValue & imageData.palette.blueMask;  
        PaletteData paletteData2 =  
            new PaletteData(new RGB[] { new RGB(0, 0, 255), // blue  
            new RGB(255, 255, 0) // yellow  
        });  
          
        ImageData imageData2 = new ImageData(100, 100, 1, paletteData2);  
        for (int i = 0; i < 100; i++) { // each column.  
            for (int j = 0; j < 100; j++) { // each row.  
                if (j < 30 || (i > 35 && i < 65))  
                    imageData2.setPixel(i, j, 0);  
                else 
                    imageData2.setPixel(i, j, 1);  
            }  
        }  
          
        System.out.println(imageData.palette.getRGB(imageData.getPixel(50, 50)));  
          
        final Image image2 = new Image(display, imageData2);  
        //final Image image = new Image(display, imageData);  
        final Canvas canvas = new Canvas(shell, SWT.NULL);  
        canvas.setBackground(display.getSystemColor(SWT.COLOR_WHITE));  
        canvas.addPaintListener(new PaintListener() {  
            public void paintControl(PaintEvent e) {  
                e.gc.drawImage(image2, 0, 0);  
            }  
        });  
        shell.pack();  
        shell.open();  
          
        while (!shell.isDisposed()) {  
            if (!display.readAndDispatch()) {  
                display.sleep();  
            }  
        }  
        display.dispose();  
    }  
    public static void main(String[] args) {  
        new Palettes();  
    }  

package swt_jface.demo10;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.PaletteData;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class Palettes {
 
 Display display = new Display();
 Shell shell = new Shell(display);
 public Palettes() {
  shell.setLayout(new FillLayout());
  PaletteData paletteData = new PaletteData(0xFF0000, 0x00FF00, 0x0000FF);
  ImageData imageData = new ImageData(100, 100, 24, paletteData);
  for (int i = 0; i < 100; i++) { // each column.
   for (int j = 0; j < 100; j++) { // each row.
    if (j < 30 || (i > 35 && i < 65))
     imageData.setPixel(i, j, 0xFF);
    else
     imageData.setPixel(i, j, 0xFFFF00);
   }
  }
//    int pixelValue = imageData.getPixel(50, 50);
//    int redComponent = pixelValue & imageData.palette.redMask;
//    int greenComponent = pixelValue & imageData.palette.greenMask;
//    int blueComponent = pixelValue & imageData.palette.blueMask;
  PaletteData paletteData2 =
   new PaletteData(new RGB[] { new RGB(0, 0, 255), // blue
   new RGB(255, 255, 0) // yellow
  });
  
  ImageData imageData2 = new ImageData(100, 100, 1, paletteData2);
  for (int i = 0; i < 100; i++) { // each column.
   for (int j = 0; j < 100; j++) { // each row.
    if (j < 30 || (i > 35 && i < 65))
     imageData2.setPixel(i, j, 0);
    else
     imageData2.setPixel(i, j, 1);
   }
  }
  
  System.out.println(imageData.palette.getRGB(imageData.getPixel(50, 50)));
  
  final Image image2 = new Image(display, imageData2);
  //final Image image = new Image(display, imageData);
  final Canvas canvas = new Canvas(shell, SWT.NULL);
  canvas.setBackground(display.getSystemColor(SWT.COLOR_WHITE));
  canvas.addPaintListener(new PaintListener() {
   public void paintControl(PaintEvent e) {
    e.gc.drawImage(image2, 0, 0);
   }
  });
  shell.pack();
  shell.open();
  
  while (!shell.isDisposed()) {
   if (!display.readAndDispatch()) {
    display.sleep();
   }
  }
  display.dispose();
 }
 public static void main(String[] args) {
  new Palettes();
 }
}

演示程式碼8:(三環)

view plaincopy to clipboardprint?
package swt_jface.demo10;  
import org.eclipse.swt.SWT;  
import org.eclipse.swt.events.PaintEvent;  
import org.eclipse.swt.events.PaintListener;  
import org.eclipse.swt.layout.FillLayout;  
import org.eclipse.swt.widgets.Canvas;  
import org.eclipse.swt.widgets.Display;  
import org.eclipse.swt.widgets.Shell;  
public class XOR {  
      
    Display display = new Display();  
    Shell shell = new Shell(display);  
    public XOR() {  
          
        shell.setLayout(new FillLayout());  
        final Canvas canvas = new Canvas(shell, SWT.NULL);  
        canvas.setBackground(display.getSystemColor(SWT.COLOR_WHITE));  
          
        canvas.addPaintListener(new PaintListener() {  
            public void paintControl(PaintEvent e) {  
                e.gc.setXORMode(true);  
                e.gc.setBackground(display.getSystemColor(SWT.COLOR_GREEN));  
                e.gc.fillOval(60, 10, 100, 100); // Top  
                e.gc.setBackground(display.getSystemColor(SWT.COLOR_RED));  
                e.gc.fillOval(10, 60, 120, 120); // left bottom  
                e.gc.setBackground(display.getSystemColor(SWT.COLOR_BLUE));  
                e.gc.fillOval(110, 60, 100, 100); // right bottom  
            }  
        });  
          
        shell.setSize(300, 220);  
        shell.open();  
          
        while (!shell.isDisposed()) {  
            if (!display.readAndDispatch()) {  
                display.sleep();  
            }  
        }  
        display.dispose();  
    }  
    public static void main(String[] args) {  
        new XOR();  
    }  

package swt_jface.demo10;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class XOR {
 
 Display display = new Display();
 Shell shell = new Shell(display);
 public XOR() {
  
  shell.setLayout(new FillLayout());
  final Canvas canvas = new Canvas(shell, SWT.NULL);
  canvas.setBackground(display.getSystemColor(SWT.COLOR_WHITE));
  
  canvas.addPaintListener(new PaintListener() {
   public void paintControl(PaintEvent e) {
    e.gc.setXORMode(true);
    e.gc.setBackground(display.getSystemColor(SWT.COLOR_GREEN));
    e.gc.fillOval(60, 10, 100, 100); // Top
    e.gc.setBackground(display.getSystemColor(SWT.COLOR_RED));
    e.gc.fillOval(10, 60, 120, 120); // left bottom
    e.gc.setBackground(display.getSystemColor(SWT.COLOR_BLUE));
    e.gc.fillOval(110, 60, 100, 100); // right bottom
   }
  });
  
  shell.setSize(300, 220);
  shell.open();
  
  while (!shell.isDisposed()) {
   if (!display.readAndDispatch()) {
    display.sleep();
   }
  }
  display.dispose();
 }
 public static void main(String[] args) {
  new XOR();
 }
}

演示程式碼9:(Transparency)

view plaincopy to clipboardprint?
package swt_jface.demo10;  
import org.eclipse.swt.SWT;  
import org.eclipse.swt.events.PaintEvent;  
import org.eclipse.swt.events.PaintListener;  
import org.eclipse.swt.graphics.Image;  
import org.eclipse.swt.graphics.ImageData;  
import org.eclipse.swt.graphics.RGB;  
import org.eclipse.swt.layout.FillLayout;  
import org.eclipse.swt.widgets.Canvas;  
import org.eclipse.swt.widgets.Display;  
import org.eclipse.swt.widgets.Shell;  
public class Transparency {  
      
    Display display = new Display();  
    Shell shell = new Shell(display);  
    public Transparency() {  
          
        shell.setLayout(new FillLayout());  
        ImageData imageData = new ImageData("C:/icons/eclipse.jpg");  
        final Image image = new Image(display, imageData);  
        RGB white = new RGB(255, 255, 255);  
        for(int i=0; i
            for(int j=0; j
                RGB rgb = imageData.palette.getRGB(imageData.getPixel(i, j));  
                int threshold = 220;  
                if(rgb.red > threshold && rgb.green > threshold && rgb.blue > threshold)  
                    imageData.setPixel(i, j, imageData.palette.getPixel(white));  
            }  
        }  
          
        imageData.transparentPixel = imageData.palette.getPixel(new RGB(255, 255, 255));  
        final Image image2 = new Image(display, imageData);  
        final Canvas canvas = new Canvas(shell, SWT.NULL);  
        canvas.addPaintListener(new PaintListener() {  
            public void paintControl(PaintEvent e) {  
                e.gc.drawImage(image, 10, 20);  
                e.gc.drawImage(image2, 200, 20);  
            }  
        });  
        shell.setSize(400, 140);  
        shell.open();  
          
        while (!shell.isDisposed()) {  
            if (!display.readAndDispatch()) {  
                display.sleep();  
            }  
        }  
        display.dispose();  
    }  
    public static void main(String[] args) {  
        new Transparency();  
    }