SWT
provides Graphics context ‘GC’ class,
to work with graphics. By using GC, you can perform following tasks.
a. Set the foreground
and background colors
b. Draw shapes like
rectangle, circle etc.,
c. Display images
d. Change the font etc.,
Following
step-by-step procedure explains simple drawing application using Canvas and GC.
Step 1: Define Canvas object.
You can draw graphics on the surface of Canvas object.
Canvas
canvas = new Canvas(shell, SWT.BORDER);
canvas.setSize(canvasWidth,
canvasHeight);
canvas.setLocation(20,
20);
Step 2: Open the shell. Note
that shee should be opened after defining Canvas object.
shell.open();
Step 3: Get the GC instance
to draw graphics on canvas surface.
GC
gc = new GC(canvas);
By
using above gc instance, we can apply graphics on the canvas surface, If you
try to draw any graphic outside the canvas surface area, it is not visible.
Step 4: Now you can use
different methods provided by GC class, to draw graphics.
gc.setBackground(red);
gc.drawRectangle(150,
130, 200, 75);
gc.fillRectangle(30,
30, 200, 75);
gc.setForeground(blue);
gc.drawLine(0,
0, 400, 300);
gc.drawString("Hello
World Graphics Application", 75, 0);
gc.drawOval(0,
0, 400, 300);
Step 5: Dispose the resources
taken by SWT application.
gc.dispose();
Following
is the complete working application.
package swt_app; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.widgets.Canvas; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; public class Test { private static int shellWidth = 1000; private static int shellHeight = 700; private static int canvasHeight = 300; private static int canvasWidth = 400; private static void addGraphicsToShell(Display display, Shell shell) { Canvas canvas = new Canvas(shell, SWT.BORDER); canvas.setSize(canvasWidth, canvasHeight); canvas.setLocation(20, 20); /* Open shell window */ shell.open(); Color blue = display.getSystemColor(SWT.COLOR_BLUE); Color red = display.getSystemColor(SWT.COLOR_RED); GC gc = new GC(canvas); gc.setBackground(red); gc.drawRectangle(150, 130, 200, 75); gc.fillRectangle(30, 30, 200, 75); gc.setForeground(blue); gc.drawLine(0, 0, 400, 300); gc.drawString("Hello World Graphics Application", 75, 0); gc.drawOval(0, 0, 400, 300); gc.dispose(); } public static void main(String[] args) { /* Instantiate Display object, it represents SWT session */ Display display = new Display(); /* * Define Shell, it represent a window, You can add more than one shell to Display */ Shell shell = new Shell(display); shell.setSize(shellWidth, shellHeight); shell.setText("SWT Tutorial"); addGraphicsToShell(display, shell); /* * Run the event dispatching loop until an exit condition occurs, which is typically when the main shell window * is closed by the user. */ while (!shell.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } /* Dispose the display */ display.dispose(); } }
There
is one major problem with above program, just minimize the window, maximize it
back, now you can observe whatever the graphics you painted on Canvas are
cleared. It is because, after maximizing, the graphics are not repainted on the
canvas.
To
resolve this issue, we should know when the graphics are repainted. We can do
this by using PaintListener interface. The paintListener will detect whenever
canvas is repainted, and execute the paintControl method.
First
I moved all the graphics to drawGraphics method.
private
static void drawGraphcis(Display display, GC gc)
{
Color blue =
display.getSystemColor(SWT.COLOR_BLUE);
Color red =
display.getSystemColor(SWT.COLOR_RED);
gc.setBackground(red);
gc.drawRectangle(150, 130, 200, 75);
gc.fillRectangle(30, 30, 200, 75);
gc.setForeground(blue);
gc.drawLine(0, 0, 400, 300);
gc.drawString("Hello World
Graphics Application", 75, 0);
gc.drawOval(0, 0, 400, 300);
}
Next,
I added paintListener to canvas object like below.
canvas.addPaintListener(new
PaintListener()
{
@Override
public void paintControl(PaintEvent e)
{
GC gc = e.gc;
drawGraphcis(display, gc);
}
});
Whenever
repaint needed, I called drawGraphics method.
Following
is the updated application.
package swt_app; import org.eclipse.swt.SWT; import org.eclipse.swt.events.PaintEvent; import org.eclipse.swt.events.PaintListener; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.widgets.Canvas; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; public class Test { private static int shellWidth = 1000; private static int shellHeight = 700; private static int canvasHeight = 300; private static int canvasWidth = 400; private static void drawGraphcis(Display display, GC gc) { Color blue = display.getSystemColor(SWT.COLOR_BLUE); Color red = display.getSystemColor(SWT.COLOR_RED); gc.setBackground(red); gc.drawRectangle(150, 130, 200, 75); gc.fillRectangle(30, 30, 200, 75); gc.setForeground(blue); gc.drawLine(0, 0, 400, 300); gc.drawString("Hello World Graphics Application", 75, 0); gc.drawOval(0, 0, 400, 300); } private static void addGraphicsToShell(Display display, Shell shell) { Canvas canvas = new Canvas(shell, SWT.BORDER); canvas.setSize(canvasWidth, canvasHeight); canvas.setLocation(20, 20); /* Open shell window */ shell.open(); GC gc = new GC(canvas); drawGraphcis(display, gc); canvas.addPaintListener(new PaintListener() { @Override public void paintControl(PaintEvent e) { GC gc = e.gc; drawGraphcis(display, gc); } }); gc.dispose(); } public static void main(String[] args) { /* Instantiate Display object, it represents SWT session */ Display display = new Display(); /* * Define Shell, it represent a window, You can add more than one shell to Display */ Shell shell = new Shell(display); shell.setSize(shellWidth, shellHeight); shell.setText("SWT Tutorial"); addGraphicsToShell(display, shell); /* * Run the event dispatching loop until an exit condition occurs, which is typically when the main shell window * is closed by the user. */ while (!shell.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } /* Dispose the display */ display.dispose(); } }
Note
You
can get GC object on any SWT widget, and apply graphics.
No comments:
Post a Comment