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!”); } } 1 ÿ 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 2 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); } } 3 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 ÿ 4 Java Foundation Classes ÿ Provides Graphics and GUI capability for Java applications ÿ See: Java Foundation Classes In a Nutshell, by David Flanagan l 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 5 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 } 6 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: l l 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 7 // 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); } } 8 Improving the dialog ÿ This was the simplest method for creating a message dialog ÿ But we can: l l 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 9 Message dialog types ÿ JOptionPane.ERROR_MESSAGE l Indicates an error to the application user ÿ JOptionPane.INFORMATION_MESSAGE l Displays an informational message - the user simply dismisses the dialog when ready ÿ JOptionPane.WARNING_MESSAGE l Warns the user of a potential problem Message dialog types ÿ JOptionPane.QUESTION_MESSAGE l Poses a question - normally requires a Yes/No response from the user ÿ JOptionPane.PLAIN_MESSAGE l Dialog that simply contains a message with no icon 10 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; } } 11 More robust Classes ÿ Declare l Protected fields can be accessed by subclasses or members of the same package ÿ Declare l 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; } 12 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 } 13 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” } ÿ 14 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); } } } 15 16 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 l E.g. 7 figures after the decimal place ÿ This looks messy and the precision is normally meaningless 17 18 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 } 19 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 20 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); } ÿ 21 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 + "]"); } } 22 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 23 Adding properties to Points Point x y Location setLocation toString Circle radius plus Extension area circumference 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"; } } 24 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 ... } 25