<<

Components Containers and Layout Menus Dialog Windows Event Handling  The Abstract Toolkit (AWT), from :

Abstract Window Toolkit

Interface to the GUI Interface to platform's components: Layout: Placing GUI event keyboard, window system Buttons, text components handling mouse, … (Win, Mac, …) fields, …

Uses components Don't use these! . Looks like a native application . One must sometimes be aware of differences between operating systems… . Small set of components . , … – no table, no color chooser, …  The , from Java :

Java Foundation Classes (JFC)

Java : AWT, More advanced graphics classes

Components based on pure Java "Painting on the screen" . Won't always look "native”, . The basis of Swing but works identically on all platforms components – and your own . Replaces AWT components, adds more . Discussed next lecture . We still use many other parts of AWT Components: JTable, JButton, … extending JComponent

Containers: JFrame – a top level window; JPanel – a part of a window, grouping some components together

Layout Managers: Decide how to place components inside containers  Swing: Can replace the dynamically . Nimbus (current Java standard)

. Metal (earlier Java standard)

. Windows classic

 Running example: A very simple word processor  Ordinary window in Swing: JFrame . A top-level container: Not contained in anything else ▪ AWT

Base class for all Swing components

Common implementation details

Has two states, on/off Radio buttons: Only one per Standard button active at a time

Checkbox, on / off Editing styled text: Abstract base class, HTML, RTF, common functionality custom formats

A single line of text Multi-line text area

Special formatting for Passwords are not shown dates, currency, … as they are entered . Let's add components… ▪

Nothing is shown on the screen yet!

We don’t want to see individual components pop up…  When we have added all components: . Give the window a size… ▪ ▪ ▪

. And then display it! ▪

Tiny text area

We have to know more about layout…

 The structure of a container: . Can contain other “subcontainers” – a containment hierarchy



Can be added if desired

Contains all components except the menu bar

Title Content pane  Subcontainers can simplify layout We decide that we should have three ▪ : Contains menus subcomponents: ▪ : Contains toolbar buttons A JPanel, a JTextPane ▪ : A rectangular section and a JLabel. ▪ : A scrollable section The JPanel should contain many buttons.  Let's try! ▪

 We get the intended grouping, but not the intended layout…  How should subcomponents be positioned and sized? . Simplest approach: Specify absolute x and y coordinates ▪ ▪ . Advantages / disadvantages: ▪ (+) Easy to write a GUI designer ▪ (-) What about resizeable GUIs? (Typical old-style Windows dialogs don’t allow resizing…) ▪ (-) What about larger fonts? ▪ (-) What about translations into other languages, where words are longer?  Preferred Sizes

Most components can calculate a preferred size : Label size for the given font + padding

Text pane is empty  preferred size is tiny!

Containers have a

Asks subcomponents for preferred size Applies layout rules ( default: Left to right “flow layout”) Calculates the container’s preferred size

Continues hierarchically…  Defining Preferred Sizes . Dynamic calculation: ▪

. For constant preferred sizes, no subclasses are needed: ▪

. Also: ▪ (): Maximum possible size ▪ (): Minimum possible size ▪ Used when components can be elastically resized  Packing and resizing

If you pack() the top-level window… …it asks its layout manager for a preferred size

If you setSize() the top-level window… What happens depends on the layout managers’ overflow handling Several simple layout managers built in

Can be combined into complex layouts  MigLayout – strongly recommended! By default: . Grid-based, modern, extremely flexible Preferred size used; ▪ continue on this row; add a gap suitable for related components

A gap suitable for two unrelated components New row after this component Span 3 columns, … make the field grow larger than its preferred size Layout parameters for each component  Code skeleton: ▪

Strange: We create an object, forget about it, and then we’re done?

As long as any frame is active, Java will not exit! We can still interact with the frame through GUI events…  Buttons are contained in their own panel

Separation

points margin to the left of the component ▪ Layout constraints

Column constraints

Our goal… Row constraints ▪ ▪

Separators Creates an invisible component, pixels tall, up to infinity wide

 How do you know when a button has been pressed? Swing is not -safe: AWT receives ”raw” keyboard/mouse input Once a component has been shown, . In a background event dispatch thread only manipulate it in this thread! . Generates low-level events: ,

Calls event handlers in relevant components . Keyboard event  sent to component with keyboard focus

Built-in event handlers can generate semantic events . Click inside a button, then release 

You can register your own event handlers -- listeners! . A listener is interested in a particular type of event . Example: A particular button has been pressed  How do listeners work? Observer design pattern! ▪ Listeners are observers, observing specific event types Components are observable, can tell others ▪ when something happens Keep track of listeners

Call this method to add your own listener

Key events end up here… One event at a time! ...in the event dispatch thread, If your listener takes a long and the method goes on to call time, the UI will freeze. If so, all registered listeners let the listener start a thread!  How are listeners used? ▪

Create local variables for the buttons, so you can refer to them later!

A lot of trivial code around “the real work”

Called by the event system in the event dispatch thread when Bold is pressed  Alternative: Inner Class ▪

Define a class inside another – even inside a method!

Gives access to fields of the enclosing class, final local variables of the method

We still need a name…  Alternative: Anonymous Inner Class ▪

Special “”! 1) Declares an unnamed class implementing 2) Gives it an implementation for () 3) Creates a new object of this unnamed class First alternative: One listener per button

You know where the event came from – the bold button

A little bit of overhead from defining many classes Second alternative: A combined listener class

Since many components share listeners, you must check the source of each event  Alternative for actions that can be triggered from many places: . Use (interface) and (helper class)! ▪

. Many components can be constructed from an action object ▪  Event handling for menus: No difference in principle .  To close a window programmatically: Call . . Frees all resources related to the window  To configure what the close button does: . Use , where x is… ▪ ▪ ▪ ▪ . To add a yes/no dialog: ▪ Use ; add your own An AWT adapter provides empty implementations for an interface with many methods  you only implement those you are interested in . Some of the most important listeners: ▪ Button pushed, menu item selected, … ▪ Slider or scroll bar adjusted ▪ Items selected in list ▪ Mouse button pushed/released, … ▪ Mouse pointer moved ▪ Key pressed, typed, released Sent to the component that has keyboard focus If not processed, passed on to its container, etc.  Alternative to KeyListener: Key Bindings . Works if keyboard focus is in THIS component

Check the KeyStroke Javadoc An action name (next slide!) for examples

Works if keyboard focus is here or in a subcomponent

Works if keyboard focus is in the same window  Alternative to KeyListener: Key Bindings . Define a standard (can be used in menus or other places as well)

Define which is called for the action name ”moveLeft” Standard Dialog Windows Additional Features Debugging a GUI Program  Standard dialog windows: ▪  Additional dialog windows: . File dialogs ▪

. Color selection dialogs ▪  Additional features we will not discuss: . Data transfer support: java.awt.datatransfer ▪ Transfer objects between applications ▪ support (copy/paste) ▪ Retrieving text from the system clipboard:

. Help system: JavaHelp (download from ) . Printing: . support: . The Undo/Redo Framework:  You can view the component hierarchy . Select a frame (window) and press . The component hierarchy is dumped to standard error 

.

▪ ▪