Lecture 9 Graphical User Interface

background image

Programming Languages

Lecture 9

Graphical User Interface

R. Pełka – Wojskowa Akademia Techniczna

background image

R. Pełka: Programming Languages

2

Guido van Rossum

 Designer of Python

 Dutch computer programmer, now at Google

 Some facts

 Development began in 1996
 Interpreted scripting language descended

from ABC

 Predecessor, ABC, was inspired by SETL

Lambert Meertens spent year with SETL group

at NYU

 Popular and successful, influential at Google

About the origin of Python, Van Rossum wrote in 1996: Over six years ago, in December
1989, I was looking for a "hobby" programming project that would keep me occupied
during the week around Christmas. My office … would be closed, but I had a home
computer, and not much else on my hands. I decided to write an interpreter for the new
scripting language I had been thinking about lately: a descendant of ABC that would appeal
to Unix/C hackers. I chose Python as a working title for the project, being in a slightly
irreverent mood and a big fan of Monty Python's Flying Circus

background image

R. Pełka: Programming Languages

3

Outline

 Graphical User Interface

 Idea and properties
 Containers
 Components
 Events

 Tools for GUI design

 AWT – Application Windowing Toolkit
 Swing – new Java GUI classes
 SWT (Standard Widget Toolkit - Eclipse)

 Simple GUI design

background image

R. Pełka: Programming Languages

4

GUI Principles

GUI

– Graphical User Interface

 GUI’s are a good target for OO design
 GUI’s main elements

Components

: GUI building blocks.

buttons, menus, sliders, etc.

Layout

: arranging components to

form a usable GUI.

using layout managers.

Events

: reacting to user input.

button presses, menu selections, etc.

 There are some tools for convenient GUI-based design

JBuilder, Eclipse, NetBeans

background image

R. Pełka: Programming Languages

5

Java GUI classes

AWT

(Abstract Window Toolkit) (java.awt.*)

 old GUI framework for Java (Java 1.1)
 some reliance on native code counterparts
 platform independence problems

Swing

(javax.swing.*)

 new GUI framework first introduced in Java 1.2
 includes AWT features plus many enhancements
 pure Java components (no reliance on native code)
 pluggable look and feel architecture

SWT

(Standard Widget Toolkit; from Eclipse)

background image

R. Pełka: Programming Languages

6

AWT and Swing

AWT

was the original platform-dependent

layer of Java to build GUI’s.

Swing

(platform independent layer) was

added later. Swing is part of JFC (

Java

Framework Collection

).

background image

R. Pełka: Programming Languages

7

Event-driven programming

 GUIs are

event-driven programs

: external events

cause methods to be executed

Components

: objects we create which have a

screen presence (e.g. controls, window panes),
and with which the user interacts (e.g. buttons).

Events

: when a user interacts with a component,

Java creates an event object (which records the
source)

Listeners

: Objects we create which respond to

events. A listener has a handler method, which
Java invokes when the event occurs.

background image

R. Pełka: Programming Languages

8

Components

 Components include buttons, textfields, scrollbars,

windows, pop-up menus, menu items, etc

 Example:

javax.swing.JButton

constructor, e.g.:

JButton btn =

new

JButton("Click here!");

instance methods, e.g.:

String

str = btn.getText();

btn.setText("Click again!");

Containers

are components that contain others

instance methods allowing you to add (and position)
components (e.g. button) to the container (e.g. window)

background image

R. Pełka: Programming Languages

9

Event Objects

 different user actions correspond to different event

classes (both low level and high level)

 example:

java.awt.event.ActionEvent

created by Java when (e.g.) a user clicks a button

instance methods:

getSource() – returns a reference to the source of the event

(i.e.the button, textfield etc that generated it)

getActionCommand() – returns a String associated with the

source (e.g. the button's text)

constructor methods exist, but it is unlikely that we would
call them

background image

R. Pełka: Programming Languages

10

Listener Objects

 we delegate to Listener objects the task of

responding to certain events for certain
components

 objects contain handler methods that run in

response – we do not normally invoke the handlers
ourselves; Java does it for us when the events occur

 Listeners can be any class of object we like, but

must implement certain interfaces to guarantee
inclusion of appropriately named handlers

 e.g. "listening" for button clicks

implements ActionListener

must include a definition of actionPerformed method

background image

R. Pełka: Programming Languages

11

Registering Listeners

 how does Java know which listener object will

respond to a component's events?

 we must register one or more listeners with the

component

 e.g. if

btn

is a

JButton

and

lstnr1

and

lstnr2

are

listeners (both

implements ActionListener

)

btn.addActionListener(lstnr1);
btn.addActionListener(lstnr2);
...
btn.removeActionListener(lstnr2);

 When the user interacts with the button, Java invokes

the handler methods in each registered listener.

background image

R. Pełka: Programming Languages

12

Container (window) with
component (button)

All this for one button click ...

user

user clicks
button

event object
is generated

ae:ActionEvent

event is
queued
for action

Listener objects

... do something

event dispatch

loop: remove from

queue, invoke

handlers in

registered

listeners

background image

R. Pełka: Programming Languages

13

... which requires:

 In the program:

 write a class that creates a window and a JButton, adds the

JButton to the window, makes the window visible

 write listener classes (implements ActionListener) with

handler method (actionPerformed)

 create listener objects and register them with the JButton

 At runtime:

 user clicks the button
 Java creates the ActionEvent object
 Java adds object to a queue of events
 Java repeatedly

takes object from queue

identifies their listeners

invokes each listener's handler with event as input

background image

R. Pełka: Programming Languages

14

A first GUI ...

import

java.awt.*;

import

java.awt.event.*;

import

javax.swing.*;

public

class

SimplePanel

extends

JPanel {

private

JButton btn;

public

SimplePanel() {

super

();

btn =

new

JButton("Click me!");

add(btn);
ActionListener lstnr =

new

SimpleButtonListener();

btn.addActionListener(lstnr);
}

import AWT, AWT.event
and Swing packages

import AWT, AWT.event
and Swing packages

call to JPanel constructor

call to JPanel constructor

create a button

create a button

add it to the panel

add it to the panel

create a listener

create a listener

register it with the button

register it with the button

background image

R. Pełka: Programming Languages

15

public

static

void

main(String[] args) {

JFrame frm =

new

JFrame("A simple GUI");

Container contentPane = frm.getContentPane();
JPanel pnl =

new

SimplePanel();

contentPane.add(pnl);
frm.setBounds(100, 300, 400, 200);
frm.setVisible(true);
}

}

SimplePanel continued

create a frame

create a frame

get a handle on it

get a handle on it

create a panel

create a panel

add panel to frame

add panel to frame

position it on screen

position it on screen

make it visible!

make it visible!

background image

R. Pełka: Programming Languages

16

SimpleButtonListener

import

java.awt.event.*;

public class

SimpleButtonListener

implements

ActionListener {

private

int

count;

public

SimpleButtonListener() {

}

public

void

actionPerformed(ActionEvent ae) {

count++;
System.out.println(count);
}
}

tell Java it
is a Listener

tell Java it
is a Listener

state what happens
when the button is
pressed

state what happens
when the button is
pressed

background image

R. Pełka: Programming Languages

17

That’s it ...

try do it in BlueJ yourself

you can also use JDK ...
no changes in source code needed

after 10 clicks

background image

R. Pełka: Programming Languages

18

Observations

 no low level details (trapping the mouse

click, queuing the event object, etc.)

 a component may have any number of

listeners attached to it, including zero

 we did not need to invoke the handler

actionPerformed

– Java does it for us

 handlers should not involve a lot of

computation

background image

R. Pełka: Programming Languages

19

Converting Centigrade to
Fahrenheit

construct a simple GUI

allowing a user to

convert temperatures between

centigrade

and

fahrenheit

 the user should be able to input

a temperature in fahrenheit, then click to convert, and
see the corresponding centigrade reading

a temperature in centigrade, then click to convert, and
see the corresponding fahrenheit reading

 Suggestion – always display both readings in the

GUI, and provide two buttons for the user to
choose the conversion

background image

R. Pełka: Programming Languages

20

Outline plan for GUI

 a frame for the GUI ...

... containing a panel in its content pane ...

... which contains two buttons

... and two boxes for displaying
temperatures

... with appropriate labels

 the buttons will need Listeners, which will

read the appropriate input

compute the appropriate conversion

write the result to the appropriate box

 does the frame need a Listener?

background image

R. Pełka: Programming Languages

21

Components in the GUI

 the GUI needs 2

JButton

s, a subclass of

JPanel

, and

javax.swing.JTextField

allows display / entry / edit of a line of text

constructor specifies initial value (and number of
columns)

has methods

setText(...), getText(...),

etc.

javax.swing.JLabel

allows display of text / images

user cannot edit them

constructor supplies initial text

has methods

setText(...), getText(...),

etc.

background image

R. Pełka: Programming Languages

22

JFrame

JPanel (in the ContentPane
of the JFrame)

JButton

JTextField

JLabel

Components in the GUI

background image

R. Pełka: Programming Languages

23

GUI Containers

 some components are

containers

can have other components added to them

JPanel

is a container – it has

JButton

s added to it

a container can have other containers added to it

JFrame

is a container – it has a

JPanel

added to it

(via its content pane)

 (in fact, in Swing, all components are

containers)

background image

R. Pełka: Programming Languages

24

Layout Managers

 you can specify the position in a container at which a

component will be placed (e.g.

setLocation(...)

),

but this is not sensitive to resizing or to different
platforms

 each container has an instance variables which holds

a layout manager object, which you can set and get

 when you add components to the container, the

layout manager positions them and sizes them
automatically

 the default for

JPanel

is

FlowLayout

, which places

them sequentially, left-to-right, top-to-bottom

 others include

BorderLayout

,

CardLayout

,

GridLayout

,

GridBagLayout

and

BoxLayout

background image

R. Pełka: Programming Languages

25

Implementation in BlueJ

background image

R. Pełka: Programming Languages

26

class TempConversionGUI

import

javax.swing.*;

import

java.awt.*;

public class

TempConversionGUI

extends

JPanel {

// constants definition

public

static final String DEGREES_FAHRENHEIT = "Degrees Fahrenheit";

public

static final String DEGREES_CENTIGRADE = "Degrees Centigrade";

public

static final String COMPUTE_FAHRENHEIT = "Compute Fahrenheit";

public

static final String COMPUTE_CENTIGRADE = "Compute Centigrade";

private

static final String INIT_FAHR = "212";

private

static final String INIT_CENT = "100";

private

static final

int

TFCOLS = 6;

// components defininition

private

JLabel fahrLabel;

private

JTextField fahrField;

private

JLabel centLabel;

private

JTextField centField;

private

JButton compFahrBtn;

private

JButton compCentBtn;

...

background image

R. Pełka: Programming Languages

27

class TempConversionGUI

ctnd.


// construct Frame and all components

public

TempConversionGUI() {

super

();

fahrLabel =

new

JLabel(DEGREES_FAHRENHEIT);

fahrField =

new

JTextField(INIT_FAHR, TFCOLS);

centLabel =

new

JLabel(DEGREES_CENTIGRADE);

centField =

new

JTextField(INIT_CENT, TFCOLS);

compFahrBtn =

new

JButton(COMPUTE_FAHRENHEIT);

compCentBtn =

new

JButton(COMPUTE_CENTIGRADE);

add(fahrLabel);
add(fahrField);
add(centLabel);
add(centField);
add(compFahrBtn);
add(compCentBtn);

// add Listeners

compFahrBtn.addActionListener(

new

CompFahrBtnLstnr(

this

));

compCentBtn.addActionListener(

new

CompCentBtnLstnr(

this

));

} ...

background image

R. Pełka: Programming Languages

28

class TempConversionGUI

ctnd.


// methods for getting and setting values in TextFields


public void

setFahrField(

int

theFahr) {

fahrField.setText("" + theFahr);
}

public void

setCentField(

int

theCent) {

centField.setText("" + theCent);
}

public int

getFahrField() {

String str = fahrField.getText().trim();

return

Integer.parseInt(str);

}

public int

getCentField() {

String str = centField.getText().trim();

return

Integer.parseInt(str);

}
...

background image

R. Pełka: Programming Languages

29

class TempConversionGUI

ctnd.


// main method


public static void

main(String[] args) {

TempConversionGUI gui =

new

TempConversionGUI();

JFrame frm =

new

JFrame("Temperature Conversions");

Container contentPane = frm.getContentPane();
contentPane.add(gui);
frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frm.setBounds(50, 75, 300, 150);
frm.setVisible(true);
}
}

Class

TempConversionGUI

is ready !

background image

R. Pełka: Programming Languages

30

class CompFahrBtnLstnr

import

java.awt.event.*;

public class

CompFahrBtnLstnr

implements

ActionListener {


// private variable gui

private

TempConversionGUI gui;

// constructor

public

CompFahrBtnLstnr(TempConversionGUI theGUI) {

gui = theGUI;
}

// method for cent to fahr conversion

public void

actionPerformed(ActionEvent ae) {

int

cent = gui.getCentField();

int

fahr = (

int

) Math.round(cent * 9.0 / 5.0 + 32);

gui.setFahrField(fahr);
}
}

background image

R. Pełka: Programming Languages

31

class CompCentBtnLstnr

import

java.awt.event.*;

public class

CompCentBtnLstnr

implements

ActionListener {

// private variable gui

private

TempConversionGUI gui;

// constructor

public

CompCentBtnLstnr(TempConversionGUI theGUI) {

gui = theGUI;
}

// method for fahr to cent conversion

public void

actionPerformed(ActionEvent ae) {

int

fahr = gui.getFahrField();

int

cent = (

int

) Math.round((fahr - 32) * 5.0 / 9.0);

gui.setCentField(cent);
}
}

background image

R. Pełka: Programming Languages

32

class GenericWindowLstnr

import

java.awt.event.*;

public class

GenericWindowLstnr

implements

WindowListener {

// constructor

public

GenericWindowLstnr() { }

// methods

public void

windowOpened(WindowEvent we) { }

public void

windowActivated(WindowEvent we) { }

public void

windowDeactivated(WindowEvent we) { }

public void

windowIconified(WindowEvent we) { }

public void

windowDeiconified(WindowEvent we) { }

public void

windowClosing(WindowEvent we) {

System.exit(0);
}

public void

windowClosed(WindowEvent we) { }

}

verify this project

yourself in BlueJ !!

background image

R. Pełka: Programming Languages

33

Discussion

 in our program, the buttons have listeners, but the

textfields do not

they could have listened for an 'Enter' and then invoked a
handler method

 there is a clean separation between the GUI class,

which handles the I/O, and the classes that do the real
processing

 the listeners are given a reference to the GUI class so

that they can send messages

 we have ignored problems with illegal input
 JFrame also has a listener

now, we will consider 7 possible improvements of our
GUI

background image

R. Pełka: Programming Languages

34

1. The Window Listener

 we mentioned that we could associate a listener

with the JFrame

 the WindowListener interface specifies 7 methods,

which respond to changes in a window's state:

windowActivated(...)

: window is set to be active

windowClosed(...)

: window is closed by program

windowClosing(...)

: window closed by user

windowDeactivated(...)

: window is no longer active

windowDeiconified(...)

: window is restored to normal

windowIconified(...)

: window is minimised

windowOpened(...)

: window opened for first time

background image

R. Pełka: Programming Languages

35

2. Using WindowAdapter

 instead of laboriously typing default methods for

the

WindowListener

, we can instead inherit from

WindowAdapter

:

implements

WindowListener

supplies 7 default methods

 all we need to do is override the particular methods

we want

background image

R. Pełka: Programming Languages

36

Nested classes

 a

nested class

is one defined

inside

another

use if the inside class only makes sense in the
context of the outer one, or if it must have access to
the outer class variables in order to work

public class Outer {

//constructors, variables, methods etc for Outer

class NestedClass {

//constructors, variables, methods, etc

//for NestedClass

}

}

background image

R. Pełka: Programming Languages

37

3(a). WindowListener as nested

class

 Nested classes can be static or non-static

public class TempConversionGui {

//...

static class MyAdapter extends WindowAdapter {
public void windowClosing(WindowEvent we) {

System.exit(0);

}
}
public static void main(String[] args) {

//...

frm.addWindowListener(new MyAdapter());
//...

background image

R. Pełka: Programming Languages

38

3(b). … or as Anonymous class

 we only used the nested class in a single line
 instead of giving a full named class definition, we can use an

anonymous

class:

 is defined at same point instance is created
 extends a superclass or implements an interface
 has no name or constructor of its own

 listeners are commonly implemented as anonymous classes

frm.addWindowListener(new WindowAdapter() {

public void windowClosing(WindowEvent we)
{
System.exit(0);
}
}
);

background image

R. Pełka: Programming Languages

39

4. Combining the listeners

 use a single listener to responds to either

button click

 need to determine which button has been

clicked

the event is passed in as an

ActionEvent ae

use

ae.getActionCommand()

to get the text of the

button

decide which computation to do, and which textfield
to update

 fewer classes, but the code is more complex

and less cohesive

background image

R. Pełka: Programming Languages

40

5. Make the GUI its own
listener

 make the GUI class implement

ActionListener

 provide its own

actionPerformed

method

 the

actionPerformed

method is simpler – it

has direct access to the variables of the GUI

 no need for separate

BtnLstnr

classes

background image

R. Pełka: Programming Languages

41

6. Responsive Text Fields

 instead of having fields to enter and display

text, and buttons to initiate action, we could
have the text fields respond to the "Enter" key

 the ActionEvent ae is then the "Enter" key

 use

ae.getActionCommand()

to report which

text field, and then update the appropriate
field

 no need for buttons on the GUI, so should

change the initial size.

background image

R. Pełka: Programming Languages

42

Discussion

 we have seen 7 different version of the

temperature conversion program (and the
first 6 give identical GUIs)

 these are different design decisions that

you the programmer must make

more classes means a slower start-up to the
program

(but anonymous classes are still classes!)

a single class has less coupling, but less
cohesion in its methods

which version is easiest to design, implement
and maintain?

background image

R. Pełka: Programming Languages

43

Good news for GUI developers

Even simple GUI seems to be very complicated to
develop in Java

Fortunetely, we have a number of IDEs
(

Integrated Development Environments

) to do it

using a mouse and „drag and pop” method

 Eclipse
 NetBeans (

Oracle

)

background image

R. Pełka: Programming Languages

44

NetBeans

background image

R. Pełka: Programming Languages

45

Summary

 Graphical User Interface

 Idea and properties
 Containers
 Components
 events

 Tools for GUI design

 AWT – Application Windowing Toolkit
 Swing – new Java GUI classes
 SWT (Standard Widget Toolkit - Eclipse)

 Simple GUI design


Document Outline


Wyszukiwarka

Podobne podstrony:
Lecture 9 Graphical User Interface
(eBook) MatLab 7 Creating Graphical User Interfaces Q3G75XKESYH7ITRH7DEMLBB5TCOT55MEKC7G6QI
W8 2 Graphical User Interface
Designing A Graphic User Interface
2010 5 Graphical User Interface GUI wxPython
Usability Testing And Roi For User Interface Design
Workshop #5 Programmatic Control Of User Interface
(eBook PDF GUI) Design Patterns as Tools for User Interface Design
Visual Scil User Interface Design
elm327 interface viecar obd2 bluetooth scanner user manual
Lecture 13 Graphics in C
MATLAB C C++ Graphics Library User's Guide MATHWORKS AEZNJYSGYKZ2FEDI5R7HIXME4EAEX7V7LYL4CWA
elm327 interface viecar obd2 bluetooth scanner user manual
IR Lecture1
uml LECTURE

więcej podobnych podstron