java swt实现的2D效果(附代码)!
用java swt实现的一个2d效果,很漂亮!
代码如下:
import java.io.IOException;
import java.io.InputStream;
import java.util.HashSet;
import java.util.Iterator;
import java.util.MissingResourceException;
import java.util.Random;
import java.util.ResourceBundle;
import java.util.Vector;
import org.eclipse.swt.SWT;
import org.eclipse.swt.SWTException;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Path;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.ColorDialog;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Sash;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Spinner;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;
public class GraphicsExample {
Composite parent;
GraphicsTab [] tabs;
GraphicsTab tab;
Object [] tabBackground;
boolean animate;
Listener redrawListener;
ToolBar toolBar;
Tree tabList;
Canvas canvas;
Composite controlPanel, tabPanel;
ToolItem playItem, pauseItem, backItem, dbItem;
Spinner timerSpinner;
Menu backMenu;
MenuItem customMI;
Image customImage;
Color customColor;
Vector images;
static boolean advanceGraphics, advanceGraphicsInit;
static final int TIMER = 30 ;
public GraphicsExample ( final Composite parent ) {
this .parent = parent;
redrawListener = new Listener () {
public void handleEvent ( Event e ) {
redraw () ;
}
} ;
GridData data;
GridLayout layout = new GridLayout ( 3 , false ) ;
layout.horizontalSpacing = 1 ;
parent.setLayout ( layout ) ;
tabs = createTabs () ;
images = new Vector () ;
createToolBar ( parent ) ;
createTabList ( parent ) ;
final Sash sash = new Sash ( parent, SWT.VERTICAL ) ;
createTabPanel ( parent ) ;
data = new GridData ( SWT.FILL, SWT.CENTER, true, false ) ;
data.horizontalSpan = 3 ;
toolBar.setLayoutData ( data ) ;
data = new GridData ( SWT.CENTER, SWT.FILL, false, true ) ;
data.widthHint = tabList.computeSize ( SWT.DEFAULT, SWT.DEFAULT ) .x + 50 ;
tabList.setLayoutData ( data ) ;
data = new GridData ( SWT.CENTER, SWT.FILL, false, true ) ;
sash.setLayoutData ( data ) ;
data = new GridData ( SWT.FILL, SWT.FILL, true, true ) ;
tabPanel.setLayoutData ( data ) ;
sash.addListener ( SWT.Selection, new Listener () {
public void handleEvent ( Event event ) {
if ( event.detail != SWT.DRAG ) {
GridData data = ( GridData ) tabList.getLayoutData () ;
data.widthHint = event.x
- tabList.computeTrim ( 0 , 0 , 0 , 0 ) .width;
parent.layout ( true ) ;
animate = pauseItem.getEnabled () ;
} else {
animate = false ;
}
}
}) ;
setTab ( tab ) ;
startAnimationTimer () ;
}
boolean checkAdvancedGraphics () {
if ( advanceGraphicsInit )
return advanceGraphics;
advanceGraphicsInit = true ;
Display display = Display.getCurrent () ;
try {
Path path = new Path ( display ) ;
path.dispose () ;
} catch ( SWTException e ) {
Shell shell = display.getActiveShell () , newShell = null ;
if ( shell == null )
shell = newShell = new Shell ( display ) ;
MessageBox dialog = new MessageBox ( shell, SWT.ICON_WARNING | SWT.OK ) ;
dialog.setText ( "Warning" ) ; //$NON-NLS-1$
dialog.setMessage ( "LibNotFound" ) ; //$NON-NLS-1$
dialog.open () ;
if ( newShell != null )
newShell.dispose () ;
return false ;
}
return advanceGraphics = true ;
}
void createCanvas ( Composite parent ) {
canvas = new Canvas ( parent, SWT.NO_BACKGROUND ) ;
canvas.addListener ( SWT.Paint, new Listener () {
public void handleEvent ( Event event ) {
GC gc;
Rectangle rect = canvas.getClientArea () ;
Image buffer = null ;
if ( dbItem.getSelection ()) {
buffer = new Image ( canvas.getDisplay () , rect ) ;
gc = new GC ( buffer ) ;
} else {
gc = event.gc;
}
paintBackground ( gc, rect ) ;
GraphicsTab tab = getTab () ;
if ( tab != null )
tab.paint ( gc, rect.width, rect.height ) ;
if ( gc != event.gc )
gc.dispose () ;
if ( buffer != null ) {
event.gc.drawImage ( buffer, 0 , 0 ) ;
buffer.dispose () ;
}
}
}) ;
}
void createControlPanel ( Composite parent ) {
Group group;
controlPanel = group = new Group ( parent, SWT.NONE ) ;
group.setText ( getResourceString ( "Settings" )) ; //$NON-NLS-1$
controlPanel.setLayout ( new RowLayout ()) ;
}
void createTabPanel ( Composite parent ) {
tabPanel = new Composite ( parent, SWT.NONE ) ;
GridData data;
GridLayout layout = new GridLayout ( 1 , false ) ;
layout.marginHeight = layout.marginWidth = 0 ;
tabPanel.setLayout ( layout ) ;
createCanvas ( tabPanel ) ;
createControlPanel ( tabPanel ) ;
data = new GridData ( SWT.FILL, SWT.FILL, true, true ) ;
canvas.setLayoutData ( data ) ;
data = new GridData ( SWT.FILL, SWT.CENTER, true, false ) ;
controlPanel.setLayoutData ( data ) ;
}
void createToolBar ( final Composite parent ) {
final Display display = parent.getDisplay () ;
toolBar = new ToolBar ( parent, SWT.FLAT ) ;
Listener toolBarListener = new Listener () {
public void handleEvent ( Event event ) {
switch ( event.type ) {
case SWT.Selection: {
if ( event.widget == playItem ) {
animate = true ;
playItem.setEnabled ( !animate ) ;
pauseItem.setEnabled ( animate ) ;
} else if ( event.widget == pauseItem ) {
animate = false ;
playItem.setEnabled ( !animate ) ;
pauseItem.setEnabled ( animate ) ;
} else if ( event.widget == backItem ) {
final ToolItem toolItem = ( ToolItem ) event.widget;
final ToolBar toolBar = toolItem.getParent () ;
Rectangle toolItemBounds = toolItem.getBounds () ;
Point point = toolBar.toDisplay ( new Point (
toolItemBounds.x, toolItemBounds.y )) ;
backMenu.setLocation ( point.x, point.y
+ toolItemBounds.height ) ;
backMenu.setVisible ( true ) ;
}
}
break ;
}
}
} ;
playItem = new ToolItem ( toolBar, SWT.PUSH ) ;
playItem.setText ( getResourceString ( "Play" )) ; //$NON-NLS-1$
playItem.setImage ( loadImage ( display, "play.gif" )) ; //$NON-NLS-1$
playItem.addListener ( SWT.Selection, toolBarListener ) ;
pauseItem = new ToolItem ( toolBar, SWT.PUSH ) ;
pauseItem.setText ( getResourceString ( "Pause" )) ; //$NON-NLS-1$
pauseItem.setImage ( loadImage ( display, "pause.gif" )) ; //$NON-NLS-1$
pauseItem.addListener ( SWT.Selection, toolBarListener ) ;
backItem = new ToolItem ( toolBar, SWT.PUSH ) ;
backItem.setText ( getResourceString ( "Background" )) ; //$NON-NLS-1$
backItem.addListener ( SWT.Selection, toolBarListener ) ;
String [] names = new String [] { getResourceString ( "White" ) , //$NON-NLS-1$
getResourceString ( "Black" ) , //$NON-NLS-1$
getResourceString ( "Red" ) , //$NON-NLS-1$
getResourceString ( "Green" ) , //$NON-NLS-1$
getResourceString ( "Blue" ) , //$NON-NLS-1$
getResourceString ( "CustomColor" ) , //$NON-NLS-1$
} ;
Color [] colors = new Color [] { display.getSystemColor ( SWT.COLOR_WHITE ) ,
display.getSystemColor ( SWT.COLOR_BLACK ) ,
display.getSystemColor ( SWT.COLOR_RED ) ,
display.getSystemColor ( SWT.COLOR_GREEN ) ,
display.getSystemColor ( SWT.COLOR_BLUE ) , null, } ;
backMenu = new Menu ( parent ) ;
Listener listener = new Listener () {
public void handleEvent ( Event event ) {
MenuItem item = ( MenuItem ) event.widget;
if ( customMI == item ) {
ColorDialog dialog = new ColorDialog ( parent.getShell ()) ;
RGB rgb = dialog.open () ;
if ( rgb == null )
return ;
if ( customColor != null )
customColor.dispose () ;
customColor = new Color ( display, rgb ) ;
if ( customImage != null )
customImage.dispose () ;
customImage = createImage ( display, customColor ) ;
item.setData ( new Object [] { customColor, customImage }) ;
item.setImage ( customImage ) ;
}
tabBackground = ( Object []) item.getData () ;
backItem.setImage (( Image ) tabBackground [ 1 ]) ;
canvas.redraw () ;
}
} ;
for ( int i = 0 ; i < names.length; i++ ) {
MenuItem item = new MenuItem ( backMenu, SWT.NONE ) ;
item.setText ( names [ i ]) ;
item.addListener ( SWT.Selection, listener ) ;
Image image = null ;
if ( colors [ i ] != null ) {
image = createImage ( display, colors [ i ]) ;
images.addElement ( image ) ;
item.setImage ( image ) ;
} else {
// custom menu item
customMI = item;
}
item.setData ( new Object [] { colors [ i ] , image }) ;
if ( tabBackground == null ) {
tabBackground = ( Object []) item.getData () ;
backItem.setImage (( Image ) tabBackground [ 1 ]) ;
}
}
dbItem = new ToolItem ( toolBar, SWT.CHECK ) ;
dbItem.setText ( getResourceString ( "DoubleBuffer" )) ; //$NON-NLS-1$
dbItem.setImage ( loadImage ( display, "db.gif" )) ; //$NON-NLS-1$
ToolItem separator = new ToolItem ( toolBar, SWT.SEPARATOR ) ;
Composite comp = new Composite ( toolBar, SWT.NONE ) ;
GridData data;
GridLayout layout = new GridLayout ( 1 , false ) ;
layout.verticalSpacing = 0 ;
layout.marginWidth = layout.marginHeight = 3 ;
comp.setLayout ( layout ) ;
timerSpinner = new Spinner ( comp, SWT.BORDER | SWT.WRAP ) ;
data = new GridData ( SWT.CENTER, SWT.CENTER, false, false ) ;
timerSpinner.setLayoutData ( data ) ;
Label label = new Label ( comp, SWT.NONE ) ;
label.setText ( getResourceString ( "Animation" )) ; //$NON-NLS-1$
data = new GridData ( SWT.CENTER, SWT.CENTER, false, false ) ;
label.setLayoutData ( data ) ;
timerSpinner.setMaximum ( 1000 ) ;
timerSpinner.setSelection ( TIMER ) ;
timerSpinner.setSelection ( TIMER ) ;
separator.setControl ( comp ) ;
separator.setWidth ( comp.computeSize ( SWT.DEFAULT, SWT.DEFAULT ) .x ) ;
}
Image createImage ( Display display, Color color ) {
Image image = new Image ( display, 16 , 16 ) ;
GC gc = new GC ( image ) ;
gc.setBackground ( color ) ;
Rectangle rect = image.getBounds () ;
gc.fillRectangle ( rect ) ;
if ( color.equals ( display.getSystemColor ( SWT.COLOR_BLACK ))) {
gc.setForeground ( display.getSystemColor ( SWT.COLOR_WHITE )) ;
}
gc.drawRectangle ( rect.x, rect.y, rect.width - 1 , rect.height - 1 ) ;
gc.dispose () ;
return image;
}
void createTabList ( Composite parent ) {
tabList = new Tree ( parent, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL
| SWT.BORDER ) ;
HashSet set = new HashSet () ;
for ( int i = 0 ; i < tabs.length; i++ ) {
GraphicsTab tab = tabs [ i ] ;
set.add ( tab.getCategory ()) ;
}
for ( Iterator iter = set.iterator () ; iter.hasNext () ; ) {
String text = ( String ) iter.next () ;
TreeItem item = new TreeItem ( tabList, SWT.NONE ) ;
item.setText ( text ) ;
}
TreeItem [] items = tabList.getItems () ;
for ( int i = 0 ; i < items.length; i++ ) {
TreeItem item = items [ i ] ;
for ( int j = 0 ; j < tabs.length; j++ ) {
GraphicsTab tab = tabs [ j ] ;
if ( item.getText () .equals ( tab.getCategory ())) {
TreeItem item1 = new TreeItem ( item, SWT.NONE ) ;
item1.setText ( tab.getText ()) ;
item1.setData ( tab ) ;
}
}
}
tabList.addListener ( SWT.Selection, new Listener () {
public void handleEvent ( Event event ) {
TreeItem item = ( TreeItem ) event.item;
if ( item != null ) {
setTab (( GraphicsTab ) item.getData ()) ;
}
}
}) ;
}
GraphicsTab [] createTabs () {
return new GraphicsTab [] { new LineTab ( this ) , new StarPolyTab ( this ) ,
tab = new IntroTab ( this ) , new BlackHoleTab ( this ) , } ;
}
/**
* Disposes all resources created by the receiver.
*/
public void dispose () {
if ( tabs != null ) {
for ( int i = 0 ; i < tabs.length; i++ ) {
GraphicsTab tab = tabs [ i ] ;
tab.dispose () ;
}
}
tabs = null ;
if ( images != null ) {
for ( int i = 0 ; i < images.size () ; i++ ) {
(( Image ) images.elementAt ( i )) .dispose () ;
}
}
images = null ;
if ( customColor != null )
customColor.dispose () ;
customColor = null ;
if ( customImage != null )
customImage.dispose () ;
customImage = null ;
}
TreeItem findItemByData ( TreeItem [] items, Object data ) {
for ( int i = 0 ; i < items.length; i++ ) {
TreeItem item = items [ i ] ;
if ( item.getData () == data )
return item;
item = findItemByData ( item.getItems () , data ) ;
if ( item != null )
return item;
}
return null ;
}
/**
* Gets the current tab.
*/
public GraphicsTab getTab () {
return tab;
}
Listener getRedrawListener () {
return redrawListener;
}
/**
* Gets a string from the resource bundle. We don't want to crash because of
* a missing String. Returns the key if not found.
*/
static String getResourceString ( String key ) {
return "key" ;
}
static Image loadImage ( Display display, Class clazz, String string ) {
InputStream stream = clazz.getResourceAsStream ( string ) ;
if ( stream == null )
return null ;
Image image = null ;
try {
image = new Image ( display, stream ) ;
} catch ( SWTException ex ) {
} finally {
try {
stream.close () ;
} catch ( IOException ex ) {
}
}
return image;
}
Image loadImage ( Display display, String name ) {
Image image = loadImage ( display, GraphicsExample.class, name ) ;
if ( image != null )
images.addElement ( image ) ;
return image;
}
void paintBackground ( GC gc, Rectangle rect ) {
gc.setBackground (( Color ) tabBackground [ 0 ]) ;
gc.fillRectangle ( rect ) ;
}
/**
* Redraws the current tab.
*/
public void redraw () {
canvas.redraw () ;
}
/**
* Grabs input focus.
*/
public void setFocus () {
tabList.setFocus () ;
}
/**
* Sets the current tab.
*/
public void setTab ( GraphicsTab tab ) {
this .tab = tab;
Control [] children = controlPanel.getChildren () ;
for ( int i = 0 ; i < children.length; i++ ) {
Control control = children [ i ] ;
control.dispose () ;
}
if ( tab != null ) {
tab.createControlPanel ( controlPanel ) ;
animate = tab.isAnimated () ;
}
playItem.setEnabled ( !animate ) ;
pauseItem.setEnabled ( animate ) ;
GridData data = ( GridData ) controlPanel.getLayoutData () ;
children = controlPanel.getChildren () ;
data.exclude = children.length == 0 ;
controlPanel.setVisible ( !data.exclude ) ;
if ( data.exclude ) {
tabPanel.layout () ;
} else {
tabPanel.layout ( children ) ;
}
if ( tab != null ) {
TreeItem [] selection = tabList.getSelection () ;
if ( selection.length == 0 || selection [ 0 ] .getData () != tab ) {
TreeItem item = findItemByData ( tabList.getItems () , tab ) ;
if ( item != null )
tabList.setSelection ( new TreeItem [] { item }) ;
}
}
canvas.redraw () ;
}
void startAnimationTimer () {
final Display display = Display.getCurrent () ;
display.timerExec ( timerSpinner.getSelection () , new Runnable () {
public void run () {
if ( canvas.isDisposed ())
return ;
if ( animate ) {
GraphicsTab tab = getTab () ;
if ( tab != null && tab.isAnimated ()) {
Rectangle rect = canvas.getClientArea () ;
tab.next ( rect.width, rect.height ) ;
canvas.redraw () ;
canvas.update () ;
}
}
display.timerExec ( timerSpinner.getSelection () , this ) ;
}
}) ;
}
public static void main ( String [] args ) {
Display display = new Display () ;
Shell shell = new Shell ( display ) ;
shell.setText ( getResourceString ( "SWTGraphics" )) ; //$NON-NLS-1$
final GraphicsExample example = new GraphicsExample ( shell ) ;
shell.addListener ( SWT.Close, new Listener () {
public void handleEvent ( Event event ) {
example.dispose () ;
}
}) ;
shell.open () ;
while ( !shell.isDisposed ()) {
if ( !display.readAndDispatch ())
display.sleep () ;
}
}
}
/*******************************************************************************
* Copyright (c) 2000, 2005 IBM Corporation and others. All rights reserved.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors: IBM Corporation - initial API and implementation
******************************************************************************/
abstract class GraphicsTab {
GraphicsExample example;
public GraphicsTab ( GraphicsExample example ) {
this .example = example;
}
/**
* Creates the widgets used to control the drawing.
*/
public void createControlPanel ( Composite parent ) {
}
/**
* Disposes resources created by the receiver.
*/
public void dispose () {
}
/**
* Answer the receiver's name.
*/
public abstract String getText () ;
/**
* Answer the receiver's category.
*/
public String getCategory () {
return GraphicsExample.getResourceString ( "Misc" ) ; //$NON-NLS-1$
}
/**
* Answer whether the receiver is animated or not.
*/
public boolean isAnimated () {
return false ;
}
/**
* Advance the animation.
*/
public void next ( int width, int height ) {
}
/**
* Paint the receiver into the specified GC.
*/
public void paint ( GC gc, int width, int height ) {
}
}
/*******************************************************************************
* Copyright (c) 2000, 2005 IBM Corporation and others. All rights reserved.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors: IBM Corporation - initial API and implementation
******************************************************************************/
class LineTab extends GraphicsTab {
public LineTab ( GraphicsExample example ) {
super ( example ) ;
}
public String getText () {
return GraphicsExample.getResourceString ( "Line" ) ; //$NON-NLS-1$
}
public void paint ( GC gc, int width, int height ) {
gc.drawLine ( 0 , 0 , width, height ) ;
gc.drawLine ( width, 0 , 0 , height ) ;
}
}
/*******************************************************************************
* Copyright (c) 2000, 2005 IBM Corporation and others. All rights reserved.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors: IBM Corporation - initial API and implementation
******************************************************************************/
class StarPolyTab extends GraphicsTab {
int [] radial;
static final int POINTS = 11 ;
Combo fillRuleCb;
public StarPolyTab ( GraphicsExample example ) {
super ( example ) ;
radial = new int [ POINTS * 2 ] ;
}
public void createControlPanel ( Composite parent ) {
new Label ( parent, SWT.NONE ) .setText ( GraphicsExample
.getResourceString ( "FillRule" )) ; //$NON-NLS-1$
fillRuleCb = new Combo ( parent, SWT.DROP_DOWN ) ;
fillRuleCb.add ( "FILL_EVEN_ODD" ) ;
fillRuleCb.add ( "FILL_WINDING" ) ;
fillRuleCb.select ( 0 ) ;
fillRuleCb.addListener ( SWT.Selection, example.getRedrawListener ()) ;
}
public String getCategory () {
return GraphicsExample.getResourceString ( "Polygons" ) ; //$NON-NLS-1$
}
public String getText () {
return GraphicsExample.getResourceString ( "StarPolygon" ) ; //$NON-NLS-1$
}
public void paint ( GC gc, int width, int height ) {
int centerX = width / 2 ;
int centerY = height / 2 ;
int pos = 0 ;
for ( int i = 0 ; i < POINTS; ++i ) {
double r = Math.PI * 2 * pos / POINTS;
radial [ i * 2 ] = ( int ) (( 1 + Math.cos ( r )) * centerX ) ;
radial [ i * 2 + 1 ] = ( int ) (( 1 + Math.sin ( r )) * centerY ) ;
pos = ( pos + POINTS / 2 ) % POINTS;
}
Display display = Display.getCurrent () ;
gc.setFillRule ( fillRuleCb.getSelectionIndex () != 0 ? SWT.FILL_WINDING
: SWT.FILL_EVEN_ODD ) ;
gc.setBackground ( display.getSystemColor ( SWT.COLOR_WHITE )) ;
gc.fillPolygon ( radial ) ;
gc.drawPolygon ( radial ) ;
}
}
/*******************************************************************************
* Copyright (c) 2000, 2005 IBM Corporation and others. All rights reserved.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors: IBM Corporation - initial API and implementation
******************************************************************************/
class BlackHoleTab extends GraphicsTab {
int size = 1 ;
public BlackHoleTab ( GraphicsExample example ) {
super ( example ) ;
}
public String getText () {
return GraphicsExample.getResourceString ( "BlackHole" ) ; //$NON-NLS-1$
}
public boolean isAnimated () {
return true ;
}
public void next ( int width, int height ) {
if ( size > width * 3 / 2 )
size = 0 ;
else
size += 10 ;
}
public void paint ( GC gc, int width, int height ) {
Display display = Display.getCurrent () ;
gc.setBackground ( display.getSystemColor ( SWT.COLOR_BLACK )) ;
gc.fillOval (( width - size ) / 2 , ( height - size ) / 2 , size, size ) ;
}
}
/*******************************************************************************
* Copyright (c) 2000, 2005 IBM Corporation and others. All rights reserved.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors: IBM Corporation - initial API and implementation
******************************************************************************/
class IntroTab extends GraphicsTab {
Font font;
Image image;
Random random = new Random () ;
float x, y;
float incX = 10.0f ;
float incY = 5.0f ;
int textWidth, textHeight;
String text = "SWT" ;
public IntroTab ( GraphicsExample example ) {
super ( example ) ;
}
public void dispose () {
if ( image != null )
image.dispose () ;
image = null ;
if ( font != null )
font.dispose () ;
font = null ;
}
public String getCategory () {
return GraphicsExample.getResourceString ( "Introduction" ) ; //$NON-NLS-1$
}
public String getText () {
return GraphicsExample.getResourceString ( "SWT" ) ; //$NON-NLS-1$
}
public boolean isAnimated () {
return true ;
}
public void next ( int width, int height ) {
x += incX;
y += incY;
float random = ( float ) Math.random () ;
if ( x + textWidth > width ) {
x = width - textWidth;
incX = random * -width / 16 - 1 ;
}
if ( x < 0 ) {
x = 0 ;
incX = random * width / 16 + 1 ;
}
if ( y + textHeight > height ) {
y = ( height - textHeight ) - 2 ;
incY = random * -height / 16 - 1 ;
}
if ( y < 0 ) {
y = 0 ;
incY = random * height / 16 + 1 ;
}
}
public void paint ( GC gc, int width, int height ) {
if ( !example.checkAdvancedGraphics ())
return ;
Display display = Display.getCurrent () ;
if ( image == null ) {
image = example.loadImage ( Display.getCurrent () , "irmaos.jpg" ) ;
Rectangle rect = image.getBounds () ;
FontData fd = display.getSystemFont () .getFontData ()[ 0 ] ;
font = new Font ( display, fd.getName () , rect.height / 4 , SWT.BOLD ) ;
gc.setFont ( font ) ;
Point size = gc.stringExtent ( text ) ;
textWidth = size.x;
textHeight = size.y;
}
Path path = new Path ( display ) ;
path.addString ( text, x, y, font ) ;
gc.setClipping ( path ) ;
Rectangle rect = image.getBounds () ;
gc.drawImage ( image, 0 , 0 , rect.width, rect.height, 0 , 0 , width, height ) ;
gc.setClipping (( Rectangle ) null ) ;
gc.setForeground ( display.getSystemColor ( SWT.COLOR_BLUE )) ;
gc.drawPath ( path ) ;
}
}