CSM-15 Lecture 12

Download Report

Transcript CSM-15 Lecture 12

Component-Based
Software Engineering
Java with added Swing
Paul J Krause
// file: Welcome.java
public class Welcome {
public static void main(String[ ] args) {
System.out.println(“Welcome to JavaWorld!”);
}
}
 javac
Welcome.java
 java Welcome
Welcome to JavaWorld!
// file: Welcome.java
// Always introduce the class
public class Welcome {
// Class name must match file name for public classes
public static void main(String[ ] args) {
// So, “args” is an array of Strings.
// “void” means no value is returned
System.out.println(“Welcome to JavaWorld!”);
// System is a class that interfaces to system facilities
// “out” is the standard output stream of System
String Handling is Simple
System.out.println(“Welcome to JavaWorld\n” +
“\tObject-Oriented Programming\n” +
“\tPLUS\n” +
“\tConnectivity!”);

Java Welcome
Welcome to JavaWorld
Object-Oriented Programming
PLUS
Connectivity!
A Java Class
// Rectangle.java
// A straightforward implementation of the Java Rectangle class
Rectangle
public class Rectangle
{
public double length;
public double
height;
length
height
public Rectangle(double length, double height) {
this.length = length;
area = height;
this.height
}
circumference
public double area( ) { return length*height; }
public double circumference( ) { return 2*(length+height); }
}
public class MakeRectangle {
public static void main(String[ ] args) {
double length = Double.parseDouble(args[0]);
// parse first argument to double
double height = Double.parseDouble(args[1]);
// parse second argument to double
Rectangle rectangle = new Rectangle(length,
height);
double area = rectangle.area(); // calculate area
System.out.println(area); // display it to the user
}
}
 javac
Rectangle.java
 javac MakeRectangle.java
 java MakeRectangle 3.0 2.0
6.0

Java Foundation Classes
 Provides
Graphics and GUI capability for
Java applications
 See: Java Foundation Classes In a
Nutshell, by David Flanagan

Provides a reference, but its not good as an
introduction
Data Entry with Swing
import javax.swing.*;
public class MakeRectangle {
public static void main(String[] args) {
String input =
JOptionPane.showInputDialog("Enter length");
A Class in Swing that can be
used to display simple dialog
boxes to the user
A method in JOptionPane
that displays a simple
data entry dialog
Modified MakeRectangle
import javax.swing.*;
public class MakeRectangle {
public static void main(String[ ] args) {
String input = JOptionPane.showInputDialog("Enter length");
double length = Double.parseDouble(input);
input = JOptionPane.showInputDialog("Enter height");
double height = Double.parseDouble(input);
Rectangle rectangle = new Rectangle(length, height);
double area = rectangle.area();
System.out.println(area);
}
// This will turn out to be an unsatisfactory termination
}
GUI application termination
import javax.swing.*;
public class MakeRectangle {
public static void main(String[ ] args) {
String input = JOptionPane.showInputDialog("Enter length");
double length = Double.parseDouble(input);
...
Rectangle rectangle = new Rectangle(length, height);
double area = rectangle.area();
System.out.println(area);
System.exit(0); // terminates the program - this is required
// for any program using a GUI
}
}
Prettier Output
 Swing
to the rescue again!
 Need to display a different kind of dialog:


present a message
no field for the user to edit
 Use
JOptionPane again:
JOptionPane.showMessageDialog(null, "The area is " + area);
Parent component if
relevant (“null” here)
The message to be displayed
Note use of “+” to
concatenate strings
// MakeRectangle.java
// Application with “complete” GUI
import javax.swing.*;
public class MakeRectangle {
public static void main(String[ ] args) {
String input = JOptionPane.showInputDialog("Enter length");
double length = Double.parseDouble(input);
input = JOptionPane.showInputDialog("Enter height");
double height = Double.parseDouble(input);
Rectangle rectangle = new Rectangle(length, height);
double area = rectangle.area();
JOptionPane.showMessageDialog(null, "The area is " + area);
System.exit(0);
}
}
Improving the dialog
 This
was the simplest method for creating
a message dialog
 But we can:


alter the icon
specify the title bar string
The message
JOptionPane.showMessageDialog(
null, "The area is " + area,
"Result", JOptionPane.PLAIN_MESSAGE);
Title bar string
Icon type
Message dialog types
 JOptionPane.ERROR_MESSAGE

Indicates an error to the application user
 JOptionPane.INFORMATION_MESSAGE

Displays an informational message - the user
simply dismisses the dialog when ready
 JOptionPane.WARNING_MESSAGE

Warns the user of a potential problem
Message dialog types
 JOptionPane.QUESTION_MESSAGE

Poses a question - normally requires a
Yes/No response from the user
 JOptionPane.PLAIN_MESSAGE

Dialog that simply contains a message with
no icon
public class Circle {
protected double radius;
protected void checkRadius(double radius) {
if (radius < 0.0) {
JOptionPane.showMessageDialog(null,
"Radius must not be negative",
"Illegal argument", JOptionPane.ERROR_MESSAGE);
System.exit(-1);
}
}
public Circle(double radius) {
checkRadius(radius);
this.radius = radius;
}
public double area() {return PI*radius*radius; }
public double circumference() {return 2*PI*radius; }
}
More robust Classes
 Declare

Protected fields can be accessed by
subclasses or members of the same package
 Declare

fields as Private or Protected
public “get” and “set” methods
with appropriate checks on the “set” methods
 E.g.
public void setRadius(double radius) {
checkRadius(radius);
this.radius = radius; }
public class Circle {
public static final double PI = 3.14159; // a constant
protected double radius;
protected void checkRadius(double radius) {
if (radius < 0.0) {
throw new IllegalArgumentException("radius must not be negative"); }
}
public Circle(double radius) {
checkRadius(radius);
this.radius = radius;
}
public double getRadius() {return radius;}
public void setRadius(double radius) {
checkRadius(radius);
this.radius = radius;
}
public double area() {return PI*radius*radius; }
public double circumference() {return 2*PI*radius; }
}
Catching Exceptions

Use the following construction:
try {
// code that may throw exceptions
}
catch (AnException e1) {
// Code to handle this kind of exception
}
finally {
// Code that will always execute
}
Trying to succeed
try {
// Normally this block of code will be
// executed successfully.
// However, if an exception is thrown
// execution will stop and the interpreter
// will attempt to find an appropriate
// “catch” statement.
}
Catching Exceptions
There may be several “catch” blocks for different
kinds of exceptions
catch (AnException e1) {
// This block will be invoked if an
// AnException kind of exception is
// thrown, or a sub-type of AnException.
// The block can refer to the exception
// object by its name “e1”
}

And Finally
finally {
// This block contains code that will
// always be run
// - even if control leaves the “try” block
// because of a return, continue or
// break statement.
// It will , however, be skipped if there is a
// System.exit( ) clause in the “try” block
public class MakeCircle {
public static void main(String[ ] args) {
// details of input omitted
try {
Circle circle = new Circle(radius);
double area = circle.area( );
JOptionPane.showMessageDialog(
null, "The area equals " + area,
"Not a lot of people know that", JOptionPane.PLAIN_MESSAGE) ;
}
catch(IllegalArgumentException e1) {
JOptionPane.showMessageDialog(null, "Radius must not be negative",
"Illegal argument", JOptionPane.ERROR_MESSAGE) ;
}
finally {
System.exit(0);
}
}
}
Some kinds-of Exception
Exception
ClassNotFoundException
IllegalAccessException
RuntimeException
ArithmeticException
ArrayStoreException
Illegal ArgumentException
…
A little bit of formatting
 With
double precision numbers you may
find you get outputs with an unrealistic
degree of precision

E.g. 7 figures after the decimal place
 This
looks messy and the precision is
normally meaningless
The java.text Package
 As
an example, we will use the
DecimalFormat class from this package
 Create an instance of DecimalFormat with
the required format pattern
 Invoke the “format” method of this instance
to create a formatted string representation
import javax.swing.*;
import java.text.DecimalFormat;
One or more digits in front of the decimal point
public class MakeCircle {
public static void main(String[ Only
] args)two
{ digits behind the decimal point
String input = JOptionPane.showInputDialog("Enter radius");
double radius = Double.parseDouble(input);
DecimalFormat twoDigits = new DecimalFormat( "0.00");
try {
Circle circle = new Circle(radius);
double area = circle.area();
JOptionPane.showMessageDialog(
null, "The area equals " + twoDigits.format( area ),
"Not a lot of people know that", JOptionPane.PLAIN_MESSAGE);
} // Rest of code omitted
}
Informing Exceptions
 Remember
that in the “main” method of
MakeCircle, we explicitly included the error
message:
catch(IllegalArgumentException e1) {
JOptionPane.showMessageDialog(null, "Radius must not be negative",
"Illegal argument", JOptionPane.ERROR_MESSAGE) ;
}
 Should
not do this - there may be several
different arguments that could throw the
same exception type
Inside Circle.java
protected void checkRadius(double radius) {
if (radius < 0.0) {
throw new IllegalArgumentException("radius must not be
negative");
}
}
 Inside MakeCircle.java
catch(IllegalArgumentException e1) {
JOptionPane.showMessageDialog(null, e1.toString(),
"Illegal argument", JOptionPane.ERROR_MESSAGE);
}

toString methods
 Useful
to define these for key classes
 Provides an easy way of summarising the
state of an instance of a class
 Can by very useful for debugging
public class Point {
// The notes show this class with more extensive commenting
protected double x, y;
// Coordinates of the point accessible to subclasses
public Point(double x, double y) { setPoint( x, y ); }
// method sets the location of a point
public void setPoint(double xCoordinate, double yCoordinate) {
x = xCoordinate;
y = yCoordinate;
}
// conversion of a Point object to a string representation
public String toString( ) {
return("[" + x + ", " + y + "]");
}
}
import javax.swing.*;
public class MakePoint {
public static void main(String[ ] args) {
String input;
input = JOptionPane.showInputDialog("Enter x Coordinate");
double x = Double.parseDouble(input);
input = JOptionPane.showInputDialog("Enter y Coordinate");
double y = Double.parseDouble(input);
try {
Point point = new Point( x, y);
JOptionPane.showMessageDialog(
null, "New point created: " + point.toString( ),
"Pointed Message", JOptionPane.PLAIN_MESSAGE);
} // rest of class definition omitted
Adding properties to Points
Point
x
y
Location
setLocation
toString
Circle
radius
area
circumference
plus Extension
public class Circle extends Point {
public static final double PI = 3.14159; // a constant
protected double radius;
protected void checkRadius(double radius) { // details omitted }
public Circle(double x, double y, double radius) {
super(x, y);
checkRadius(radius);
this.radius = radius;
}
public String toString( ) {
// Override Point.toString to add info.
return "This is a Circle object with the following properties\n" +
"Location: " + super.toString() + "\n" +
"Radius = " + radius + "\n";
}
}
main method of MakeCircle
public void main(String[ ], args) {
// … details omitted
Circle circle = new Circle(x, y, radius);
JOptionPane.showMessageDialog(
null, circle.toString( ),
"Something New", JOptionPane.PLAIN_MESSAGE);
// and the rest ...
}