GUI programming Graphical user interface-based programming Chapter G1 (pages 289-314) 1
Download
Report
Transcript GUI programming Graphical user interface-based programming Chapter G1 (pages 289-314) 1
GUI programming
Graphical user interface-based programming
Chapter G1 (pages 289-314)
1
Windchill
Windchill
There are several formulas for
calculating the windchill temperature twc
The one provided by U.S. National
Weather Service and is applicable for a windspeed greater
than four miles per hour
twc 0.081(t 91.4)(3.71 v 5.81 0.25v) 91.4
Where
Variable t is the Fahrenheit temperature
Variable v is the windspeed in miles per hour
2
Console-based programming
Console program
Method main() {
statement 1;
statement 2;
...
statement m;
}
Console programs
begin and end in
method main()
3
In use
Program needs to respond whenever the run button is clicked
There
needs to
be an
event loop
that is
looking for
user
inteface
events
4
GUI-based programming
GUI program begins in method main().
On completion, the event dispatching loop is begun
GUI Program
main() {
GUI gui = new GUI();
}
GUI Constructor() {
constructor1;
constructor2;
...
constructorn;
}
Action Performer() {
action1;
action2;
...
actionk;
}
Event-dispatching loop
Constructor configures
the components of the GUI
do
if an event occurs
then signal its
action listeners
until program ends
The event-dispatching loop watches
for user interactions with the GUI
The action performer implements the task of the GUI. 5
An old prediction of the future…
7
Java support
JFrame
Represents a titled, bordered window
JLabel
Represents a display area suitable for one or both of a
single-line text or image.
JTextField
Represents an editable single-line text entry component
JButton
Represents a push button
JTextArea
Represents an editable multiline text entry component8
Instance variables
private JFrame window
References the window containing the other components
of the GUI
9
Instance variables
private JTextArea legendArea
References the text display for the multiline program
legend
10
Instance variables
private JLabel fahrTag
References the label for the data entry area supplying the
temperature
11
Instance variables
private JTextField fahrText
References the data area supplying the temperature
12
Instance variables
private JLabel windTag
References the label for the data entry area supplying the
windspeed
13
Instance variables
private JTextField windText
References the data area supplying the windspeed
14
Instance variables
private JLabel chillTag
References the label for the data area giving the windchill
15
Instance variables
private JTextField chillText
References the data area giving the windchill
16
Instance variables
private JButton runButton
References the “Run” button
17
Class constants
private static final String LEGEND = "This windchill calculator"
+ "is intended for velocities greater than 4 mph.“
Program legend text
18
Class constants
private static final int WINDOW_WIDTH = 350
Initial width of the GUI
19
Class constants
private static final int WINDOW_HEIGHT = 185
Initial height of the GUI
20
Class constants
private static final int AREA_WIDTH = 40
Width of the program legend in characters
21
Class constants
private static final int FIELD_WIDTH = 40
Number of characters per data entry area
22
Class constants
private static final FlowLayout LAYOUT_STYLE =
new FlowLaout()
References manager that lays out GUI components in a
top-to-bottom, left-to-right manner
23
Class constants
Our GUI without a layout manager
24
Class constants
Increased window width changes the layout
25
Program Windchill.java
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Windchill implements ActionListener {
// class constants
// instance variables with initialization
// Windchill(): default constructor
// actionPerformed(): run button action event handler
// main(): application entry point
}
26
How much will Christmas cost?
http://www.pncbank.com/12days
Flash animation (local)
27
Program Windchill.java – class constants
private static final int WINDOW_WIDTH = 350;
// pixels
private static final int WINDOW_HEIGHT = 185;
// pixels
private static final int FIELD_WIDTH = 20;
// characters
private static final int AREA_WIDTH = 40;
// characters
private static final FlowLayout LAYOUT_STYLE =
new FlowLayout();
private static final String LEGEND = "This windchill "
+ "calculator is intended for velocities greater than 4 mph.";
28
Program Windchill.java – instance variables
// window for GUI
private JFrame window =
new JFrame("Windchill Calculator");
// legend
private JTextArea legendArea = new JTextArea(LEGEND, 2,
AREA_WIDTH);
// user entry area for temperature
private JLabel fahrTag = new JLabel("Fahrenheit temperature");
private JTextField fahrText = new JTextField(FIELD_WIDTH);
29
Program Windchill.java – instance variables
// user entry area for windspeed
private JLabel windTag = new JLabel("
Windspeed (mph)");
private JTextField windText = new JTextField(FIELD_WIDTH);
// entry area for windchill result
private JLabel chillTag =
new JLabel(" Windchill temperature");
private JTextField chillText = new JTextField(FIELD_WIDTH);
// run button
private JButton runButton = new JButton("Run");
30
Program Windchill.java – constructor
public Windchill() {
// configure GUI
// register event listener
// add components to container
// display GUI
}
31
Program Windchill.java – constructor
public Windchill() {
// configure GUI
window.setSize(WINDOW_WIDTH, WINDOW_HEIGHT);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
legendArea.setEditable(false);
...
32
Bad line wrapping
It is important to
make program
legends
uneditable
33
Program Windchill.java – constructor
public Windchill() {
// configure GUI
window.setSize(WINDOW_WIDTH, WINDOW_HEIGHT);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
legendArea.setEditable(false);
legendArea.setLineWrap(true);
legendArea.setWrapStyleWord(true);
...
34
Dangers of an editable legend
Line wrapping in
the middle of a
word
35
Program Windchill.java – constructor
public Windchill() {
// configure GUI
window.setSize(WINDOW_WIDTH, WINDOW_HEIGHT);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
legendArea.setEditable(false);
legendArea.setLineWrap(true);
legendArea.setWrapStyleWord(true);
legendArea.setBackground(window.getBackground());
chillText.setEditable(false);
chillText.setBackground(Color.WHITE);
36
Bad line wrapping
A JLabel is
noneditable
by the user
By default the text field
of a JTextField is
editable by the user
37
Program Windchill.java – constructor
public Windchill() {
// configure GUI …
// register event listener
runButton.addActionListener(this);
38
Run button action-event handling
An ActionListener has an
actionPerformer() method that
handles the class-specific activity
Action events are
sent to registered
action listeners
GUI : Action Listener
actionPerformer() Method
Action
Event
When the run button is
clicked, it dispatches an
action event
Get data entries from temperature
and windspeed data areas
Compute windchill according to the
Weather Service formula
Display result to windchill data
area
39
Program Windchill.java – constructor
public Windchill() {
// configure GUI …
// register event listener …
// add components to container
Container c = window.getContentPane();
c.setLayout(LAYOUT_STYLE);
c.add(legendArea);
c.add(fahrTag);
c.add(fahrText);
c.add(windTag);
c.add(windText);
c.add(chillTag);
c.add(chillText);
c.add(runButton);
40
Program Windchill.java – constructor
public Windchill() {
// configure GUI …
// register event listener …
// add components to container …
// make GUI visible
window.setVisible(true);
41
Laying out the GUI components
Top to
bottom,
left to right
42
Program Windchill.java – action performer
public void actionPerformed(ActionEvent e) {
// get user’s responses
// compute windchill
// display windchill
}
44
Program Windchill.java – action performer
public void actionPerformed(ActionEvent e) {
// get user’s responses
String response1 = fahrText.getText();
double t = Double.parseDouble(response1);
String response2 = windText.getText();
double v = Double.parseDouble(response2);
// compute windchill
// display windchill
}
45
Program Windchill.java – action performer
46
Program Windchill.java – action performer
public void actionPerformed(ActionEvent e) {
// get user’s responses
String response1 = fahrText.getText();
double t = Double.parseDouble(response1);
String response2 = windText.getText();
double v = Double.parseDouble(response2);
// compute windchill
double windchillTemperature = 0.081 * (t - 91.4)
* (3.71*Math.sqrt(v) + 5.81 - 0.25*v) + 91.4;
int perceivedTemperature =
(int) Math.round(windchillTemperature);
// display windchill
}
47
Today’s demotivators
48
Program Windchill.java – action performer
public void actionPerformed(ActionEvent e) {
// get user’s responses
String response1 = fahrText.getText();
double t = Double.parseDouble(response1);
String response2 = windText.getText();
double v = Double.parseDouble(response2);
// compute windchill
double windchillTemperature = 0.081 * (t - 91.4)
* (3.71*Math.sqrt(v) + 5.81 - 0.25*v) + 91.4;
int perceivedTemperature =
(int) Math.round(windchillTemperature);
// display windchill
String output = String.valueOf(perceivedTemperature);
49
chillText.setText(output);
}
Program Windchill.java – action performer
50
Method main()
public static void main(String[] args) {
Windchill gui = new Windchill();
}
51
Another method main()
public static void main(String[] args) {
Windchill gui1 = new Windchill();
Windchill gui2 = new Windchill();
}
52
Text version of WindChill.java
public class WindChill {
public static void main (String args[]) {
Scanner stdin = new Scanner(System.in);
System.out.println ("Enter temperature in fahrenheit degrees");
double t = stdin.nextDouble();
System.out.println ("Enter wind speed in miles per hour");
double v = stdin.nextDouble();
double windtemp = 0.081 * (t - 91.4) * (3.71*Math.sqrt(v) + 5.81
- 0.25*v) + 91.4;
System.out.println ("The windchill temperature is " +
windtemp);
}
}
Obviously should include legend, comments, etc.
54
Applets
Java program run within a browser
Implies an applet is run from a web page
Applets may not access or modify the file system running the
applet
A modern applet has JApplet as its superclass
JApplet is part of the swing package
An applet does use JFrame
A JApplet has a content pane
55
Applets
Important inherited methods
init()
Run when browser loads applet
start()
Run by browser to start applet execution
stop()
Run by browser to stop its execution
destroy()
Run by browser immediately before it its ended
paint(Graphics g)
Run by browser to refresh its GUI
By default the inherited methods do nothing
56
A simple applet
import java.awt.*;
import javax.swing.*;
public class DisplayQuote extends JApplet {
public void paint(Graphics g) {
g.drawString("Anyone who spends their life on a "
+ " computer is pretty unusual.", 20, 30);
g.drawString("Bill Gates, Chairman of Microsoft",
25, 45);
}
}
57
Web page – quote.htm
<html>
<title> Windchill </title>
<applet code="DisplayQuote.class" width=400 height=300>
</applet>
</html>
58