7.2 An SWT Example

     

Instead of talking about SWT in the abstract, let's get this show on the road and see some code at work. Coding an example is going to give us the SWT story and what it takes to put together an SWT application. Our first example will be a simple one, and it will just display the message "No worries!" in an SWT window.

To follow along, create a new project, Ch07_01 , and add a class, Ch07_01 , in the org.eclipsebook.ch07 package. To work with SWT and SWT widgets, you typically start with these two imports:

 import org.eclipse.swt.widgets.*; import org.eclipse.swt.*; 

You'll need to include swt.jar in the build path to make these imports work. Remember that SWT is operating system-dependent, so there's going to be a different swt.jar for different operating systems. To add swt.jar to the Ch07_01 project, select that project in the Package Explorer, right-click it, and select Properties. In the Properties for Ch07_01 dialog that opens, select the Java Build Path item and click the Add External JARs button. Then navigate to swt.jar , which you'll find in one of the following directories, depending on your operating system (note that INSTALLDIR is the Eclipse installation directory; also note that you'll have to update these paths for your version of Eclipse, such as changing 2.1.1 to 2.1.2 or some other value):


Win32

INSTALLDIR\eclipse\plugins\org.eclipse.swt.win32_2.1.1\ws\win32\swt.jar


Linux GTK

INSTALLDIR/eclipse/plugins/org.eclipse.swt.gtk_2.1.1/ws/gtk/swt.jar


Linux Motif

INSTALLDIR/eclipse/plugins/org.eclipse.swt.motif_2.1.1/ws/motif/swt.jar


Solaris Motif

INSTALLDIR/eclipse/plugins/org.eclipse.swt.motif_2.1.1/ws/solaris/sparc/swt.jar


AIX Motif

INSTALLDIR/eclipse/plugins/org.eclipse.swt.motif_2.1.1/ws/aix/ppc/swt.jar


HPUX Motif

INSTALLDIR/eclipse/plugins/org.eclipse.swt.motif_2.1.1/ws/hpux/PA_RISC/swt.jar


Photon QNX

INSTALLDIR/eclipse/plugins/org.eclipse.swt.photon_2.1.1/ws/photon/swt.jar


Mac OS X

INSTALLDIR/eclipse/plugins/org.eclipse.swt.carbon_2.1.1/ws/carbon/swt.jar

After locating swt.jar , click Open , and then click OK to add it to the project's build path.

Some operating systems, such as Linux GTK, need more than one JAR to run SWT (in Linux GTK, you use swt.jar and swt-pi.jar ). In such cases, you have to add all of the required JARs to the build path. (All the required JAR files will be in the same folder.)


In the code, the next step is to create a Display object, which represents an SWT session . This object acts as the connection between SWT and the operating system's GUI support. You use a Display object to start an event loop and control communication between the main user interface thread and other threads. Here's how we create the Display object in the main method of the Ch07_01 class:

 import org.eclipse.swt.widgets.*; import org.eclipse.swt.*; public class Ch07_01 {         public static void main(String [] args) {  Display display = new Display( );  .         .         . } 

Now that you've got a Display object, you can create the various windows you want to work with by creating Shell objects. In SWT, a shell is a window that is managed by the operating system's window manager. A top-level shell is one that is a direct child of the display and is a window the user can move, resize, minimize, and so on. You can also have secondary shells , which are children of another shell, such as dialogs or message boxes. Here's how we create and size the shell we'll be usingnote that passing the display object to the Shell constructor makes the shell a child of the display object:

 import org.eclipse.swt.widgets.*; import org.eclipse.swt.*; public class Ch07_01 {         public static void main(String [] args) {            Display display = new Display( );  Shell shell = new Shell(display);   shell.setSize(300, 200);  .         .         .         } } 

We're ready to add some widgets to our application. You'll find that, in the SWT documentation, the term widget is used almost interchangeably with the terms control and composite . Technically speaking, the formaland somewhat circulardefinition of a widget in the SWT documentation is "the abstract class for any UI object that can be placed inside another widget." Practically speaking, widget is the general term for any UI element in SWT. Composites are widgets that are designed to have children, such as toolbars , trees, and canvases. Controls are widgets that have an operating system counterpart , such as buttons , lists, and labels. You can see all the SWT controls in Table 7-1. Note that we're also listing the possible styles and events for each control.

Table 7-1. SWT controls and options

Widget

Purpose

Styles

Events

Button

A standard push button.

BORDER, CHECK, PUSH, RADIO, TOGGLE, FLAT, LEFT, RIGHT, CENTER, ARROW (with UP, DOWN)

Dispose, FocusIn, FocusOut, Help, KeyDown, KeyUp, MouseDoubleClick, MouseDown, MouseEnter, MouseExit, MouseHover, MouseUp, MouseMove, Move, Paint, Resize, Selection

Canvas

A composite control that can contain other controls, and also is a drawing surface. Often the foundation of custom controls.

BORDER, H_SCROLL, V_SCROLL, NO_BACKGROUND, NO_FOCUS, NO_MERGE_PAINTS, NO_REDRAW_RESIZE, NO_RADIO_GROUP

Dispose, FocusIn, FocusOut, Help, KeyDown, KeyUp, MouseDoubleClick, MouseDown, MouseEnter, MouseExit, MouseHover, MouseUp, MouseMove, Move, Paint, Resize

Caret

The standard I-beam caret used to indicate the insertion point for text.

 

Dispose

Combo

A standard combo boxthat is, the combination of a text control and a drop-down list.

BORDER, DROP_DOWN, READ_ONLY, SIMPLE

Dispose, FocusIn, FocusOut, Help, KeyDown, KeyUp, MouseDoubleClick, MouseDown, MouseEnter, MouseExit, MouseHover, MouseUp, MouseMove, Move, Paint, Resize, DefaultSelection, Modify, Selection

Composite

Control that can contain other widgets.

BORDER, H_SCROLL, V_SCROLL

Dispose, FocusIn, FocusOut, Help, KeyDown, KeyUp, MouseDoubleClick, MouseDown, MouseEnter, MouseExit, MouseHover, MouseUp, MouseMove, Move, Paint, Resize

CoolBar

A composite control that allows users to reposition contained items dynamically.

BORDER

Dispose, FocusIn, FocusOut, Help, KeyDown, KeyUp, MouseDoubleClick, MouseDown, MouseEnter, MouseExit, MouseHover, MouseUp, MouseMove, Move, Paint, Resize

CoolItem

A UI element that represents a positionable area of a cool bar.

DROP_DOWN

Dispose

Group

A composite control that groups other widgets together. Can enclose them in an etched border and display a label.

BORDER, SHADOW_ETCHED_IN, SHADOW_ETCHED_OUT, SHADOW_IN, SHADOW_OUT, SHADOW_NONE

Dispose, FocusIn, FocusOut, Help, KeyDown, KeyUp, MouseDoubleClick, MouseDown, MouseEnter, MouseExit, MouseHover, MouseUp, MouseMove, Move, Paint, Resize

Label

The standard label controldisplays text or an image.

BORDER, CENTER, LEFT, RIGHT, WRAP, SEPARATOR (with HORIZONTAL, SHADOW_IN, SHADOW_OUT, SHADOW_NONE, VERTICAL)

Dispose, FocusIn, FocusOut, Help, KeyDown, KeyUp, MouseDoubleClick, MouseDown, MouseEnter, MouseExit, MouseHover, MouseUp, MouseMove, Move, Paint, Resize

List

The standard list controlallows the user to choose items from a list of items.

BORDER, H_SCROLL, V_SCROLL, SINGLE, MULTI

Dispose, FocusIn, FocusOut, Help, KeyDown, KeyUp, MouseDoubleClick, MouseDown, MouseEnter, MouseExit, MouseHover, MouseUp, MouseMove, Move, Paint, Resize, Selection, DefaultSelection

Menu

The standard menu controlcontains selectable menu items.

BAR, DROP_DOWN, NO_RADIO_GROUP, POP_UP

Dispose, Help, Hide, Show

MenuItem

UI object that represents an item in a menu.

CHECK, CASCADE, PUSH, RADIO, SEPARATOR

Dispose, Arm, Help, Selection

ProgressBar

The standard progress bardisplays progress of a task to the user, usually as a bar graph.

BORDER, INDETERMINATE, SMOOTH, HORIZONTAL, VERTICAL

Dispose, FocusIn, FocusOut, Help, KeyDown, KeyUp, MouseDoubleClick, MouseDown, MouseEnter, MouseExit, MouseHover, MouseUp, MouseMove, Move, Paint, Resize

Sash

Allows the user to drag a "rubber-banded" outline of the sash within the parent window to allow users to resize child widgets by moving their dividing lines.

BORDER, HORIZONTAL, VERTICAL

Dispose, FocusIn, FocusOut, Help, KeyDown, KeyUp, MouseDoubleClick, MouseDown, MouseEnter, MouseExit, MouseHover, MouseUp, MouseMove, Move, Paint, Resize, Selection

Scale

Control that represents a range of numeric values.

BORDER, HORIZONTAL, VERTICAL

Dispose, FocusIn, FocusOut, Help, KeyDown, KeyUp, MouseDoubleClick, MouseDown, MouseEnter, MouseExit, MouseHover, MouseUp, MouseMove, Move, Paint, Resize, Selection

ScrollBar

The standard scrollbarrepresents a range of positive numeric values.

HORIZONTAL, VERTICAL

Dispose, Selection

Shell

A window that is managed by the operating system window manager.

BORDER, H_SCROLL, V_SCROLL, CLOSE, MIN, MAX, NO_TRIM, RESIZE, TITLE (see also SHELL_TRIM,DIALOG_TRIM)

Dispose, FocusIn, FocusOut, Help, KeyDown, KeyUp, MouseDoubleClick, MouseDown, MouseEnter, MouseExit, MouseHover, MouseUp, MouseMove, Move, Paint, Resize, Activate, Close, Deactivate,Deiconify, Iconify

Slider

Control that represents a range of numeric values, which the user can select by positioning a draggable thumb.

BORDER, HORIZONTAL, VERTICAL

Dispose, FocusIn, FocusOut, Help, KeyDown, KeyUp, MouseDoubleClick, MouseDown, MouseEnter, MouseExit, MouseHover, MouseUp, MouseMove, Move, Paint, Resize, Selection

TabFolder

Composite control that groups controls into pages that the user can select using labeled tabs.

BORDER

Dispose, FocusIn, FocusOut, Help, KeyDown, KeyUp, MouseDoubleClick, MouseDown, MouseEnter, MouseExit, MouseHover, MouseUp, MouseMove, Move, Paint, Resize, Selection

TabItem

Control corresponding to a tab in a tab folder.

 

Dispose

Table

Control that displays a list of table items.

BORDER, H_SCROLL, V_SCROLL, SINGLE, MULTI, CHECK, FULL_SELECTION, HIDE_SELECTION

Dispose, FocusIn, FocusOut, Help, KeyDown, KeyUp, MouseDoubleClick, MouseDown, MouseEnter, MouseExit, MouseHover, MouseUp, MouseMove, Move, Paint, Resize, Selection, DefaultSelection

TableColumn

UI object that represents a column in a table.

LEFT, RIGHT, CENTER

Dispose, Move, Resize, Selection

TableItem

UI object that represents an item in a table.

 

Dispose

Text

The standard text control, which allows the user to type text into it.

BORDER, SINGLE, READ_ONLY, LEFT, CENTER, RIGHT, WRAP, MULTI (with H_SCROLL, V_SCROLL)

Dispose, FocusIn, FocusOut, Help, KeyDown, KeyUp, MouseDoubleClick, MouseDown, MouseEnter, MouseExit, MouseHover, MouseUp, MouseMove, Move, Paint, Resize, DefaultSelection, Modify, Verify

ToolBar

The standard toolbara composite control that contains toolbar items.

BORDER, FLAT, WRAP, RIGHT, SHADOW_OUT HORIZONTAL, VERTICAL

Dispose, FocusIn, FocusOut, Help, KeyDown, KeyUp, MouseDoubleClick, MouseDown, MouseEnter, MouseExit, MouseHover, MouseUp, MouseMove, Move, Paint, Resize

ToolItem

UI object that represents an item in a toolbar.

PUSH, CHECK, RADIO, SEPARATOR, DROP_DOWN

Dispose, Selection

Tracker

UI object that implements "rubber-banding" rectangles.

LEFT, RIGHT, UP, DOWN, RESIZE

Dispose, Move, Resize

Tree

Control that displays a hierarchical list of tree items.

BORDER, H_SCROLL, V_SCROLL, SINGLE, MULTI, CHECK

Dispose, FocusIn, FocusOut, Help, KeyDown, KeyUp, MouseDoubleClick, MouseDown, MouseEnter, MouseExit, MouseHover, MouseUp, MouseMove, Move, Paint, Resize, Selection, DefaultSelection, Collapse, Expand

TreeItem

UI object that represents a tree item in a tree.

 

Dispose

In this example, we're going to use an SWT label to display our "No worries!" message. You can see the possible styles for labels and all SWT controls in Table 7-1; here are more details for the label styles:


SWT.BORDER

Adds a border


SWT.CENTER

Centers text


SWT.LEFT

Left-justifies text


SWT.RIGHT

Right-justifies text


SWT.WRAP

Wraps text


SWT.SEPARATOR

Supports a separator

Here's how we create a label and set its text as appropriatenote that we're centering the label by setting its style to SWT.CENTER and setting the bounds of the label to correspond to the entire client area of the shell:

 import org.eclipse.swt.widgets.*; import org.eclipse.swt.*; public class Ch07_01 {         public static void main(String [] args) {            Display display = new Display( );            Shell shell = new Shell(display);            shell.setSize(300, 200);  Label label = new Label(shell, SWT.CENTER);   label.setText("No worries!");   label.setBounds(shell.getClientArea( ));  .         .         . } 

Finally, you open the shell to display it and add the event-dispatching loop. That loop usually keeps going until the user closes the main window. In the body of the loop, we check if the display object needs to dispatch a message, and then make that object sleep for a while. After the loop terminates, we dispose of the display object, as you can see in the final listing for Example 7-1.

Example 7-1. The first SWT application, Ch07_01.java
 import org.eclipse.swt.widgets.*; import org.eclipse.swt.*; public class Ch07_01 {         public static void main(String [] args) {            Display display = new Display( );            Shell shell = new Shell(display);            shell.setSize(300, 200);            Label label = new Label(shell, SWT.CENTER);            label.setText("No worries!");            label.setBounds(shell.getClientArea( ));  shell.open( );            while(!shell.isDisposed( )) {                   if(!display.readAndDispatch( )) display.sleep( );            }            display.dispose( );  } } 

Note, in particular, that when we're done with the display object, we dispose of it with its dispose method. Disposing of resources like this is not necessary in AWT or Swing, but it is in SWT because the operating systems under SWT require the explicit allocation and disposing of resources. The upshot is that SWT requires you to free any operating system resources that you have allocated, and you can use the widget .dispose method to do that.

That completes the code, but this example is not yet ready to run; the next step is to add the native code support JNI library in the path so the Java virtual machine can find that native code. Recall that SWT uses native code support for display, which means that you had to use some JNI code. To do that, select the class that you want to run ( Ch07_01 here) in the Package Explorer, and select Run Run to set up a launch configuration.

In the Launch Configurations dialog that appears, select Java Application and click the New button. The Name , Project, and Main class boxes should be filled in; if they're not, fill them in now. Then click the Arguments tab, and in the VM Arguments box, insert the location of the SWT library, which depends on your operating system (you'll have to update these paths for your version of Eclipse, such as changing 2.1.1 to 2.1.2 or something similar):


Win32

-Djava.library.path=INSTALLDIR\plugins\org.eclipse.swt.win32_2.1.1\os\win32\x86


Linux GTK

-Djava.library.path=INSTALLDIR/eclipse/plugins/org.eclipse.swt.gtk_2.1.1/os/linux/x86


Linux Motif

-Djava.library.path=INSTALLDIR/eclipse/plugins/org.eclipse.swt.motif_2.1.1/os/linux/x86


Solaris Motif

-Djava.library.path=INSTALLDIR/eclipse/plugins/org.eclipse.swt.motif_2.1.1/os/solaris/sparc


AIX Motif

-Djava.library.path=INSTALLDIR/eclipse/plugins/org.eclipse.swt.motif_2.1.1/os/aix/ppc


HPUX Motif

-Djava.library.path=INSTALLDIR/eclipse/plugins/org.eclipse.swt.motif_2.1.1/os/hpux/PA_RISC


Photon QNX

-Djava.library.path=INSTALLDIR/eclipse/plugins/org.eclipse.swt.photon_2.1.1/os/qnx/x86


Mac OS X

-Djava.library.path=INSTALLDIR/eclipse/plugins/org.eclipse.swt.carbon_2.1.1/os/macosx/ppc

Then click the Apply button, followed by the Run button. You should see this new example at work, as in Figure 7-1.

Figure 7-1. The first SWT application
figs/ecps_0701.gif

That's our first SWT applicationnot too involved, but now we've got the basics of SWT applications down.



Eclipse
Eclipse
ISBN: 0596006411
EAN: 2147483647
Year: 2006
Pages: 114
Authors: Steve Holzner

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net