JAVA 1 Introduction to Java 2 History Developed by James Gosling at Sun Microsystems. Introduced in 1995. Is one the fastest growing programming technologies of all time. 3 Features • Simple • Object Oriented • Architecture neutral • High performance • Multithreaded • Robust • Distributed • Portable • Dynamic • Secure 4 The Byte Codes In the Java programming language, all source code is first written in plain text files ending with the .java extension. Those source files are then compiled into .class files by the Java compiler (javac). A .class file does not contain code that is native to your processor; it instead contains bytecodes-- the machine language of the Java Virtual Machine. The Java launcher tool (java) then runs your application with an instance of the Java Virtual Machine. 5 Bytecode It is a highly optimized set of instructions designed to be executed by the Java run-time system,known as JVM. 6 7 Platform Independence 8 9 Creating Your First Application Create a source file. A source file contains text, written in the Java programming languageYou can use any text editor to create and edit source files. 10 Compile the source file into a .class file. The Java compiler, javac, takes your source file and translates its text into instructions that the Java Virtual Machine can understand. The instructions contained within this file are known as bytecodes. 11 Run the program. The Java launcher (java) uses the Java Virtual Machine to run your application. 12 Create a Source File /** * The HelloWorldApp class implements an application that * simply displays "Hello World!" to the standard output. */ class HelloWorldApp { public static void main(String[] args) { //Display "Hello World!" System.out.println("Hello World!"); } } 13 Compile the Source File C:\java\javac HelloWorldApp.java Run the Program In the same directory, enter at the prompt: C:\java\java HelloWorldApp 14 Example Explained… class HelloWorldApp { …} About the class It is the basic building block of an objectoriented language such as Java It is a template that describes the data and behavior associated with instances of that class 15 When you instantiate a class you create an object that looks and feels like other instances of the same class. The data associated with a class or object is stored in variables; the behavior associated with a class or object is implemented with methods. Methods are similar to the functions or procedures in procedural languages such as C. 16 The main Method In the Java programming language, every application must contain a main method whose signature looks like this: public static void main(String[] args) {..} 17 The method signature for the main method contains three modifiers: public indicates that the main method can be invoked by any object. static indicates that the main method is a class method (as opposed to an instance method). void indicates that the main method doesn't return any value. 18 2. Data Types,Variables and Arrays 19 Data type A data type is a scheme for representing values. An example is int which is the integer, a data type. Values are not just numbers, but any kind of data that a computer can process. The data type defines the kind of data that is represented by a variable. As with the keyword class, Java data types are case sensitive. 20 Primitive Java Data Types 21 Objects All data in Java falls into one of two categories: primitive data and objects. There are only eight primitive datatypes. Any data type you create will be an object. An object is a structured block of data. An object may use many bytes of memory. The data type of an object is its class. Many classes are already defined in the Java Development Kit. A programmer can create new classes to meet the particular needs of a program. 22 Integers:byte,short,int and long Floating point numbers:float,double Characters:char Boolean:boolean 23 Data Type Size (bytes) (byte) byte 1 128 to 127 boolean 1 true or false char 2(unicode) A-Z, a-z, 0-9, etc short 2 -32768 to 32767 int 4 (about )–2 million to 2 million long 8 (about)-10E18 to 10E18 float 4 -3.4E38 to 3.4E18 double 8 -1.7E308 to 1.7E308 Range 24 Integers All of these are signed,positive and negative values. byte.The smallest integer type is byte. It is signed 8 bit type Useful when working with a stream of data from a network or file. Declared using byte keyword. Eg: byte b,c; 25 short short is a signed 16 bit Least used Java type. short s; short t; 26 int Commonly used integer type is int Signed 32 bit Eg: int rollnum; 27 long Signed 64 bit type. Useful in situations where an int type is not large enough to hold the desired value. The range of a long is quite large. Eg:long days,seconds,distance 28 Floating-point Types Also known as real numbers Used when evaluating expressions that require fractional precision. 29 float The type float specifies a singleprecision value that uses 32 bits of storage Declaration Eg: Float hightemp,lowtemp; 30 double Denoted by doublekeyword Uses 32 bits of storage Specifies double precision . Eg: double pi,r,a; 31 Characters In Java the data type used to store characters is char. Java uses unicode to represent characters.(Unicode defines fully international character set that can represent all of the characters found in all human languages.) It requires 16 bits 32 Booleans Java has a primitive type called boolean, for logical values It can have only one of two possible values,true or false. 33 Literals Integer literals Floating-point literals Boolean literals Character literals String literals 34 Variables Basic unit of storage in a Java program It is defined by a combination of an identifier,type and an optional initializer. All variables have a scope,which defines their visible 35 Declaring a variable All variables must be before they can be used. Synatx: type identifier [=value1][,identifier]; Identifier is the name of the variable 36 Names of Variables Use only the characters 'a' through 'z', 'A' through 'Z', '0'through '9', character '_', and character '$'. A name cannot contain the space character. Do not start with a digit. A name can be of any reasonable length. Upper and lower case count as different characters. i.e.,Java is case sensitive. So SUM and Sum are different names. A name cannot be a reserved word keyword). A name must not already be in use in this block of the program. 37 Assignment Statements variables are expected to vary by having new values placed into them as the program runs. An assignment statement is one way to change the value of a variable. 38 Assignment Statements public class example { public static void main ( String[] args ) { int states; // a declaration of a variable states = 50; // an assignment statement System.out.println(“The variable states contains: ” + states); } } 39 Assignment Statement Syntax Assignment statements look like this: variableName = expression; The equal sign "=" means "assignment." variableName is the name of a variable that has been declared somewhere in the program. expression is an expression that has a value. An assignment statement asks for the computer to performtwo steps, in order: 1. Evaluate the expression (that is: calculate a value.) 2. Store the value in the variable. 40 Expressions An expression is a combination of literals, operators, variables, and parentheses used to calculate a value. E.g. 49-x/y literal: characters that denote a value, like: 3.456 operator: a symbol like plus ("+") or times ("*"). variable: a section of memory containing a value. parentheses: "(" and ")". 41 Scope and life a variable A block defines a scope. A scope determines what objects are visible to other parts of the program. It also determines the lifetime of those objects. 42 Type conversion and Casting Java’s Automatic Conversions When one type of data is assigned to another type of variable ,an automatic type conversion will take place if: The two types are compatible The destination type is larger than the source type ( This type of conversion is known as widening conversion ) . 43 Casting Incompatible Types When the destination type is larger than the source type automatic conversion fails. So it should be cast. A cast is simply an explicit type conversion 44 The general form : (target-type)value; Eg: int a; byte b; b=(byte) a; 45 Arrays An array is a group of like-typed variables that are referred to by a common name Arrays of any type can be created and may have one or more dimension. A specific element in an array is accessed by its index. 46 One Dimensional Arrays It is a list of like-typed variables. To create an array ,an array variable of desired type should be created. General Form: Type var-name[]; Eg:int month_days[]; 47 All though month_day is an array variable, no array actually exists. Its value will be set to null,which represents an array with no value. It should be linked to actual physical array of integers using new new is a special operator that allocates memory. 48 So it should be array–var=new type[size]; i.e.., obtaining array is a two step process. First: a variable of the desired array type must be declared. Second: The memory that will hold the array should be allocated using new and assign it to the variable. 49 Multidimensional Arrays Eg: int twoD [][] =new int [4][5] 50 Operators 1. Arithmetic Operators 2. Increment Operators 3. Relational Operators 4. Logical Operators 5. Assignment Operators 6.Conditional Operators 51 Comments A comment is a note written to a human reader of a program. The program compiles and runs exactly the same with or without comments. Comments start with the two characters "//" (slash slash). Those characters and everything that follows them on the same line are ignored by the java compiler. 52 Comments Another style: /*..*/ or /**….*/ With this style of comment, everything between the two characters "/*" and the two characters "*/" are ignored by the compiler. There can be many lines of comments between the "/*" and the "*/". 53 Command Line Arguments A command-line argument is the information that directly follows the program’s name on the commandline when it is executed. To access the command-line arguments inside a Java program is quite easy—they are stored as strings in the String array passed to main( ). 54 Command Line Arguments A Java application can accept any number of arguments from the command line. The user enters command-line arguments when invoking the application and specifies them after the name of the class to be run 55 Program1 // Display all command-line arguments. class CommandLine { public static void main(String args[]) { for(int i=0; i<args.length; i++) System.out.println("args[" + i + "]: " + args[i]);} } 56 Output java CommandLine this is a test 100 -1 When you do, you will see the following output: args[0]: this args[1]: is args[2]: a args[3]: test args[4]: 100 args[5]: -1 57 Parsing Numeric Command-Line Arguments If an application needs to support a numeric command-line argument, it must convert a String argument that represents a number, such as "34", to a numeric value. int firstArg; if (args.length > 0) { firstArg = Integer.parseInt(args[0]); } 58 Program 2 public class arg { public static void main (String[] args) { int num = args.length; System.out.println(num); } } 59 Program 3 class args { public static void main(String [] arg) { int a =Integer.parseInt(arg[0]); System.out.println("The limit u entered is "+a); int i,f=1; for(i=1;i<=a;i++) {f=f*i;} System.out.println("The factorial is : "+f); } } 60 3.Control Statements 61 Selection Statements Supports two selection statements: if and switch These allow us to control the flow of the program’s execution based upon conditions known only at run time. 62 if Conditional branch statement. General Form If (condition) statement1; else statement2; 63 Nested ifs If (i==0) { if (j<20) a=b; if(k>100) c=d; else a=c; } else a=d; 64 The if-else-if ladder if (condition1) statement1; else if(condition2) statement2; else if(condition3) statement3; ..... else statement; eg:IfElse.java 65 switch Java’s multiway branch statement. Better than large series of if-else-if statements. 66 switch : General form switch(expression){ case value1: //statement sequence break; Case value2: //statement sequence break; … Case valueN: //statement sequence break; default: //statement sequence 67 switch Expression must be of type byte,short,int,char; Each of the value specified in the case statements must be of a type compatible with the expression. Duplicate case values are not allowed. Eg:SampleSwitch.java 68 switch The value of the expression is compared with each of the literal values in the case statements. If a match is found the code sequence following that case statement is executed. If none of the constants matches the value of the expression,then the default statement is executed. 69 switch Default statement is optional. The break statement is used inside the switch to terminate a statement sequence. If no break statement is given execution will continue on into the case. 70 Nested switch statements switch may be used as a part of the statement sequence of an outer switch. 71 More on switch…. switch can only test for equality While if can evaluate any type of Boolean expression. No two case constants in the same switch can have identical values. A switch statement is usually more efficient than a set of nested ifs. 72 Iteration Statements: Meant for executing selected instructions repeatedly until a terminating condition is met. while ,do-while ,for 73 while Most fundamental loop statement The body of the loop will be executed as long as the conditional expression is true. When the condition becomes false control passes to the next line of code immediately following the loop. 74 while true Continue condition ? false true Statement(s) Next statement 75 while : While (condition) { // body of the loop } 76 While : Order of Execution (1) while (< Cond. Expr. (2) True (4) < Statement >) (3) > False 77 Three things There are three things to consider when your program has a loop: 1.The initial values must be set up correctly. 2.The condition in the while statement must be correct. 3.The change in variable(s) must be done correctly. 78 While : program1 class while1 { public static void main(String args[]) { int i=0; int a =Integer.parseInt(args[0]); while(i<a) { System.out.println("hi"); i++; } } } 79 while: while loop evaluates its conditional expression at the top of the loop,so the body of the loop will not execute even once if the condition is false . Hence it is an entry-controlled loop. 80 do-while Conditional expression is evaluated at the bottom of the loop. Always executes its body at least once. Hence an exit controlled loop 81 do-while Statement(s) true Continue condition ? false Next statement 82 do-while :General Form do { //body of the loop }while(condition); Condition must be a boolean expression. 83 do-while: program1 class dowhile { public static void main(String args[]) { int i=5; int a =Integer.parseInt(args[0]); do { System.out.println("hi"); i++; } while(i<a); } } 84 for for(initialization;condition;iteration) { //loop body } 85 for 1 for 2 ( < expr 1> ;< expr 2 > ; < expr 3 ) > 3 6 True 4 < Statement > False 86 for Evaluate Control-variable Expression expression Adjustment expression Continue condition? false true Statement(s) (loop-body) Next Statement 87 for i = 0; i=++ i < 100 ? System.out.println (“Welcome to Java!”); Next statement 88 for: program 1 class for1 { public static void main(String args[]) int a =Integer.parseInt(args[0]); for(int i=0;i<5;i++) { System.out.println("hi"); } } } { 89 Declaring Variables in a for Statement You can declare one or more variables within the initialization portion of a for statement A variable so declared will be local to the for loop, and cannot be used outside of the loop If you need to use such a variable outside of a loop, then declare it outside the loop 90 for loop: variations Infinite Loop using for statement for ( ; ; ) <statement> Nested for statement Multi dimensional array for (i=0; i<N; ++i) for (j=0; j<M; ++j) matrix[i][j] = 0; 91 Jump Statements The Java programming language supports the following jumping statements: The break statement The continue statement The return statement 92 The break Statement Continue condition? false true Statement(s) break Statement(s) Next Statement 93 Branch Statement - break Statement Label break statement Can be used instead of goto statement Form of usage labelName : Rep. St. 1 { Rep. St. 2 { // . . . break; // . . . break labelName; } // . . . } 94 Branch Statement - break Statement To move control to the out of the block From of break statement break int i = 1;[label] ; while (true) { if (i == 3) break; System.out.println("This is a " + i + " iteration"); ++i; } 95 The continue Statement Continue condition? false true Statement(s) continue Statement(s) Next Statement 96 Branch Statement – continue Statement To move control to the start of next repetition Form of continue statement: continue [Label] ; When used in for statement for (i=0; i<=5; ++i) { if (i % 2 == 0) continue; System.out.println("This is a " + i + " iteration"); } 97 Branch Statement – continue Statement When used in while statement i = 0; while (i <= 5) { ++i; if (i % 2) == 0) continue; System.out.println("This is a odd iteration - " + i); } 98 Branch Statement – continue Statement Label continue statement labelName: Rep. St. 1 { Rep. St. 2 { // ... continue; // ... continue labelName; } } 99 4. Introducing Classes 100 The General Form of a Class class classname { type instance-variable1; type instance-variable2; // ... type instance-variableN; type methodname1(parameter-list) { // body of method } type methodname2(parameter-list) {// body of method } // ... type methodnameN(parameter-list) {// body of method } } 101 A Class Is a Type A class is a special kind of programmerdefined type, and variables can be declared of a class type A value of a class type is called an object or an instance of the class A class determines the types of data that an object can contain, as well as the actions it can perform 102 Primitive Type Values vs. Class Type Values A primitive type value is a single piece of data A class type value or object can have multiple pieces of data, as well as actions called methods 103 The Contents of a Class Definition A class definition specifies the data items and methods that all of its objects will have These data items and methods are sometimes called members of the object Data items are called fields or instance variables Instance variable declarations and method definitions can be placed in any order within the class definition 104 The new Operator An object of a class is named or declared by a variable of the class type: ClassName classVar; The new operator must then be used to create the object and associate it with its variable name: classVar = new ClassName(); These can be combined as follows: ClassName classVar = new ClassName(); 105 Declaring Objects Obtaining objects of a class is a two-step process. First, you must declare a variable of the class type. This variable does not define an object. Instead, it is simply a variable that can refer to an object. Second,you must acquire an actual, physical copy of the object and assign it to that variable. 106 Declaring Objects It is done using the new operator. The new operator dynamically allocates (that is, allocates at run time) memory for an object and returns a reference to it. This reference is, more or less, the address in memory of the object allocated by new. This reference is then stored in the variable. 107 Declaring Objects Box mybox = new Box(); This statement combines the two steps just described. It can be rewritten as: Box mybox; // declare reference to object mybox = new Box(); // allocate a Box object 108 Assigning Object Reference Variables Box b1 = new Box(); Box b2 = b1; 109 Introducing Methods This is the general form of a method: type name(parameter-list) { // body of method } 110 Instance Variables and Methods Instance variables can be defined as in the following two examples Note the public modifier: public String instanceVar1; public int instanceVar2; In order to refer to a particular instance variable, preface it with its object name as follows: objectName.instanceVar1 objectName.instanceVar2 111 Instance Variables and Methods Method definitions are divided into two parts: a heading and a method body: public void myMethod() Heading { code to perform some action Body and/or compute a value } Methods are invoked using the name of the calling object and the method name as follows: classVar.myMethod(); Invoking a method is equivalent to executing the method body 112 File Names and Locations Reminder: a Java file must be given the same name as the class it contains with an added .java at the end For example, a class named MyClass must be in a file named MyClass.java 113 Returning a Value The type of data returned by a method must be compatible with the return type specified by the method. For example, if the return type of some method is boolean, you could not return an integer. The variable receiving the value returned by a method must also be compatible with the return type specified for the method. 114 Adding a Method That Takes Parameters Parameters allow a method to be generalized. That is, a parameterized method can operate on a variety of data. 115 Methods That Return a Boolean Value An invocation of a method that returns a value of type boolean returns either true or false Therefore, it is common practice to use an invocation of such a method to control statements and loops where a Boolean expression is expected if-else statements, while loops, etc. 116 Methods with parameters An empty set of parentheses in the method heading indicates that methods have no parameters. Some methods need to receive additional data via a list of parameters in order to perform their work These parameters are also called formal parameters 117 Parameters of a Primitive Type When a method is invoked, the appropriate values must be passed to the method in the form of arguments Arguments are also called actual parameters The number and order of the arguments must exactly match that of the parameter list The type of each argument must be compatible with the type of the corresponding parameter int a=1,b=2,c=3; double result = myMethod(a,b,c); 118 Parameters of a Primitive Type In the preceding example, the value of each argument (not the variable name) is plugged into the corresponding method parameter This method of plugging in arguments for formal parameters is known as the call-by- value mechanism 119 Parameters of a Primitive Type If argument and parameter types do not match exactly, Java will attempt to make an automatic type conversion A primitive argument can be automatically type cast from any of the following types, to any of the types that appear to its right: byteshortintlongfloatdouble char 120 Parameters of a Primitive Type A parameters is often thought of as a blank or placeholder that is filled in by the value of its corresponding argument However, a parameter is more than that: it is actually a local variable when a method is invoked, the value of its argument is computed, and the corresponding parameter (i.e., local variable) is initialized to this value Even if the value of a formal parameter is changed within a method (i.e., it is used as a local variable) the value of the argument cannot be changed 121 Pitfall: Use of the Terms "Parameter" and "Argument" Do not be surprised to find that people often use the terms parameter and argument interchangeably When you see these terms, you may have to determine their exact meaning from context 122 main is a void Method A program in Java is just a class that has a main method When you give a command to run a Java program, the run-time system invokes the method main Note that main is a void method, as indicated by its heading: public static void main(String[] args) 123 Local Variables A variable declared within a method definition is called a local variable All variables declared in the main method are local variables All method parameters are local variables If two methods each have a local variable of the same name, they are still two entirely different variables 124 Global Variables Some programming languages include another kind of variable called a global variable The Java language does not have global variables 125 Final Variables Declaring a variable with the final keyword makes it impossible to reinitialize that variable once it has been initialized with an explicit value 126 Blocks A block is another name for a compound statement, that is, a set of Java statements enclosed in braces,{} A variable declared within a block is local to that block, and cannot be used outside the block Once a variable has been declared within a block, its name cannot be used for anything else within the same method definition 127 The this Parameter All instance variables are understood to have <the calling object>. in front of them If an explicit name for the calling object is needed, the keyword this can be used myInstanceVariable always means and is always interchangeable with this.myInstanceVariable 128 The this Parameter this must be used if a parameter or other local variable with the same name is used in the method Otherwise, all instances of the variable name will be interpreted as local int someVariable = this.someVariable local instance 129 The this Parameter The this parameter is a kind of hidden parameter Even though it does not appear on the parameter list of a method, it is still a parameter When a method is invoked, the calling object is automatically plugged in for this 130 Information Hiding and Encapsulation Information hiding is the practice of separating how to use a class from the details of its implementation Abstraction is another term used to express the concept of discarding details in order to avoid information overload 131 Information Hiding and Encapsulation Encapsulation means that the data and methods of a class are combined into a single unit (i.e., a class object), which hides the implementation details In Java, hiding details is done by marking them private 132 Access Modifiers Whereas a class can use just two of the four access control levels (default or public), members can use all four: public protected default private 133 Public Members When a method or variable member is declared public, it means all other classes,regardless of the package they belong to, can access the member (assuming the class itself is visible). 134 Private Members Members marked private can't be accessed by code in any class other than the class in which the private member was declared. A private member is invisible to any code outside the member's own class. 135 Protected and Default Members The protected and default access control levels are almost identical, but with onecritical difference. A default member may be accessed only if the class accessing the member belongs to the same package, whereas a protected member can be accessed (through inheritance) by a subclass even if the subclass is in a different package. 136 public and private Modifiers It is considered good programming practice to make all instance variables private Most methods are public, and thus provide controlled access to the object 137 Final Methods The final keyword prevents a method from being overridden in a subclass. 138 Final Arguments Method arguments are the variable declarations that appear in between the parentheses in a method declaration. A final argument must keep the same value that the parameter had when it was passed into the method. 139 Abstract Methods An abstract method is a method that's been declared (as abstract) but not implemented. An abstract method declaration doesn't even have curly braces for where the implementation code goes, but instead closes with a semicolon. In other words, it has no method body. 140 Abstract Methods It is illegal to have even a single abstract method in a class that is not explicitly declared abstract! 141 Ordinary methods vs abstract methods The method is not marked abstract. The method declaration includes curly braces, as opposed to ending in a semicolon. In other words, the method has a method body. The method provides actual implementation code. 142 More on abstract methods The first concrete subclass of an abstract class must implement all abstract methods of the superclass. A method can never, ever, ever be marked as both abstract and final, or both abstract and private. The abstract modifier can never be combined with the static modifier. 143 Methods with Variable Argument Lists (var-args) Java allows you to create methods that can take a variable number of arguments. 144 The declaration rules for var-args: 1. Var-arg type: When you declare a vararg parameter, you must specify the type of the argument(s) this parameter of your method can receive. 145 The declaration rules for var-args: 2. Basic syntax :To declare a method using a var-arg parameter, you follow the type with an ellipsis (...), a space, and then the name of the array that will hold the parameters received. 146 The declaration rules for var-args: 3. Other parameters :It's legal to have other parameters in a method that uses a var-arg. 4. Var-args limits :The var-arg must be the last parameter in the method's signature, and you can have only one var-arg in a method. 147 var-args: Examples Legal: void doStuff(int... x) { } // expects from 0 to many ints // as parameters void doStuff2(char c, int... x) { } // expects first a char,// then 0 to many ints void doStuff3(Animal... animal) { } // 0 to many Animals 148 var-args: Examples Illegal: void doStuff4(int x...) { } // bad syntax void doStuff5(int... x, char... y) { } // too many var-args void doStuff6(String... s, byte b) { } // var-arg must be last 149 Overloading Overloading is when two or more methods in the same class have the same method name To be valid, any two definitions of the method name must have different signatures 150 Overloading A signature consists of the name of a method together with its parameter list Differing signatures must have different numbers and/or types of parameters 151 Overloading and Automatic Type Conversion If Java cannot find a method signature that exactly matches a method invocation, it will try to use automatic type conversion The interaction of overloading and automatic type conversion can have unintended results 152 Overloading and Automatic Type Conversion In some cases of overloading, because of automatic type conversion, a single method invocation can be resolved in multiple ways Ambiguous method invocations will produce an error in Java 153 Pitfall: You Can Not Overload Based on the Type Returned The signature of a method only includes the method name and its parameter types The signature does not include the type returned Java does not permit methods with the same name and different return types in the same class 154 You Can Not Overload Operators in Java Although many programming languages, such as C++, allow you to overload operators (+, , etc.), Java does not permit this You may only use a method name and ordinary method syntax to carry out the operations you desire 155 Constructors Java allows objects to initialize themselves when they are created. This automatic initialization is performed through the use of a constructor, Because the requirement for initialization is so common. 156 Constructors constructor initializes an object immediately upon creation. It has the same name as the class in which it resides and is syntactically similar to a method. Once defined,the constructor is automatically called immediately after the object is created, before the new operator completes. 157 You Can Invoke Another Method in a Constructor The first action taken by a constructor is to create an object with instance variables Therefore, it is legal to invoke another method within the definition of a constructor, since it has the newly created object as its calling object It is even possible for one constructor to invoke another 158 A Constructor Has a this Parameter Like any ordinary method, every constructor has a this parameter The this parameter can be used explicitly, but is more often understood to be there than written down The first action taken by a constructor is to automatically create an object with instance variables Then within the definition of a constructor, the this parameter refers to the object created by the constructor 159 Constructors They have no return type, not even void. This is because the implicit return type of a class’ constructor is the class type itself. It is the constructor’s job to initialize the internal state of an object so that the code creating an instance will have a fully initialized, usable object immediately 160 Include a No-Argument Constructor If you do not include any constructors in your class, Java will automatically create a default or no-argument constructor that takes no arguments, performs no initializations, but allows the object to be created. 161 Include a No-Argument Constructor If you include even one constructor in your class, Java will not provide this default constructor If you include any constructors in your class, be sure to provide your own noargument constructor as well 162 Overloading Constructors Constructors can also be overloaded just like methods 163 Garbage Collection To handle deallocation automatically. When no references to to an object exist,that object is assumed to be no longer needed and the memory occupied by the object can be claimed. 164 The finalize() Method Sometimes an object will need to perform some action when it is destroyed. The mechanism used o handle such situation is called finalization. To include a finalizer to a class ,we have to define finalize() method. The Java run time system calls that method whenever it is about to recycle an object of that class. 165 finalize() protected void finalize() { //finalization code here } Protected:it is a specifier that prevents access to finalize() by code defined outside its class. 166 Using Objects as Parameters One of the most common uses of object parameters involves constructors. 167 Call-by-value In general, there are two ways that a computer language can pass an argument to a subroutine. The first way is call-by-value. This method copies the value of an argument into the formal parameter of the subroutine. Therefore, changes made to the parameter of the subroutine have no effect on the argument. 168 call-by-reference The second way :An argument can be passed is call-by-reference. In this method, a reference to an argument (not the value of the argument) is passed to the parameter. Inside the subroutine, this reference is used to access the actual argument specified in the call. This means that changes made to the parameter will affect the argument used to call the subroutine. 169 Remember... When a simple type is passed to a method, it is done by use of call-byvalue. Objects are passed by use of call-byreference. 170 Returning Objects A method can return any type of data, including class types that you create. 171 Recursion Java supports recursion. Recursion is the process of defining something in terms of itself. As it relates to Java programming, recursion is the attribute that allows a method to call itself. A method that calls itself is said to be recursive. 172 Default Variable Initializations Instance variables are automatically initialized in Java boolean types are initialized to false Other primitives are initialized to the zero of their type Class types are initialized to null However, it is a better practice to explicitly initialize instance variables in a constructor Note: Local variables are not automatically initialized 173 Understanding static It is possible to create a member that can be used by itself, without reference to a specific instance. To create such a member, precede its declaration with the keyword static. When a member is declared static, it can be accessed before any objects of its class are created, and without reference to any object. 174 static .... main( ) is declared as static because it must be called before any objects exist. Instance variables declared as static are, essentially, global variables. 175 static .... Methods declared as static have several restrictions. They can only call other static methods. They must only access static data. They cannot refer to this or super in any way. 176 static .... It is illegal to refer to any instance variables inside of a static method. Outside of the class in which they are defined, static methods and variables can be used independently of any object. To do so, you need only specify the name of their class followed by the dot operator. 177 Introducing final A variable can be declared as final. Doing so prevents its contents from being modified. This means that you must initialize a final variable when it is declared. Eg:final int FILE_NEW = 1; 178 Introducing Nested and Inner Classes It is possible to define a class within another class; such classes are known as nested classes. The scope of a nested class is bounded by the scope of its enclosing class. Thus, if class B is defined within class A, then B is known to A, but not outside of A. A nested class has access to the members, including private members, of the class in which it is nested. 179 4. Inheritance 180 Inheritance Using inheritance, you can create a general class that defines traits common to a set of related items. This class can then be inherited by other, more specific classes, each adding those things that are unique to it. 181 Inheritance In the terminology of Java, a class that is inherited is called a superclass. The class that does the inheriting is called a subclass. Therefore, a subclass is a specialized version of a superclass. It inherits all of the instance variables and methods defined by the superclass and adds its own, unique elements. 182 Inheritance Basics To inherit a class, you simply incorporate the definition of one class into another by using the extends keyword. The general form of a class declaration that inherits a superclass is shown here: class subclass-name extends superclass-name { // body of class } 183 Member Access and Inheritance Although a subclass includes all of the members of its superclass, it cannot access those members of the superclass that have been declared as private. 184 A Superclass Variable Can Reference a Subclass Object A reference variable of a superclass can be assigned a reference to any subclass derived from that superclass. 185 It is important to understand that it is the type of the reference variable—not the type of the object that it refers to—that determines what members can be accessed. That is, when a reference to a subclass object is assigned to a superclass reference variable, you will have access only to those parts of the object defined by the superclass. 186 Using super Whenever a subclass needs to refer to its immediate superclass, it can do so by use of the keyword super. super has two general forms. The first calls the superclass’ constructor. The second is used to access a member of the superclass that has been hidden by a member of a subclass. 187 Using super to Call Superclass Constructors A subclass can call a constructor method defined by its superclass by use of the following form of super: super(parameter-list); Here, parameter-list specifies any parameters needed by the constructor in the superclass. super( ) must always be the first statement executed inside a subclass’ constructor. 188 Super() // BoxWeight now uses super to initialize its Box attributes. class BoxWeight extends Box { double weight; // weight of box // initialize width, height, and depth using super() BoxWeight(double w, double h, double d,double m) { super(w, h, d); // call superclass constructor weight = m; } } 189 So.... When a subclass calls super( ), it is calling the constructor of its immediate superclass. Thus, super( ) always refers to the superclass immediately above the calling class. This is true even in a multileveled hierarchy. Also, super( ) must always be the first statement executed inside a subclass constructor. 190 A Second Use for super The second form of super acts somewhat like this, except that it always refers to the superclass of the subclass in which it is used. This usage has the following general form: super.member Here, member can be either a method or an instance variable. 191 Super ... This second form of super is most applicable to situations in which member names of a subclass hide members by the same name in the superclass. super can also be used to call methods that are hidden by a subclass. 192 Creating a Multilevel Hierarchy In a class hierarchy, if a superclass constructor requires parameters, then all subclasses must pass those parameters “up the line.” This is true whether or not a subclass needs parameters of its own. 193 When Constructors Are Called In a class hierarchy, constructors are called in order of derivation, from superclass to subclass. Further, since super( ) must be the first statement executed in a subclass’ constructor, this order is the same whether or not super( ) is used. If super( ) is not used, then the default or parameter less constructor of each superclass will be executed. 194 Method Overriding In a class hierarchy, when a method in a subclass has the same name and type signature as a method in its superclass, then the method in the subclass is said to override the method in the superclass. 195 Method Overriding When an overridden method is called from within a subclass, it will always refer to the version of that method defined by the subclass. The version of the method defined by the superclass will be hidden. 196 Method Overriding Method overriding occurs only when the names and the type signatures of the two methods are identical. If they are not, then the two methods are simply overloaded. The superclass version of an overridden function can be accessed using super. 197 Dynamic method dispatch Method overriding forms the basis for one of Java’s most powerful concepts: dynamic method dispatch. Dynamic method dispatch is the mechanism by which a call to an overridden method is resolved at run time, rather than compile time. Dynamic method dispatch is important because this is how Java implements run-time polymorphism. 198 Dynamic method dispatch When an overridden method is called through a superclass reference, Java determines which version of that method to execute based upon the type of the object being referred to at the time the call occurs. Thus, this determination is made at run time. 199 Dynamic method dispatch When different types of objects are referred to, different versions of an overridden method will be called. In other words, it is the type of the object being referred to (not the type of the reference variable) that determines which version of an overridden method will be executed. 200 Dynamic method dispatch Therefore, if a superclass contains a method that is overridden by a subclass, then when different types of objects are referred to through a superclass reference variable, different versions of the method are executed. 201 Now.... Why Overridden Methods ? 202 Using Abstract Classes Any class that contains one or more abstract methods must also be declared abstract. To declare a class abstract, you simply use the abstract keyword in front of the class keyword at the beginning of the class declaration. 203 Using Abstract Classes There can be no objects of an abstract class. That is, an abstract class cannot be directly instantiated with the new operator. We cannot declare abstract constructors, or abstract static methods. Any subclass of an abstract class must either implement all of the abstract methods in the superclass or be itself declared abstract. 204 Using final with Inheritance The keyword final has three uses. First, it can be used to create the equivalent of a named constant. The other two uses of final apply to inheritance. 205 Using final to Prevent Overriding To disallow a method from being overridden, specify final as a modifier at the start of its declaration. Methods declared as final cannot be overridden. 206 Using final to Prevent Inheritance To prevent a class from being inherited precede the class declaration with final. Declaring a class as final implicitly declares all of its methods as final, too. 207 5.Packages and Interfaces 208 Packages Packages are containers for classes that are used to keep the class namespace compartmentalized. Packages are stored in a hierarchical manner and are explicitly imported into new class definitions. 209 In general, a Java source file can contain any (or all) of the following four internal parts: A single package statement (optional) Any number of import statements (optional) A single public class declaration (required) Any number of classes private to the package (optional) 210 Defining a Package To create a package is quite easy: simply include a package command as the first statement in a Java source file. Any classes declared within that file will belong to the specified package. The package statement defines a name space in which classes are stored. If you omit the package statement, the class names are put into the default package, which has no name. 211 Package … This is the general form of the package statement: package pkg; Here, pkg is the name of the package. For example, the following statement creates a package called MyPackage. package MyPackage; 212 Package … You can create a hierarchy of packages. The general form of a multileveled package statement is shown here: package pkg1[.pkg2[.pkg3]]; 213 Steps … Save the file ,say AccountBalance.java, and put it in a directory called ,say MyPack. Next, compile the file. Make sure that the resulting .class file is also in the MyPack directory. Then try executing the AccountBalance class, using the following command line: java MyPack.AccountBalance 214 Steps … Remember, you will need to be in the directory above MyPack when you execute this command, or to have your CLASSPATH environmental variable set appropriately. As explained, AccountBalance is now part of the package MyPack. This means that it cannot be executed by itself. That is, you cannot use this command line:java AccountBalance AccountBalance must be qualified with its package name. 215 Access Protection Classes and packages are both means of encapsulating and containing the namespace and scope of variables and methods. Packages act as containers for classes and other subordinate packages. Classes act as containers for data and code. The class is Java’s smallest unit of abstraction. 216 Access Protection Java addresses four categories of visibility for class members: Subclasses in the same package Non-subclasses in the same package Subclasses in different packages Classes that are neither in the same package nor subclasses 217 Access Protection Anything declared public can be accessed from anywhere. Anything declared private cannot be seen outside of its class. When a member does not have an explicit access specification, it is visible to subclasses as well as to other classes in the same package. This is the default access. If you want to allow an element to be seen outside your current package, but only to classes that subclass your class directly, then declare that element protected. 218 Importing Packages In a Java source file, import statements occur immediately following the package statement (if it exists) and before any class definitions. This is the general form of the import statement: import pkg1[.pkg2].(classname|*); 219 All of the standard Java classes included with Java are stored in a package called java. The basic language functions are stored in a package inside of the java package called java.lang. 220 Interface An defines a protocol of behavior that can be implemented by any class anywhere in the class hierarchy; it also defines a set of methods but does not implement them. A class that implements the interface agrees to implement all the methods defined in the interface, thereby agreeing to certain behavior. 221 Definition: An interface is a named collection of method definitions, without implementations. 222 Interface vs Abstract Class An interface cannot implement any methods, whereas an abstract class can. A class can implement many interfaces but can have only one superclass. An interface is not part of the class hierarchy. Unrelated classes can implement the same interface. 223 Defining an Interface An Interface has two components: The interface declaration and the interface body. The interface declaration defines various attributes of the interface, such as its name and whether it extends other interfaces. The interface body contains the constant and the method declarations for that interface. 224 The Interface Declaration 225 The Interface Declaration … Two elements are required in an interface declaration — the interface keyword and the name of the interface. The public access specifier indicates that the interface can be used by any class in any package. 226 The Interface Declaration … An interface declaration can have one other component: a list of superinterfaces. An interface can extend other interfaces, just as a class can extend or subclass another class. But a class can extend only one other class, an interface can extend any number of interfaces. The list of superinterfaces is a comma-separated list of all the interfaces extended by the new interface. 227 The Interface Body The interface body contains method declarations for all the methods included in the interface. A method declaration within an interface is followed by a semicolon (;) because an interface does not provide implementations for the methods declared within it. All methods declared in an interface are implicitly public and abstract. 228 The Interface Body An interface can contain constant declarations in addition to method declarations. All constant values defined in an interface are implicitly public, static, and final. 229 The Interface Body Member declarations in an interface prohibit the use of some declaration . You cannot use transient, volatile, or synchronized in a member declaration in an interface. Also, you cannot use the private and protected specifiers when declaring members of an interface. 230 Declaring Volatile Variables If your class contains a member variable that is modified asynchronously by concurrently running threads, you can use Java's volatile keyword to notify the Java runtime system of this. class VolatileExample { volatile int counter; ... } 231 Declaring Transient Variables By default, member variables are part of the persistent state of the object. Member variables that are part of the persistent state of an object must be saved when the object is archived. You use the transient keyword to indicate to the Java virtual machine that the indicated variable is not part of the persistent state of the object. 232 Declaring Transient Variables Like other variable modifiers in the Java system, you use transient in a class or instance variable declaration like this: class TransientExample{ transient int hobo; ... } 233 Implementing an Interface To declare a class that implements an interface, include an implements clause in the class declaration. Your class can implement more than one interface (the Java platform supports multiple inheritance for interfaces), so the implements keyword is followed by a comma-separated list of the interfaces implemented by the class. 234 Implementing an Interface By Convention: The implements clause follows the extends clause, if it exists. When a class implements an interface, it is essentially signing a contract. 235 Implementing an Interface Either the class must implement all the methods declared in the interface and its superinterfaces, or the class must be declared abstract. The method signature — the name and the number and type of arguments — in the class must match the method signature as it appears in the interface. 236 Interfaces Once it is defined, any number of classes can implement an interface. Also, one class can implement any number of interfaces. To implement an interface, a class must create the complete set of methods defined by the interface. 237 Using an Interface as a Type When you define a new interface, you are defining a new reference data type. You can use interface names anywhere you can use any other data type name. 238 Interfaces ... When you implement an interface method, it must be declared as public. 239 Interfaces Can Be Extended One interface can inherit another by use of the keyword extends. The syntax is the same as for inheriting classes. When a class implements an interface that inherits another interface, it must provide implementations for all methods defined within the interface inheritance chain. 240 6. Exception-Handling 241 Exception-Handling An exception is an abnormal condition that arises in a code sequence at run time. In other words,an exception is a run-time error. 242 Exception-Handling Fundamentals A Java exception is an object that describes an exceptional (that is, error) condition that has occurred in a piece of code. When an exceptional condition arises, an object representing that exception is created and thrown in the method that caused the error. That method may choose to handle the exception itself, or pass it on. 243 Exception-Handling Fundamentals Either way, at some point, the exception is caught and processed. Exceptions can be generated by the Java run-time system, or they can be manually generated by your code. 244 Exception-Handling Fundamentals Manually generated exceptions are typically used to report some error condition to the caller of a method. 245 Exception Handling Java exception handling is managed via five keywords: try, catch, throw, throws, and finally. 246 Exception Handling Briefly, here is how they work…. Program statements that you want to monitor for exceptions are contained within a try block. If an exception occurs within the try block, it is thrown. Your code can catch this exception (using catch) and handle it in some rational manner. 247 Exception Handling System-generated exceptions are automatically thrown by the Java runtime system. 248 To manually throw an exception, use the keyword throw. Any exception that is thrown out of a method must be specified as such by a throws clause. Any code that absolutely must be executed before a method returns is put in a finally block. 249 general form of an exceptionhandling block: try { // block of code to monitor for errors } catch (ExceptionType1 exOb) { // exception handler for ExceptionType1 } catch (ExceptionType2 exOb) { // exception handler for ExceptionType2 } // ... finally {// block of code to be executed before try block ends } 250 Exception Types There are two kinds of exceptions: runtime and non runtime. Runtime exceptions occur within the Java runtime system: Arithmetic exceptions, such as dividing by zero; pointer exceptions, such as trying to access an object’s members through a null reference; and indexing exceptions, such as trying to access an array element with an index that is too large or too small. 251 Exception Types … A method does not have to catch or specify runtime exceptions, although it may. 252 Exception Types … Nonruntime exceptions are exceptions that occur in code outside of the Java runtime system. For example, exceptions that occur during I/O are nonruntime exceptions. The compiler ensures that nonruntime exceptions are caught or specified; thus, they are also called checked exceptions. 253 Uncaught Exceptions: class Exc0 { public static void main(String args[]) { int d = 0; int a = 42 / d; } } 254 Uncaught Exceptions: When we don’t supply any exception handlers of our own, the exception is caught by the default handler provided by the Java run-time system. Any exception that is not caught by the program will ultimately be processed by the default handler. 255 Uncaught Exceptions: The default handler displays a string describing the exception, prints a stack trace from the point at which the exception occurred, and terminates the program. Here is the output generated when this example is executed. java.lang.ArithmeticException: / by zero at Exc0.main(Exc0.java:4) 256 Using try and catch Although the default exception handler provided by the Java run-time system is useful for debugging, you will usually want to handle an exception yourself. Doing so provides two benefits. First, it allows you to fix the error. Second, it prevents the program from automatically terminating. 257 Using try and catch To guard against and handle a run-time error, simply enclose the code that you want to monitor inside a try block. Immediately following the try block, include a catch clause that specifies the exception type that you wish to catch. 258 try catch ... The goal of most well-constructed catch clauses should be to resolve the exceptional condition and then continue on as if the error had never happened. 259 Multiple catch Clauses In some cases, more than one exception could be raised by a single piece of code. To handle this type of situation, you can specify two or more catch clauses, each catching a different type of exception. 260 Multiple catch Clauses When an exception is thrown, each catch statement is inspected in order, and the first one whose type matches that of the exception is executed. After one catch statement executes, the others are bypassed, and execution continues after the try/catch block. 261 Multiple catch ... When you use multiple catch statements, it is important to remember that exception subclasses must come before any of their superclasses. This is because a catch statement that uses a superclass will catch exceptions of that type plus any of its subclasses. Thus, a subclass would never be reached if it came after its superclass.Further, in Java, unreachable code is an error. 262 Multiple catch ... ArithmeticException is a subclass of Exception, the first catch statement will handle all Exception-based errors, including ArithmeticException. This means that the second catch statement will never execute. To fix the problem, reverse the order of the catch statements. 263 Nested try Statements The try statement can be nested. That is, a try statement can be inside the block of another try. 264 throw It is possible for your program to throw an exception explicitly, using the throw statement. The general form of throw is shown here: throw ThrowableInstance; Here, ThrowableInstance must be an object of type Throwable or a subclass of Throwable. 265 throw ... Simple types, such as int or char, as well as non-Throwable classes, such as String and Object, cannot be used as exceptions. There are two ways you can obtain a Throwable object: using a parameter into a catch clause, or creating one with the new operator. 266 throw ... The flow of execution stops immediately after the throw statement; any subsequent statements are not executed. The nearest enclosing try block is inspected to see if it has a catch statement that matches the type of the exception. If it does find a match, control is transferred to that statement. 267 throw ... If not, then the next enclosing try statement is inspected, and so on. If no matching catch is found, then the default exception handler halts the program and prints the stack trace. 268 throws If a method is capable of causing an exception that it does not handle, it must specify this behavior so that callers of the method can guard themselves against that exception. You do this by including a throws clause in the method’s declaration. A throws clause lists the types of exceptions that a method might throw. 269 throws This is necessary for all exceptions, except those of type Error or RuntimeException, or any of their subclasses. All other exceptions that a method can throw must be declared in the throws clause. If they are not, a compile-time error will result. 270 throws General form type method-name(parameter-list) throws exception-list { // body of method } Here, exception-list is a comma-separated list of the exceptions that a method can throw. 271 Exception Hierarchy 272 Exception Hierarchy Exceptions1.doc 273 7. Multithreading 274 Multithreading Introduction A multithreaded program contains two or more parts that can run concurrently. Each part of such a program is called a thread,and each thread defines a separate path of execution. Thus, multithreading is a specialized form of multitasking. 275 Thread Introduction: Every program you execute has a beginning, an execution sequence, and an end. At any given time during the runtime of the program, there is a single point of execution. However, a thread itself is not a program; it cannot run on its own. Rather a thread runs within a program. 276 Thread … 277 Definition: A thread is a single sequential flow of control within a program. 278 Thread States A thread can be only in one of five states New: This is the state the thread is in after the Thread instance has been created, but the start() method has not been invoked on the thread. It is a live Thread object, but not yet a thread of execution. At this point, the thread is considered not alive. 279 Thread States Runnable :This is the state a thread is in when it's eligible to run, but the scheduler has not selected it to be the running thread. A thread first enters the runnable state when the start() method is invoked, but a thread can also return to the runnable state after either running or coming back from a blocked, waiting, or sleeping state. When the thread is in the runnable state,it is considered alive. 280 Thread States Running: Where the action is. This is the state a thread is in when the thread scheduler selects it (from the runnable pool) to be the currently executing process. A thread can transition out of a running state for several reasons, including because "the thread scheduler felt like it." There are several ways to get to the runnable state, but only one way to get to the running state: the scheduler chooses a thread from the runnable pool. 281 Thread States Waiting/blocked/sleeping This is the state a thread is in when it's eligible to run. The thread is still alive, but is currently not eligible to run. In other words, it is not runnable, but it might return to a runnable state later if a particular event occurs. Note also that a thread in a blocked state is still considered to be alive. 282 Thread States Dead: A thread is considered dead when its run() method completes. It may still be a viable Thread object, but it is no longer a separate thread of execution. Once a thread is dead, it can never be brought back to life! If you invoke start() on a dead Thread instance, you'll get a runtime (not compiler) exception... 283 Thread States 284 The Thread Class and the Runnable Interface. Java’s multithreading system is built upon the Thread class, its methods, and its companion interface, Runnable. Thread encapsulates a thread of execution. Since you can’t directly refer to the ethereal state of a running thread, you will deal with it through its proxy, the Thread instance that spawned it. To create a new thread, your program will either extend Thread or implement the Runnable interface. 285 The Main Thread When a Java program starts up, one thread begins running immediately. This is usually called the main thread of your program, because it is the one that is executed when your program begins. The main thread is important for two reasons: It is the thread from which other “child” threads will be spawned. Often it must be the last thread to finish execution because it performs various shutdown actions. 286 Creating a Thread In the most general sense, you create a thread by instantiating an object of type Thread. Java defines two ways in which this can be accomplished: You can implement the Runnable interface. You can extend the Thread class, itself. 287 Implementing Runnable The easiest way to create a thread is to create a class that implements the Runnable interface. Runnable abstracts a unit of executable code. You can construct a thread on any object that implements Runnable. To implement Runnable, a class need only implement a single method called run( ), which is declared as : public void run( ) 288 Implementing Runnable Inside run( ), you will define the code that constitutes the new thread. It is important to understand that run( ) can call other methods, use other classes, and declare variables, just like the main thread can. The only difference is that run( ) establishes the entry point for another, concurrent thread of execution within your program. This thread will end when run( ) returns. 289 Implementing Runnable After you create a class that implements Runnable, you will instantiate an object of type Thread from within that class. Thread defines several constructors. 290 Thread Constructors Thread(): Thread(Runnable target): Thread(Runnable target, String name) Thread(String name): Thread(ThreadGroup group, Runnable target) Thread(ThreadGroup group, Runnable target, String name) Thread(ThreadGroup group, String name) 291 After the new thread is created, it will not start running until you call its start( ) method, which is declared within Thread. In essence, start( ) executes a call to run( ). The start( ) method is shown here: void start( ) 292 Inside NewThread’s constructor, a new Thread object is created by the following statement: t = new Thread(this, "Demo Thread"); 293 Extending Thread The second way to create a thread is to create a new class that extends Thread, and then to create an instance of that class. The extending class must override the run( ) method, which is the entry point for the new thread. It must also call start( ) to begin execution of the new thread. 294 Extending Thread … The call to super( ) inside NewThread, invokes the following form of the Thread constructor: public Thread(String threadName); 295 Choosing an Approach Which one to create a new thread and why ……….? 296 Creating Multiple Threads Your program can spawn as many threads as it needs other than the two threads: the main thread and one child thread. 297 Using isAlive( ) and join( ) Two ways exist to determine whether a thread has finished. First, you can call isAlive( ) on the thread. This method is defined by Thread,. general form is: final boolean isAlive( ) The isAlive( ) method returns true if the thread upon which it is called is still running. It returns false otherwise. 298 join( ) Second , you can call join( ) on the thread, final void join( ) throws InterruptedException This method waits until the thread on which it is called terminates. Its name comes from the concept of the calling thread waiting until the specified thread joins it. 299 join( ) Additional forms of join( ) allow you to specify a maximum amount of time that you want to wait for the specified thread to terminate. 300 Thread Priorities Currently, these Thread priorities are used by the thread scheduler to decide when each thread should be allowed to run. In theory, higher-priority threads get more CPU time than lower-priority threads. In practice, the amount of CPU time that a thread gets often depends on several factors besides its priority. A higher-priority thread can also preempt a lower-priority one. 301 Thread Priorities To set a thread’s priority, use the setPriority( ) method, which is a member of Thread. This is its general form: final void setPriority(int level) Here, level specifies the new priority setting for the calling thread. The value of level must be within the range MIN_PRIORITY and MAX_PRIORITY. 302 Thread Priorities Currently, these values are 1 and 10, respectively. To return a thread to default priority, specify NORM_PRIORITY, which is currently 5. These priorities are defined as final variables within Thread. You can obtain the current priority setting by calling the getPriority( ) method of Thread, syntax is : final int getPriority( ) 303 Moving out of Running state A call to sleep(): Guaranteed to cause the current thread to stop executing for at least the specified sleep duration (it might be interrupted before its specified time). 304 Moving out of Running state A call to yield() :Not guaranteed to do much of anything, although typically it will cause the currently running thread to move back to runnable so that a thread of the same priority can have a chance. 305 Moving out of Running state A call to join() :Guaranteed to cause the current thread to stop executing until the thread it joins with completes, or if the thread it's trying to join with is not alive, however, the current thread won't need to back out. 306 Other Situations The thread's run() method completes. A call to wait() on an object A thread can't acquire the lock on the object whose method code it's attempting to run. The thread scheduler can decide to move the current thread from running to runnable in order to give another thread a chance to run. No reason is needed—the thread scheduler can trade threads in and out whenever it likes. 307 Synchronization How does synchronization work? With locks. Every object in Java has a built-in lock that only comes into play when the object has synchronized method code. When we enter a synchronized non-static method, we automatically acquire the lock associated with the current instance of the class whose code we're executing. 308 Synchronization Only methods (or blocks) can be synchronized, not variables or classes. Each object has just one lock. Not all methods in a class need to be synchronized. A class can have both synchronized and nonsynchronized methods. 309 Synchronization When two or more threads need access to a shared resource, they need some way to ensure that the resource will be used by only one thread at a time. The process by which this is achieved is called synchronization. You can synchronize your code in either of two ways. Both involve the use of the synchronized keyword. 310 The synchronized Statement - General formsynchronized(object) { // statements to be synchronized } Here, object is a reference to the object being synchronized. A synchronized block ensures that a call to a method that is a member of object occurs only after the current thread has successfully entered object’s monitor. 311 Using Synchronized Methods Eg:Synch .java 312 Thread Deadlock Perhaps the scariest thing that can happen to a Java program is deadlock. Deadlock occurs when two threads are blocked, with each waiting for the other's lock. Neither can run until the other gives up its lock, so they'll sit there forever. 313 Interthread Communication Multithreading replaces event loop programming by dividing your tasks into discrete and logical units. Threads also provide a secondary benefit: They do away with polling. Polling is usually implemented by a loop that is used to check some condition repeatedly. Once the condition is true, appropriate action is taken. This wastes CPU time 314 Interthread Communication To avoid polling, Java includes an elegant interprocess communication mechanism via the wait( ), notify( ), and notifyAll( ) methods. These methods are implemented as final methods in Object, so all classes have them. All three methods can be called only from within a synchronized context.. 315 Interthread Communication wait( ):Tells the calling thread to give up the monitor and go to sleep until some other thread enters the same monitor and calls notify( ). notify( ) wakes up the first thread that called wait( ) on the same object. notifyAll( ) wakes up all the threads that called wait( ) on the same object. The highest priority thread will run first. 316 Interthread Communication These methods are declared within Object, as shown here: final void wait( ) throws InterruptedException final void notify( ) final void notifyAll( ) 317 wait() vs notify() When the wait() method is invoked on an object, the thread executing that code gives up its lock on the object immediately. However, when notify() is called, that doesn’t mean the thread gives up its lock at that moment. If the thread is still completing synchronized code, the lock is not released until the thread moves out of synchronized code. So just because notify() is called doesn’t mean the lock becomes available at that moment. 318 8. java.lang 319 java.lang introduction It is Java’s most widely used package. java.lang is automatically imported into all programs. It contains classes and interfaces that are fundamental to virtually all of Java programming. 320 java.lang includes the following classes: Boolean Long StackTraceElement Byte Math StrictMath Character Number String Class Object StringBuffer ClassLoader Package System Compiler Process Thread Double Runtime ThreadGroup Float RuntimePermission ThreadLocal InheritableThreadLocal SecurityManager Throwable Integer Short Void 321 interfaces: java.lang also defines the following interfaces: Cloneable Comparable Runnable CharSequence 322 Simple Type Wrappers These classes encapsulate, or wrap, the simple types within a class. Thus, they are commonly referred to as type wrappers. 323 Number The abstract class Number defines a superclass that is implemented by the classes that wrap the numeric types byte, short, int, long, float, and double. Number has abstract methods that return the value of the object in each of the different number formats. That is, doubleValue( ) returns the value as a double, floatValue( ) returns the value as a float, and so on. 324 byte byteValue( ) double doubleValue( ) float floatValue( ) int intValue( ) long longValue( ) short shortValue( ) 325 The values returned by these methods can be rounded. Number has six concrete subclasses that hold explicit values of each numeric type:Double, Float, Byte, Short, Integer, and Long. 326 Double and Float Double and Float are wrappers for floating-point values of type double and float, respectively. The constructors for Float are : Float(double num) Float(float num) Float(String str) throws NumberFormatException 327 isInfinite( ) and isNaN( ) Float and Double provide the methods isInfinite( ) and isNaN( ), which help when manipulating two special double and float values. isInfinite( ) returns true if the value being tested is infinitely large or small in magnitude. isNaN( ) returns true if the value being tested is not a number 328 Converting Numbers to and from Strings Java provides an easy way to convert the string representation of a number into its internal, binary format. The Byte, Short, Integer, and Long classes provide the parseByte( ), parseShort( ), parseInt( ), and parseLong( ) methods, respectively. These methods return the byte, short, int, or long equivalent of the numeric string with which they are .called 329 Now … WAP which sums a list of integers entered by the user.(use readLine( ) to read integers and parseInt( ) to convert the strings to their int equivalents.) Soln: ParseDemo.java 330 To convert a whole number into a decimal string, use the versions of toString( ) defined in the Byte, Short, Integer, or Long classes. The Integer and Long classes also provide the methods toBinaryString( ), toHexString( ), and toOctalString( ), which convert a value into a binary, hexadecimal, or octal string, respectively. 331 Character Character is a simple wrapper around a char. The constructor for Character is Character(char ch) Here, ch specifies the character that will be wrapped by the Character object being created. To obtain the char value contained in a Character object, call charValue( ),as shown: char charValue( ) : It returns the character. 332 Character includes several static methods that categorize characters and alter their case. Eg: IsDemo.java 333 Boolean Boolean is a very thin wrapper around boolean values, which is useful mostly when you want to pass a boolean variable by reference. It contains the constants TRUE and FALSE, which define true and false Boolean objects. 334 Boolean Boolean defines these constructors: Boolean(boolean boolValue) Boolean(String boolString) In the first version, boolValue must be either true or false. In the second version, if boolString contains the string “true” (in uppercase or lowercase), then the new Boolean object will be true. Otherwise, it will be false. 335 Void The Void class has one field, TYPE, which holds a reference to the Class object for type void. You do not create instances of this class. 336 Process The abstract Process class encapsulates a process—that is, an executing program. It is used primarily as a superclass for the type of objects created by exec( ) in the Runtime class. 337 Runtime The Runtime class encapsulates the run-time environment. You cannot instantiate a Runtime object. However, you can get a reference to the current Runtime object by calling the static method Runtime.getRuntime( ). Once you obtain a reference to the current Runtime object, you can call several methods that control the state and behavior of the Java Virtual Machine. 338 Runtime Applets and other untrusted code typically cannot call any of the Runtime methods without raising a SecurityException. Two of the most common uses of the Runtime class: memory management and executing additional processes. 339 Memory Management Using freeMemory(),totalMemory() and gc(). Eg: MemoryDemo.java 340 Executing Other Programs In safe environments, you can use Java to execute other heavyweight processes (that is, programs) on your multitasking operating system. Several forms of the exec( ) method allow you to name the program you want to run as well as its input parameters. 341 Executing Other Programs The exec( ) method returns a Process object, which can then be used to control how your Java program interacts with this new running process. For example use exec( ) to launch notepad, Windows’ simple text editor. ExecDemo.java 342 System The System class holds a collection of static methods and variables. The standard input, output, and error output of the Java run time are stored in the in, out, and err variables. 343 Using currentTimeMillis( ) to Time Program Execution Use the currentTimeMillis( ) method to time how long various parts of your program take to execute. The currentTimeMillis( ) method returns the current time in terms of milliseconds since midnight, January 1, 1970. Eg: Elapsed.java 344 Using arraycopy( ) The arraycopy( ) method can be used to copy quickly an array of any type from one place to another. This is much faster than the equivalent loop written out longhand in Java. Eg:ACDemo.java 345 Method Description static void arraycopy(Object source, int sourceStart,Object target,int targetStart, int size): Copies an array. The array to be copied is passed in source,and the index at which point the copy will begin within source is passed in sourceStart. The array that will receive the copy is passed in target, and the index at which point the copy will begin within target is passed in targetStart. size is the number of elements that are copied. 346 Object Object is a superclass of all other classes 347 Using clone( ) and the Cloneable Interface The clone( ) method generates a duplicate copy of the object on which it is called. Only classes that implement the Cloneable interface can be cloned. The Cloneable interface defines no members. It is used to indicate that a class allows a bitwise copy of an object (that is, a clone) to be made. 348 Using clone( ) and the Cloneable Interface If you try to call clone( ) on a class that does not implement Cloneable, a CloneNotSupportedException is thrown. When a clone is made, the constructor for the object being cloned is not called. A clone is simply an exact copy of the original. 349 Cloning is a potentially dangerous action, because it can cause unintended side effects. If an object opens an I/O stream and is then cloned, two objects will be capable of operating on the same stream. Further, if one of these objects closes the stream, the other object might still attempt to write to it, causing an error. . 350 Because cloning can cause problems, clone( ) is declared as protected inside Object . This means that it must either be called from within a method defined by the class that implements Cloneable, or it must be explicitly overridden by that class so that it is public. 351 Class Class encapsulates the run-time state of an object or interface. Objects of type Class are created automatically, when classes are loaded. You cannot explicitly declare a Class object. Generally, you obtain a Class object by calling the getClass( ) method defined by Object. 352 ClassLoader The abstract class ClassLoader defines how classes are loaded. Your application can create subclasses that extend ClassLoader, implementing its methods. Doing so allows you to load classes in some way other than the way they are normally loaded by the Java run-time system 353 Math The Math class contains all the floatingpoint functions that are used for geometry and trigonometry, as well as several general-purpose methods. Math defines two double constants: E (approximately 2.72) PI (approximately 3.14). 354 Rounding Functions The Math class defines several methods that provide various types of rounding operations static int abs(int arg) Returns the absolute value of arg. static int max(int x, int y) Returns the maximum of x and y. static double rint(double arg) Returns the integer nearest in value to arg. 355 Compiler The Compiler class supports the creation of Java environments in which Java bytecode is compiled into executable code rather than interpreted. It is not for normal programming use. 356 Thread, ThreadGroup, and Runnable The Runnable interface and the Thread and ThreadGroup classes support multithreaded programming. 357 The Runnable Interface The Runnable interface must be implemented by any class that will initiate a separate thread of execution. Runnable only defines one abstract method, called run( ), which is the entry point to the thread. It is defined like this: abstract void run( ) Threads that you create must implement this method. 358 ThreadGroup ThreadGroup creates a group of threads. It defines these two constructors: ThreadGroup(String groupName) ThreadGroup(ThreadGroup parentOb, String groupName) For both forms, groupName specifies the name of the thread group. The first version creates a new group that has the current thread as its parent. In the second form, the parent is specified by parentOb. 359 ThreadLocal and InheritableThreadLocal ThreadLocal: Used to create thread local variables. Each thread will have its own copy of a thread local variable. InheritableThreadLocal: Creates thread local variables that may be inherited. 360 Package Java 2 added a class called Package that encapsulates version data associated with a package. Package version information is becoming more important because of the proliferation of packages and because a Java program may need to know what version of a package is available. 361 RuntimePermission RuntimePermission was added to java.lang by Java 2. It relates to Java’s security mechanism 362 Throwable The Throwable class supports Java’s exception-handling system, and is the class from which all exception classes are derived. 363 SecurityManager SecurityManager is an abstract class that your subclasses can implement to create a security manager. Generally, you don’t need to implement your own security manager. If you do, you need to consult the documentation that comes with your Java development system. 364 StackTraceElement Java 2, version 1.4 adds the StackTraceElement class. This class describes a single stack frame, which is an individual element of a stack trace when an exception occurs. Each stack frame represents an execution point, which includes such things as the name of the method, the name of the file, and the source-code line number. 365 StackTraceElement An array of StackTraceElements is returned by the getStackTrace( ) method of the Throwable class. 366 The CharSequence Interface CharSequence defines methods that grant read-only access to a sequence of characters. This interface is implemented by String and StringBuffer. 367 The Comparable Interface Objects of classes that implement Comparable can be ordered. In other words, classes that implement Comparable contain objects that can be compared in some meaningful manner. 368 The Comparable Interface The signature of the method is shown here: int compareTo(Object obj) This method compares the invoking object with obj. It returns 0 if the values are equal. A negative value is returned if the invoking object has a lower value. Otherwise, a positive value is returned. 369 9. java.util 370 java.util package The java.util package contains one of Java’s most powerful subsystems: collections. 371 The collections framework Designed to meet several goals. First, the framework had to be high-performance. The implementations for the fundamental collections (dynamic arrays, linked lists, trees, and hash tables) are highly efficient. You seldom, if ever, need to code one of these “data engines” manually. 372 The collections framework Second, the framework had to allow different types of collections to work in a similar manner and with a high degree of interoperability. 373 The collections framework Third, extending and/or adapting a collection had to be easy. Toward this end, the entire collections framework is designed around a set of standard interfaces. Several standard implementations (such as LinkedList, HashSet, and TreeSet) of these interfaces are provided that you may use asis. 374 The collections framework Finally, mechanisms were added that allow the integration of standard arrays into the collections framework. 375 The collections framework Another item created by the collections framework is the Iterator interface. An iterator gives you a general-purpose, standardized way of accessing the elements within a collection, one at a time.. Because each collection implements Iterator, the elements of any collection class can be accessed through the methods defined by Iterator. 376 The Collection Interfaces Interface Collection List Set SortedSet Description Enables you to work with groups of objects; it is at the top of the collections hierarchy Extends Collection to handle sequences (lists of objects) Extends Collection to handle sets, which must contain unique elements Extends Set to handle sorted sets 377 All the core collection interfaces are generic. For example, this is the declaration of the Collection interface. public interface Collection<E>... The <E> syntax tells you that the interface is generic. 378 When you declare a Collection instance you can and should specify the type of object contained in the collection. Specifying the type allows the compiler to verify (at compile-time) that the type of object you put into the collection is correct, thus reducing errors at runtime. 379 The Collection Interface The Collection interface is the foundation upon which the collections framework is built. It declares the core methods that all collections will have. 380 The Collection Interface Several of these methods can throw an UnsupportedOperationException. This occurs if a collection cannot be modified. A ClassCastException is generated when one object is incompatible with another, such as when an attempt is made to add an incompatible object to a collection. 381 The Collection Interface Objects are added to a collection by calling add( ). You can add the entire contents of one collection to another by calling addAll( ). You can remove an object using remove( ). To remove a group of objects, call removeAll( ). You can remove all elements except those of a specified group by calling retainAll( ). To empty a collection, call clear( ). 382 The Collection Interface You can determine whether a collection contains a specific object by calling contains( ). To determine whether one collection contains all the members of another, call containsAll( ). You can determine when a collection is empty by calling isEmpty( ). 383 The Collection Interface The number of elements currently held in a collection can be determined by calling size( ). Two collections can be compared for equality by calling equals( ). 384 The List Interface The List interface extends Collection and declares the behavior of a collection that stores a sequence of elements. Elements can be inserted or accessed by their position in the list, using a zero-based index. A list may contain duplicate elements. 385 The List Interface To the versions of add( ) and addAll( ) defined by Collection, List adds the methods add(int, Object) and addAll(int, Collection). These methods insert elements at the specified index. Also, the semantics of add(Object) and addAll(Collection) defined by Collection are changed by List so that they add elements to the end of the list. 386 The List Interface To obtain the object stored at a specific location, call get( ) with the index of the object. To assign a value to an element in the list, call set( ), specifying the index of the object to be changed. To find the index of an object, use indexOf( ) or lastIndexOf( ). 387 The List Interface In addition to the operations inherited from Collection, the List interface includes operations for the following: Positional access — manipulates elements based on their numerical position in the list Search — searches for a specified object in the list and returns its numerical position Iteration — extends Iterator semantics to take advantage of the list's sequential nature 388 The Set Interface The Set interface defines a set. It extends Collection and declares the behavior of a collection that does not allow duplicate elements. Therefore, the add( ) method returns false if an attempt is made to add duplicate elements to a set. It does not define any additional methods of its own. 389 The SortedSet Interface The SortedSet interface extends Set and declares the behavior of a set sorted in ascending order. Several methods throw a NoSuchElementException when no items are contained in the invoking set. A ClassCastException is thrown when an object is incompatible with the elements in a set. A NullPointerException is thrown if an attempt is made to use a null object and null is not allowed in the set. 390 The SortedSet Interface SortedSet defines several methods that make set processing more convenient. To obtain the first object in the set, call first( ). To get the last element, use last( ). You can obtain a subset of a sorted set by calling subSet( ), specifying the first and last object in the set. If you need the subset that starts with the first element in the set, use headSet( ). If you want the subset that ends the set, use tailSet( ). 391 Summary of Interfaces The core collection interfaces are the foundation of the Java Collections Framework. The tree starts with the Collection interface, which provides for the basic functionality used by all collections, such as add and remove methods. Its subinterfaces — Set, List, and Queue — provide for more specialized collections. 392 Summary of Interfaces The Set interface does not allow duplicate elements. This can be useful for storing collections such as a deck of cards or student records. The Set interface has a subinterface, SortedSet, that provides for ordering of elements in the set. 393 Summary of Interfaces The List interface provides for an ordered collection, for situations in which you need precise control over where each element is inserted. You can retrieve elements from a List by their exact position. 394 Summary of Interfaces The Queue interface enables additional insertion, extraction, and inspection operations. Elements in a Queue are typically ordered in on a FIFO basis. 395 The Collection Classes AbstractCollection Implements most of the Collection interface. AbstractList Extends AbstractCollection and implements most of the List interface. AbstractSequentialList Extends AbstractList for use by a collection that uses sequential rather than random access of its elements. 396 The Collection Classes LinkedList ArrayList Implements a linked list by extending AbstractSequentialList. Implements a dynamic array by extending AbstractList. 397 The ArrayList Class The ArrayList class extends AbstractList and implements the List interface. ArrayList supports dynamic arrays that can grow as needed. In Java, standard arrays are of a fixed length. After arrays are created, they cannot grow or shrink. Eg: ArrayListDemo .java 398 ArrayList :constructors 1. ArrayList( ):Builds an empty array list. 2. ArrayList(Collection c):Builds an array list that is initialized with the elements of the collection c. 3. ArrayList(int capacity):Builds an array list that has the specified initial capacity. The capacity is the size of the underlying array that is used to store the elements. The capacity grows automatically as elements are added to an array list. 399 Obtaining an Array from an ArrayList Done by calling toArray( ). Several reasons exist why you might want to convert a collection into an array such as: To obtain faster processing times for certain operations. To pass an array to a method that is not overloaded to accept a collection. To integrate your newer, collection-based code with legacy code that does not understand collections. [Eg: Next] 400 ArrayListToArray.java 401 The LinkedList Class The LinkedList class extends AbstractSequentialList and implements the List interface. It provides a linked-list data structure. It has the two constructors, shown here: LinkedList( ) LinkedList(Collection c) 402 The LinkedList Class The first constructor builds an empty linked list. The second constructor builds a linked list that is initialized with the elements of the collection c. 403 The LinkedList Class In addition to the methods that it inherits, the LinkedList class defines some methods of its own for manipulating and accessing lists. To add elements to the start of the list,use addFirst( ); to add elements to the end, addLast( ). Their signatures are shown here: void addFirst(Object obj) void addLast(Object obj) Here, obj is the item being added. 404 The LinkedList Class To obtain the first element, call getFirst( ). To retrieve the last element, call getLast( ). As: Object getFirst( ) Object getLast( ) To remove the first element, removeFirst( ); To remove the last lement,removeLast() They are shown here: Object removeFirst( ) Object removeLast( ) 405 The HashSet Class HashSet extends AbstractSet and implements the Set interface. It creates a collection that uses a hash table for storage. In hashing, the informational content of a key is used to determine a unique value, called its hash code. The hash code is then used as the index at which the data associated with the key is stored. 406 The HashSet Class The transformation of the key into its hash code is performed automatically—you never see the hash code itself. Also, your code can’t directly index the hash table. The advantage of hashing is that it allows the execution time of basic operations, such as add( ),contains( ), remove( ), and size( ), to remain constant even for large sets. 407 The HashSet Class The following constructors are defined: HashSet( ) HashSet(Collection c) HashSet(int capacity) HashSet(int capacity, float fillRatio) 408 The HashSet Class The first form constructs a default hash set. The second form initializes the hash set by using the elements of c. The third form initializes the capacity of the hash set to capacity. 409 The HashSet Class The fourth form initializes both the capacity and the fill ratio (also called load capacity) of the hash set from its arguments. The fill ratio must be between 0.0 and 1.0,and it determines how full the hash set can be before it is resized upward. Eg: HashSetDemo.java 410 The HashSet Class HashSet does not define any additional methods beyond those provided by its superclasses and interfaces. Importantly, note that a hash set does not guarantee the order of its elements, because the process of hashing doesn’t usually lend itself to the creation of sorted sets. If you need sorted storage, then another collection, such as TreeSet, is a better choice 411 The LinkedHashSet Class This class extends HashSet, but adds no members of its own. LinkedHashSet maintains a linked list of the entries in the set, in the order in which they were inserted. This allows insertion-order iteration over the set. That is, when cycling through a LinkedHashSet using an iterator, the elements will be returned in the order in which they were inserted. 412 The LinkedHashSet Class To see the effect of LinkedHashSet, try substituting LinkedHashSet For HashSet in the preceding program. The output will be[B, A, D, E, C, F] which is the order in which the elements were inserted. 413 The TreeSet Class TreeSet provides an implementation of the Set interface that uses a tree for storage. Objects are stored in sorted, ascending order. Access and retrieval times are quite fast, which makes TreeSet an excellent choice when storing large amounts of sorted information that must be found quickly. 414 The TreeSet Class The following constructors are defined: TreeSet( ): constructs an empty tree set that will be sorted in ascending order according to the natural order of its elements. TreeSet(Collection c): builds a tree set that contains the elements of c. 415 The TreeSet Class TreeSet(Comparator comp) : constructs an empty tree set that will be sorted according to the comparator specified by comp. TreeSet(SortedSet ss):The fourth form builds a tree set that contains the elements of ss. 416 The TreeSet Class stores its elements in a tree, they are automatically arranged in sorted order, as the output confirms. Eg: TreeSetDemo.java 417 Accessing a Collection via an Iterator Iterator enables you to cycle through a collection, obtaining or removing elements. ListIterator extends Iterator to allow bidirectional traversal of a list, and the modification of elements. 418 Using an Iterator Before you can access a collection through an iterator, you must obtain one. Each of the collection classes provides an iterator( ) method that returns an iterator to the start of the collection. By using this iterator object, you can access each element in the collection, one element at a time. 419 Using an Iterator In general, to use an iterator to cycle through the contents of a collection, follow these steps: 1. Obtain an iterator to the start of the collection by calling the collection’s iterator( ) method. 2. Set up a loop that makes a call to hasNext( ). Have the loop iterate as long as hasNext( ) returns true. 3. Within the loop, obtain each element by calling next( ). 420 Using an Iterator Eg: IteratorDemo .java 421 Vector Vector implements a dynamic array. Vector is synchronized. Here are the Vector constructors: Vector( ):Creates a default vector, which has an initial size of 10. Vector(int size):Creates a vector whose initial capacity is specified by size. Vector(int size, int incr):creates a vector whose initial capacity is specified by size and whose increment is specified by 422 incr. Vector Vector(Collection c):Creates a vector that contains the elements of collection c. All vectors start with an initial capacity. After this initial capacity is reached, the next time that you attempt to store an object in the vector, the vector automatically allocates space for that object plus extra room for additional objects. By allocating more than just the required memory, the vector reduces the number of allocations that must take place. 423 Vector Defines some protected data members: int capacityIncrement; int elementCount; The increment value is stored in capacityIncrement. The number of elements currently in the vector is stored in elementCount. The array that holds the vector is stored in elementData. 424 Vector Vector implements List,so you can use a vector just like you use an ArrayList instance. You can also manipulate one using its methods. For example, after you instantiate a Vector, you can add an element to it by calling addElement( ). To obtain the element at a specific location, call elementAt( ). 425 Vector To obtain the first element in the vector, call firstElement( ). To retrieve the last element, call lastElement( ). You can obtain the index of an element by using indexOf( ) and lastIndexOf( ). To remove an element, call removeElement( ) or removeElementAt( ). 426 StringTokenizer The processing of text often consists of parsing a formatted input string. Parsing is the division of text into a set of discrete parts, or tokens, which in a certain sequence can convey a semantic meaning. The StringTokenizer class provides the first step in this parsing process, often called the lexer (lexical analyzer) or scanner. 427 StringTokenizer To use StringTokenizer, you specify an input string and a string that contains delimiters. Delimiters are characters that separate tokens. Each character in the delimiters string is considered a valid delimiter—for example, “,;:” sets the delimiters to a comma, semicolon, and colon. 428 StringTokenizer The default set of delimiters consists of the whitespace characters:space, tab, newline, and carriage return. The StringTokenizer constructors are shown here: StringTokenizer(String str) StringTokenizer(String str, String delimiters) StringTokenizer(String str, String delimiters, boolean delimAsToken) 429 StringTokenizer str is the string that will be tokenized. In the first version, the default delimiters are used. In the second and third versions, delimiters is a string that specifies the delimiters. In the third version, if delimAsToken is true, then the delimiters are also returned as tokens when the string is parsed. Otherwise, the delimiters are not returned. 430 StringTokenizer Delimiters are not returned as tokens by the first two forms. 431 Date The Date class encapsulates the current date and time. Date supports the following constructors: Date( ) :Initializes the object with the current date and time. Date(long millisec):constructor accepts one argument that equals the number of milliseconds that have elapsed since midnight, January 1, 1970. 432 Calendar The abstract Calendar class provides a set of methods that allows you to convert a time in milliseconds to a number of useful components. Calendar provides no public constructors. Calendar defines several protected instance variables. areFieldsSet is a boolean that indicates if the time components have been set. 433 Calendar Fields is an array of ints that holds the components of the time. isSet is a boolean array that indicates if a specific time component has been set. time is a long that holds the current time for this object. isTimeSet is a boolean that indicates if the current time has been set. Eg:CalendarDemo.java 434 GregorianCalendar GregorianCalendar is a concrete implementation of a Calendar that implements the normal Gregorian calendar with which you are familiar. The getInstance( ) method of Calendar returns a GregorianCalendar initialized with the current date and time in the default locale and time zone. 435 GregorianCalendar GregorianCalendar defines two fields: AD and BC. These represent the two eras defined by the Gregorian calendar. GregorianCalendar provides an implementation of all the abstract methods in Calendar. It also provides some additional methods. Perhaps the most interesting is isLeapYear( ), which tests if the year is a leap year. Its form is boolean isLeapYear(int year) 436 TimeZone Another time-related class is TimeZone. The TimeZone class allows you to work with time zone offsets from Greenwich mean time (GMT), also referred to as Coordinated Universal Time (UTC). 437 Locale The Locale class is instantiated to produce objects that each describe a geographical or cultural region. It is one of several classes that provide you with the ability to write programs that can execute in several different international environments. 438 Random The Random class is a generator of pseudorandom numbers. These are called pseudorandom numbers because they are simply uniformly distributed sequences. Random defines the following constructors: Random( ) :The first version creates a number generator that uses the current time as the starting,or seed, value. 439 Random Random(long seed):Allows you to specify a seed value manually. If you initialize a Random object with a seed, you define the starting point for the random sequence. If you use the same seed to initialize another Random object, you will extract the same random sequence. If you want to generate different sequences, specify different seed values. The easiest way to do this is to use the current time to seed a Random object 440 Currency Encapsulates information about a currency. import java.util.*; class CurDemo { public static void main(String args[]) { Currency c; c = Currency.getInstance(Locale.US); System.out.println("Symbol: "+c.getSymbol()); System.out.println("Default fractional digits: " +c.getDefaultFractionDigits());}} The output is shown here.Symbol: $ Default fractional digits: 2 441 10. Stream Classes 442 I/O Basics Streams Java programs perform I/O through streams. A stream is an abstraction that either produces or consumes information. A stream is linked to a physical device by the Java I/O system. All streams behave in the same manner, even if the actual physical devices to which they are linked differ. 443 I/O Basics Streams Thus, the same I/O classes and methods can be applied to any type of device. This means that an input stream can abstract many different kinds of input: from a disk file, a keyboard, or a network socket. Likewise, an output stream may refer to the console, a disk file, or a network connection. 444 I/O Basics Streams Reading information into a program 445 I/O Basics Streams Writing information out of a program. 446 Byte Streams and Character Streams Java 2 defines two types of streams: byte and character. Byte streams provide a convenient means for handling input and output of bytes. Byte streams are used, for example, when reading or writing binary data. Character streams provide a convenient means for handling input and output of characters. 447 Byte Streams Classes Defined by using two class hierarchies. At the top are two abstract classes: InputStream and OutputStream. Remember, to use the stream classes, you must import java.io. 448 Byte Streams Classes The abstract classes InputStream and OutputStream define several key methods that the other stream classes implement. Two of the most important are read( ) and write( ), which, respectively, read and write bytes of data. Both methods are declared as abstract inside InputStream and OutputStream. They are overridden by derived stream classes. 449 Byte Streams Classes Programs use byte streams to perform input and output of 8-bit bytes. All byte stream classes are descended from InputStream and OutputStream. 450 The Character Stream Classes Character streams are defined by using two class hierarchies. At the top are two abstract classes, Reader and Writer. These abstract classes handle Unicode character streams. Java has several concrete subclasses of each of these. 451 Reader and Writer The abstract classes Reader and Writer define several key methods that the other stream classes implement. Two of the most important methods are read( ) and write( ), which read and write characters of data, respectively. These methods are overridden by derived stream classes. 452 The Predefined Streams All Java programs automatically import the java.lang package. This package defines a class called System, which encapsulates several aspects of the run-time environment. For example, using some of its methods, you can obtain the current time and the settings of various properties associated with the system. 453 The Predefined Streams System also contains three predefined stream variables, in, out, and err. These fields are declared as public and static within System. This means that they can be used by any other part of your program and without reference to a specific System object. 454 The Predefined Streams System.out refers to the standard output stream. By default, this is the console. System.in refers to standard input, which is the keyboard by default. System.err refers to the standard error stream, which also is the console by default. 455 The Predefined Streams System.in is an object of type InputStream. System.out and System.err are objects of type PrintStream. These are byte streams, even though they typically are used to read and write characters from and to the console. 456 Reading Console Input In Java, console input is accomplished by reading from System.in. To obtain a character-based stream that is attached to the console, wrap System.in in a BufferedReader object, to create a character stream. BuffereredReader supports a buffered input stream. 457 Reading Console Input Its most commonly used constructor is shown here: BufferedReader(Reader inputReader) Here, inputReader is the stream that is linked to the instance of BufferedReader that is being created. Reader is an abstract class. 458 Reading Console Input One of its concrete subclasses is InputStreamReader, which converts bytes to characters. To obtain an InputStreamReader object that is linked to System.in, use the following constructor: InputStreamReader(InputStream inputStream) 459 Reading Console Input Because System.in refers to an object of type InputStream, it can be used for inputStream. Putting it all together, the following line of code creates a BufferedReader that is connected to the keyboard: BufferedReader br = new BufferedReader (new InputStreamReader(System.in)); After this statement executes, br is a character-based stream that is linked to the console through System.in. 460 Reading Characters To read a character from a BufferedReader, use read( ). The version of read( ) that we will be using is int read( ) throws IOException. Each time that read( ) is called, it reads a character from the input stream and returns it as an integer value. It returns –1 when the end of the stream is encountered and it can throw an IOException. 461 Reading Strings To read a string from the keyboard, use the version of readLine( ) that is a member of the BufferedReader class. Its general form is shown here: String readLine( ) throws IOException you can see that it returns a String object. 462 Writing Console Output Console output is most easily accomplished with print( ) and println( ),. These methods are defined by the class PrintStream (which is the type of the object referenced by System.out). Even though System.out is a byte stream, using it for simple program output is still acceptable. Eg:WriteDemo.java 463 Writing Console Output Because PrintStream is an output stream derived from OutputStream, it also implements the low-level method write( ). Thus, write( ) can be used to write to the console. The simplest form of write( ) defined by PrintStream is shown here: void write(int byteval) This method writes to the stream the byte specified by byteval. 464 The PrintWriter Class For real-world programs, the recommended method of writing to the console when using Java is through a PrintWriter stream. PrintWriter is one of the character-based classes. Using a character-based class for console output makes it easier to internationalize your program. 465 The PrintWriter Class Constructors: : PrintWriter(OutputStream outputStream, boolean flushOnNewline) Here, outputStream is an object of type OutputStream, and flushOnNewline controls whether Java flushes the output stream every time a println( ) method is called. If flushOnNewline is true, flushing automatically takes place. If false, flushing is not automatic. 466 The PrintWriter Class To write to the console by using a PrintWriter, specify System.out for the output stream and flush the stream after each newline. For eg: this line of code creates a PrintWriter that is connected to console output: PrintWriter pw = new PrintWriter(System.out, true); // Demonstrate PrintWriter import java.io.*; 467 The PrintWriter Class :example public class PrintWriterDemo { public static void main(String args[]) { PrintWriter pw = new PrintWriter(System.out, true); pw.println("This is a string"); int i = -7; pw.println(i); double d = 4.5e-7; pw.println(d);} } 468 Reading and Writing Files Java provides a number of classes and methods that allow you to read and write files. In Java, all files are byte-oriented, and Java provides methods to read and write bytes from and to a file. Also, Java allows you to wrap a byte-oriented file stream within a character-based object Two of the most often-used stream classes are FileInputStream and FileOutputStream, which create byte streams linked to files. 469 Reading and Writing Files To open a file, you simply create an object of one of these classes, specifying the name of the file as an argument to the constructor. FileInputStream(String fileName) throws FileNotFoundException FileOutputStream(String fileName) throws FileNotFoundException Here, fileName specifies the name of the file that you want to open. 470 Reading and Writing Files When you create an input stream, if the file does not exist, then FileNotFoundException is thrown. For output streams, if the file cannot be created, then FileNotFoundException is thrown. When an output file is opened, any preexisting file by the same name is destroyed 471 Reading and Writing Files When you are done with a file, you should close it by calling close( ). It is defined by both FileInputStream and FileOutputStream, as shown here: void close( ) throws IOException To read from a file, you can use a version of read( ) that is defined within FileInputStream. Its general form is: int read( ) throws IOException. 472 Reading and Writing Files Each time that it is called, it reads a single byte from the file and returns the byte as an integer value. read( ) returns –1 when the end of the file is encountered. It can throw an IOException. Eg: ShowFile.java 473 Reading and Writing Files To write to a file, you will use the write( ) method defined by FileOutputStream. Its simplest form is shown here: void write(int byteval) throws IOException This method writes the byte specified by byteval to the file. Although byteval is declared as an integer, only the low-order eight bits are written to the file. If an error occurs during writing, an IOException is thrown. eg:CopyFile.java 474 The Java I/O Classes and Interfaces IO_classes.txt The following interfaces are defined by java.io: DataInput FilenameFilter ObjectOutput DataOutput ObjectInput ObjectStreamConstants Externalizable ObjectInputValidation Serializable FileFilter 475 File Most of the classes defined by java.io operate on streams, the File class does not. It deals directly with files and the file system. That is, the File class does not specify how information is retrieved from or stored in files; it describes the properties of a file itself. A File object is used to obtain or manipulate the information associated with a disk file, such as the permissions, time, date, and directory path, and to navigate subdirectory hierarchies. 476 File Files are a primary source and destination for data within many programs. Although there are severe restrictions on their use within applets for security reasons,files are still a central resource for storing persistent and shared information. 477 File : constructors File(String directoryPath) File(String directoryPath, String filename) File(File dirObj, String filename) File(URI uriObj) Here, directoryPath is the path name of the file, filename is the name of the file, dirObj is a File object that specifies a directory, and uriObj is a URI object that describes a file. File defines many methods that obtain the standard properties of a File object. 478 File : constructors For eg: getName( ) returns the name of the file, getParent( ) returns the name of the parent directory, and exists( ) returns true if the file exists, false if it does not. Eg:FileDemo.java 479 File isFile( ) returns true if called on a file and false if called on a directory. Also, isFile( ) returns false for some special files, such as device drivers and named pipes, so this method can be used to make sure the file will behave as a file. The isAbsolute( ) method returns true if the file has an absolute path and false if its path is relative. 480 File File also includes two useful utility methods. The first is renameTo( ) : boolean renameTo(File newName) Here, the filename specified by newName becomes the new name of the invoking File object. It will return true upon success and false if the file cannot be renamed. 481 File The second utility method is delete( ), which deletes the disk file represented by the path of the invoking File object. boolean delete( ) You can also use delete( ) to delete a directory if the directory is empty. delete( ) returns true if it deletes the file and false if the file cannot be removed. Also, because File supports the Comparable interface, the method compareTo( ) is 482 Directories A directory is a File that contains a list of other files and directories. When you create a File object and it is a directory, the isDirectory( ) method will return true. Here,you can call list( ) on that object to extract the list of other files and directories inside. It has two forms. One is String[ ] list( ) :The list of files is returned in an array of String objects. Eg:DirList.java 483 Creating Directories The mkdir( ) :creates a directory, returning true on success and false on failure. Failure indicates that the path specified in the File object already exists, or that the directory cannot be created because the entire path does not exist yet. To create a directory for which no path exists, use the mkdirs( ) method. It creates both a directory and all the parents of the directory. 484 ByteArrayInputStream ByteArrayInputStream is an implementation of an input stream that uses a byte array as the source. ByteArrayInputStream(byte array[ ]) ByteArrayInputStream(byte array[ ], int start, int numBytes) Here, array is the input source. The second constructor creates an InputStream from a subset of your byte array that begins with the character at the index specified by start and is numBytes long. 485 ByteArrayInputStream Eg: ByteArrayInputStreamDemo.java A ByteArrayInputStream implements both mark( ) and reset( ). If mark( ) has not been called, then reset( ) sets the stream pointer to the start of the stream. Eg: ByteArrayInputStreamReset 486 ByteArrayOutputStream Implementation of an output stream that uses a byte array as the destination. Constructors:ByteArrayOutputStream( ) : a buffer of 32 bytes is created. ByteArrayOutputStream(int numBytes): A buffer is created with a size equal to that specified by numBytes. The buffer is held in the protected buf field of ByteArrayOutputStream. The buffer size will be increased automatically, if needed. Eg:ByteArrayOutputStreamDemo 487 Filtered Byte Streams Filtered streams are simply wrappers around underlying input or output streams that transparently provide some extended level of functionality. These streams are typically accessed by methods that are expecting a generic stream, which is a superclass of the filtered streams. Typical extensions are buffering, character translation, and raw data translation. The filtered byte streams are FilterInputStream and FilterOutputStream. 488 Filtered Byte Streams Their constructors are shown here: FilterOutputStream(OutputStream os) FilterInputStream(InputStream is) The methods provided in these classes are identical to those in InputStream and OutputStream. 489 Buffered Byte Streams For the byte-oriented streams, a buffered stream extends a filtered stream class by attaching a memory buffer to the I/O streams. This buffer allows Java to do I/O operations on more than a byte at a time, hence increasing performance. Because the buffer is available, skipping, marking, and resetting of the stream becomes possible. 490 BufferedInputStream Buffering I/O is a very common performance optimization. Java’s BufferedInputStream class allows you to “wrap” any InputStream into a buffered stream and achieve this performance improvement. Constructors: BufferedInputStream(InputStream inputStream): The first form creates a buffered stream using a default buffer size. 491 BufferedInputStream • BufferedInputStream(InputStream inputStream, int bufSize) :size of the buffer is passed in bufSize. • Use of sizes that are multiples of memory page, disk block, and so on can have a significant positive impact on performance. • Eg: BufferedInputStreamDemo.java 492 BufferedInputStream Use of mark( ) is restricted to access within the buffer. This means that you can only specify a parameter to mark( ) that is smaller than the buffer size of the stream. 493 BufferedOutputStream Similar to any OutputStream with the exception of an added flush( ) method that is used to ensure that data buffers are physically written to the actual output device. Since the point of a BufferedOutputStream is to improve performance by reducing the number of times the system actually writes data, you may need to call flush( ) to cause any data that is in the buffer to get written. 494 BufferedOutputStream Unlike buffered input, buffering output does not provide additional functionality.Buffers for output in Java are there to increase performance. constructors: BufferedOutputStream(OutputStream outputStream) :Creates a buffered stream using a buffer of 512 bytes. BufferedOutputStream(OutputStream outputStream, int bufSize):The size of the buffer is passed in bufSize . 495 PushbackInputStream One of the novel uses of buffering is the implementation of pushback. Pushback is used on an input stream to allow a byte to be read and then returned (that is, “pushed back”) to the stream. The PushbackInputStream class implements this idea. It provides a mechanism to “peek” at what is coming from an input stream without disrupting it. 496 PushbackInputStream Constructors: PushbackInputStream(InputStream inputStream) :Creates a stream object that allows one byte to be returned to the input stream. PushbackInputStream(InputStream inputStream, int numBytes): Creates a stream that has a pushback buffer that is numBytes long. 497 PushbackInputStream Allows multiple bytes to be returned to the input stream.Provides unread( ), shown here: void unread(int ch) :Pushes back the loworder byte of ch. This will be the next byte returned by a subsequent call to read( ). void unread(byte buffer[ ]): returns the bytes in buffer void unread(byte buffer, int offset, int numChars): pushes back numChars bytes beginning at offset from buffer. An IOException will be thrown if there is an attempt to return a byte when the pushback buffer is full 498 PushbackInputStream Eg: PushbackInputStreamDemo.java PushbackInputStream has the side effect of invalidating the mark( ) or reset( ) methods of the InputStream used to create it. Use markSupported( ) to check any stream on which you are going to use mark( )/reset( ). 499 SequenceInputStream The SequenceInputStream class allows you to concatenate multiple InputStreams. The construction of a SequenceInputStream is different from any other InputStream. 500 PrintStream The PrintStream class provides all of the formatting capabilities. PrintStream(OutputStream outputStream) PrintStream(OutputStream outputStream, boolean flushOnNewline) where flushOnNewline controls whether Java flushes the output stream every time a newline (\n) character is output. If flushOnNewline is true, flushing automatically takes place. 501 PrintStream If it is false, flushing is not automatic. The first constructor does not automatically flush. Java’s PrintStream objects support the print( ) and println( ) methods for all types, including Object. If an argument is not a simple type, the PrintStream methods will call the object’s toString( ) method and then print the result. 502 RandomAccessFile Encapsulates a random-access file. It is not derived from InputStream or OutputStream. Instead, it implements the interfaces DataInput and DataOutput,which define the basic I/O methods. constructors: RandomAccessFile(File fileObj, String access)throws FileNotFoundException: fileObj specifies the name of the file to open as a File object 503 RandomAccessFile In theRandomAccessFile(String filename, String access) throws FileNotFoundException: The name of the file is passed in filename. In both cases, access determines what type of file access is permitted. If it is “r”, then the file can be read, but not written. If it is “rw”, then the file is opened in readwrite mode. 504 RandomAccessFile If it is “rws”, the file is opened for read-write operations and every change to the file’s data or metadata will be immediately written to the physical device . If it is “rwd”, the file is opened for read-write operations and every change to the file’s data will be immediately written to the physical device. 505 RandomAccessFile The method seek( ), is used to set the current position of the file pointer within the file: void seek(long newPos) throws IOException. Here, newPos specifies the new position, in bytes, of the file pointer from the beginning of the file. After a call to seek( ), the next read or write operation will occur at the new file position. 506 The Character Streams While the byte stream classes provide sufficient functionality to handle any type of I/O operation, they cannot work directly with Unicode characters. Since one of the main purposes of Java is to support the “write once, run anywhere” philosophy, it was necessary to include direct I/O support for characters. 507 Reader & Writer Reader is an abstract class that defines Java’s model of streaming character input. All of the methods in this class will throw an IOException on error conditions. Writer is an abstract class that defines streaming character output. All of the methods in this class return a void value and throw an IOException in the case of errors. 508 FileReader The FileReader class creates a Reader that you can use to read the contents of a file. Constructors : FileReader(String filePath) FileReader(File fileObj) Either can throw a FileNotFoundException. Here, filePath is the full path name of a file, and fileObj is a File object that describes the file. Eg:FileReaderDemo.java 509 FileWriter Writer that can be used to write to a file. Constructors: FileWriter(String filePath) FileWriter(String filePath, boolean append) FileWriter(File fileObj) FileWriter(File fileObj, boolean append) They can throw an IOException. Here, filePath is the full path name of a file, and fileObj is a File object that describes the file. If append is true, then output is appended to the end of the file. 510 FileWriter Creation of a FileWriter is not dependent on the file already existing. FileWriter will create the file before opening it for output when you create the object. In the case where you attempt to open a read-only file, an IOException will be thrown. Eg: FileWriterDemo.java 511 CharArrayReader Implementation of an input stream that uses a character array as the source. Two Constructors, each of which requires a character array to provide the data source: CharArrayReader(char array[ ]):array is the input source. 512 CharArrayReader CharArrayReader(char array[ ], int start, int numChars): Creates a Reader from a subset of your character array that begins with the character at the index specified by start and is numChars long. Eg:CharArrayReaderDemo.java 513 CharArrayWriter Implementation of an output stream that uses an array as the destination. Two constructors: CharArrayWriter( ) a buffer with a default size is created. CharArrayWriter(int numChars) A buffer is created with a size equal to that specified by numChars. The buffer is held in the buf field of CharArrayWriter. Eg: CharArrayWriter.java 514 Serialization Process of writing the state of an object to a byte stream. This is useful when you want to save the state of your program to a persistent storage area, such as a file. At a later time, you may restore these objects by using the process of deserialization. 515 Serialization Serialization is also needed to implement Remote Method Invocation (RMI). RMI allows a Java object on one machine to invoke a method of a Java object on a different machine. An object may be supplied as an argument to that remote method. The sending machine serializes the object and transmits it. The receiving machine deserializes it. 516 Serializable Only an object that implements the Serializable interface can be saved and restored by the serialization facilities. The Serializable interface defines no members. It is simply used to indicate that a class may be serialized. If a class is serializable, all of its subclasses are also serializable. Variables that are declared as transient are not saved by the serialization facilities. Also, static variables are not saved. 517 Externalizable Serialization and deserialization has been designed so as to save and restore the state of an object occurs automatically. However, there are cases in which the programmer may need to have control over these processes. For example, it may be desirable to use compression or encryption techniques. The Externalizable interface is designed for these situations. 518 Externalizable The Externalizable interface defines these two methods: void readExternal(ObjectInput inStream) throws IOException, ClassNotFoundException void writeExternal(ObjectOutput outStream) throws IOException: 519 11. Applets 520 Applet Fundamentals Applets are small applications that are accessed on an Internet server, transported over the Internet, automatically installed, and run as part of a Web document. After an applet arrives on the client, it has limited access to resources, so that it can produce an arbitrary multimedia user interface and run complex computations without introducing the risk of viruses or breaching data integrity. 521 Sample Applet import java.awt.*; import java.applet.*; public class SimpleApplet extends Applet{ public void paint(Graphics g) { g.drawString("A Simple Applet", 20, 20);}} 522 Sample Applet This applet begins with two import statements. The first imports the Abstract Window Toolkit (AWT) classes. Applets interact with the user through the AWT, not through the console-based I/O classes. The AWT contains support for a window-based, graphical interface The second import statement imports the applet package, which contains the class Applet. Every applet that you create must be a subclass of Applet. 523 Sample Applet The next line in the program declares the class SimpleApplet. This class must be declared as public, because it will be accessed by code that is outside the program. Inside SimpleApplet, paint( ) is declared. This method is defined by the AWT and must be overridden by the applet. paint( ) is called each time that the applet must redisplay its output. This situation can occur for several reasons. 524 Sample Applet For example,the window in which the applet is running can be overwritten by another window and then uncovered. Or, the applet window can be minimized and then restored. paint( ) is also called when the applet begins execution. The paint( ) method has one parameter of type Graphics. This parameter contains the graphics context, which describes the graphics environment in which the applet is running. This context is used whenever output to the applet is required. 525 Inside paint( ) is a call to drawString( ), which is a member of the Graphics class. This method outputs a string beginning at the specified X,Y location. It has the following general form: void drawString(String message, int x, int y) 526 Here, message is the string to be output beginning at x,y. In a Java window, the upperleft corner is location 0,0. The call to drawString( ) in the applet causes the message “A Simple Applet” to be displayed beginning at location 20,20. Notice that the applet does not have a main( ) method. Unlike Java programs, applets do not begin execution at main( ). In fact, most applets don’t even have a main( ) method. Instead, an applet begins execution when the name of its class is passed to an applet viewer or to a network browser. 527 Compilation is same as before.But , running SimpleApplet involves a different process. In fact, there are two ways in which you can run an applet: Executing the applet within a Java-compatible Web browser. Using an applet viewer, such as the standard SDK tool, appletviewer. An applet viewer executes your applet in a window. This is generally the fastest and easiest way to test your applet. 528 To execute an applet in a Web browser, you need to write a short HTML text file that contains the appropriate APPLET tag. Here is the HTML file that executes SimpleApplet: <applet code="SimpleApplet" width=200 height=60> </applet> 529 The width and height statements specify the dimensions of the display area used by the applet. After you create this file, you can execute your browser and then load this file, which causes SimpleApplet to be executed. To execute SimpleApplet with an applet viewer, you may also execute the HTML file shown earlier. For example, if the preceding HTML file is called RunApp.html,then the following command line will run SimpleApplet: C:\>appletviewer RunApp.html 530 A more convenient method exists that you can use to speed up testing.Simply include a comment at the head of your Java source code file that contains the APPLET tag. By doing so, your code is documented with a prototype of the necessary HTML statements, and you can test your compiled applet merely by starting the applet viewer with your Java source code file. If you use this method, the SimpleApplet source file looks like this: 531 import java.awt.*; import java.applet.*; /*<applet code="SimpleApplet" width=200 height=60> </applet>*/ public class SimpleApplet extends Applet { public void paint(Graphics g) { g.drawString("A Simple Applet", 20, 20);}} 532 The three steps involved 1. Edit a Java source file. 2. Compile your program. 3. Execute the applet viewer, specifying the name of your applet’s source file. The applet viewer will encounter the APPLET tag within the comment and execute your applet. 533 Applet Basics The Applet class is contained in the java.applet package. In addition, java.applet also defines three interfaces: AppletContext, AudioClip, and AppletStub. Applet Basics All applets are subclasses of Applet. Thus, all applets must import java.applet. Applets must also import java.awt 534 Applet Basics Applets are not executed by the consolebased Java run-time interpreter.Rather, they are executed by either a Web browser or an applet viewer. Execution of an applet does not begin at main( ). Actually, few applets even have main( ) methods. Instead, execution of an applet is started and controlled with an entirely different mechanism. 535 Applet Basics Output to your applet’s window is not performed by System.out.println( ). Rather, it is handled with various AWT methods, such as drawString( ), which outputs a string to a specified X,Y location. Input is also handled differently than in an application. 536 Once an applet has been compiled, it is included in an HTML file using the APPLET tag. The applet will be executed by a Javaenabled web browser when it encounters the APPLET tag within the HTML file. To view and test an applet more conveniently, simply include a comment at the head of your Java source code file that contains the APPLET tag. 537 This way, your code is documented with the necessary HTML statements needed by your applet, and you can test the compiled applet by starting the applet viewer with your Java source code file specified as the target. Here is an example of such a comment: /*<applet code="MyApplet" width=200 height=60> </applet> */ 538 The Applet Class Applet class provides all necessary support for applet execution,including methods that load and display images, and methods that load and play audio clips. Applet extends the AWT class Panel. In turn, Panel extends Container, which extends Component. These classes provide support for Java’s window-based, graphical interface. Thus, Applet provides all of the necessary support for window-based activities. 539 Applet Architecture An applet is a window-based program. As such, its architecture is different from the socalled normal, console-based programs. Remember,applets are event driven. Here is how the process works. An applet waits until an event occurs. The AWT notifies the applet about an event by calling an event handler that has been provided by the applet. 540 Once this happens, the applet must take appropriate action and then quickly return control to the AWT. This is a crucial point. For the most part, your applet should not enter a “mode” of operation in which it maintains control for an extended period. Instead, it must perform specific actions in response to events and then return control to the AWT run-time system. 541 An Applet Skeleton Most trivial applets override a set of methods that provides the basic mechanism by which the browser or applet viewer interfaces to the applet and controls its execution. Four of these methods-init( ), start( ), stop( ), and destroy( )—are defined by Applet. Another, paint( ), is defined by the AWT Component class. Default implementations for all of these methods are provided. Applets do not need to override those methods they do not use. 542 An Applet skeleton. import java.awt.*; import java.applet.*; /*<applet code="AppletSkel" width=300 height=100> </applet>*/ public class AppletSkel extends Applet { // Called first. public void init() { // initialization } /* Called second, after init(). Also called whenever the applet is restarted. */ 543 public void start() { // start or resume execution } // Called when the applet is stopped. public void stop() { //suspends execution } /* Called when applet is terminated. This is the last method executed. */ public void destroy(){//shutdown activities } // Called when an applet's window must be restored.public void paint(Graphics g) { // redisplay contents of window }} 544 Although this skeleton does not do anything, it can be compiled and run. It is important to understand the order in which the various methods shown in the skeleton are called. When an applet begins, the AWT calls the following methods, in this sequence:1. init( ) 2. start( ) 3. paint( ) When an applet is terminated, the following sequence of method calls takes place: 1. stop( ) 2. destroy( ) 545 init( ) The init( ) method is the first method to be called. This is where you should initialize variables. This method is called only once during the run time of your applet. 546 start( ) The start( ) method is called after init( ). It is also called to restart an applet after it has been stopped. Whereas init( ) is called once—the first time an applet is loaded—start( ) is called each time an applet’s HTML document is displayed onscreen. So, if a user leaves a web page and comes back,the applet resumes execution at start( ). 547 paint( ) Called each time your applet’s output must be redrawn due to several reasons: 1. The window in which the applet is running may be overwritten by another window and then uncovered. 2. Or the applet window may be minimized and then restored. 3. paint( ) is also called when the applet begins execution. 548 paint( ) Whatever the cause, whenever the applet must redraw its output, paint( ) is called. The paint( ) method has one parameter of type Graphics. This parameter will contain the graphics context, which describes the graphics environment in which the applet is running. This context is used whenever output to the applet is required. 549 stop( ) Called when a web browser leaves the HTML document containing the applet—when it goes to another page, for example. When stop( ) is called, the applet is probably running. You should use stop( ) to suspend threads that don’t need to run when the applet is not visible. You can restart them when start( ) is called if the user returns to the page 550 destroy( ) The destroy( ) method is called when the environment determines that your applet needs to be removed completely from memory. At this point, you should free up any resources the applet may be using. The stop( ) method is always called before destroy( ). 551 Overriding update( ) In some situations, your applet may need to override another method defined by the AWT, called update( ). This method is called when your applet has requested that a portion of its window be redrawn. The default version of update( ) first fills an applet with the default background color and then calls paint( ). 552 Overriding update( ) If you fill the background using a different color in paint( ), the user will experience a flash of the default background each time update( ) is called—that is, whenever the window is repainted. One way to avoid this problem is to override the update( ) method so that it performs all necessary display activities. Then have paint( ) simply call update( ). 553 The applet skeleton will override paint( ) and update( ), as shown here: public void update(Graphics g) { // redisplay your window, here. } public void paint(Graphics g) { update(g); } 554 To output a string to an applet, use drawString( ), which is a member of the Graphics class. Typically, it is called from within either update( ) or paint( ). It has the following general form: void drawString(String message, int x, int y) Here, message is the string to be output beginning at x,y. 555 In a Java window, the upper-left corner is location 0,0. The drawString( ) method will not recognize newline characters. If you want to start a line of text on another line, you must do so manually, specifying the precise X,Y location where you want the line to begin.) 556 To set the background color of an applet’s window, use setBackground( ). To set the foreground color (the color in which text is shown, for example), use setForeground( ). These methods are defined by Component, and they have the following general forms: void setBackground(Color newColor) void setForeground(Color newColor) Here, newColor specifies the new color. 557 The class Color defines the constants shown here that can be used to specify colors: Color.black Color.magenta Color.blue Color.orange Color.cyan Color.pink Color.darkGray Color.red Color.gray Color.white Color.green Color.yellow Color.lightGray 558 Eg: this sets the background color to green and the text color to red: setBackground(Color.green); setForeground(Color.red); A good place to set the foreground and background colors is in the init( ) method. These colors can be changed as often as necessary during the execution of yourapplet. The default foreground color is black. The default background color is light gray. 559 Requesting Repainting As a general rule, an applet writes to its window only when its update( ) or paint ( )method is called by the AWT. Whenever your applet needs to update the information displayed in its window, it simply calls repaint( ). The repaint( ) method is defined by the AWT. It causes the AWT run-time system to execute a call to your applet’s update( ) method, which, in its default implementation, calls paint( ). 560 repaint( ) The repaint( ) method has four forms. The simplest version of repaint( ) is shown here: void repaint( ):Causes the entire window to be repainted. The following version specifies a region that will be repainted: void repaint(int left, int top, int width, int height) 561 repaint( ) Here, the coordinates of the upper-left corner of the region are specified by left and top, and the width and height of the region are passed in width and height. These dimensions are specified in pixels. If you need to update only a small portion of the window, it is more efficient to repaint only that region. 562 Using the Status Window In addition to displaying information in its window, an applet can also output a message to the status window of the browser or applet viewer on which it is running. To do so, call showStatus( ) with the string that you want displayed. The status window is a good place to give the user feedback about what is occurring in the applet, suggest options, or possibly report some types of errors. 563 The status window also makes an excellent debugging aid, because it gives you an easy way to output information about your applet. 564 showStatus( ): The following applet demonstrates // Using the Status Window. import java.awt.*; import java.applet.*; /*<applet code="StatusWindow" width=300 height=50></applet>*/ public class StatusWindow extends Applet{ public void init(){setBackground(Color.cyan);} 565 // Display msg in applet window. public void paint(Graphics g) { g.drawString("This is in the applet window.", 10, 20); showStatus("This is shown in the status window.");} } 566 The HTML APPLET Tag The APPLET tag is used to start an applet from both an HTML document and from an applet viewer. An applet viewer will execute each APPLET tag that it finds in a separate window. The syntax for the standard APPLET tag is shown here. Bracketed items are optional. 567 The HTML APPLET Tag < APPLET [CODEBASE = codebaseURL] CODE = appletFile [ALT = alternateText] [NAME = appletInstanceName] WIDTH = pixels HEIGHT = pixels [ALIGN = alignment] [VSPACE = pixels] [HSPACE = pixels] > [< PARAM NAME = AttributeName VALUE = AttributeValue>] [< PARAM NAME = AttributeName2 VALUE = AttributeValue>] </APPLET> 568 CODEBASE:is an optional attribute that specifies the base URL of the applet code, which is the directory that will be searched for the applet’s executable class file (specified by the CODE tag). The HTML document’s URL directory is used as the CODEBASE if this attribute is not specified. The CODEBASE does not have to be on the host from which the HTML document was read. 569 CODE: is a required attribute that gives the name of the file containing your applet’s compiled .class file. This file is relative to the code base URL of the applet, which is the directory that the HTML file was in or the directory indicated by CODEBASE if set. 570 ALT :Is an optional attribute used to specify a short text message that should be displayed if the browser understands the APPLET tag but can’t currently run Java applets. This is distinct from the alternate HTML you provide for browsers that don’t support applets 571 NAME :is an optional attribute used to specify a name for the applet instance. Applets must be named in order for other applets on the same page to find them by name and communicate with them. To obtain an applet by name,use getApplet( ),which is defined by the AppletContext interface. 572 WIDTH AND HEIGHT:Are required attributes that give the size (in pixels) of the applet display area. ALIGN : is an optional attribute that specifies the alignment of the applet.This attribute is treated the same as the HTML IMG tag with these possible values: LEFT, RIGHT, TOP, BOTTOM, MIDDLE, BASELINE, TEXTTOP. 573 VSPACE AND HSPACE: These attributes are optional. VSPACE specifies the space,in pixels, above and below the applet. HSPACE specifies the space, in pixels, on each side of the applet. They’re treated the same as the IMG tag’s VSPACE and HSPACE attributes. 574 PARAM NAME AND VALUE: The PARAM tag allows you to specify applet specific arguments in an HTML page. Applets access their attributes with the getParameter( ) method. 575 Passing Parameters to Applets The APPLET tag in HTML allows you to pass parameters to your applet. To retrieve a parameter, use the getParameter( ) method. It returns the value of the specified parameter in the form of a String object. Thus, for numeric and boolean values, you will need to convert their string representations into their internal formats. “ParamDemo.java” 576 If a parameter isn’t available, getParameter( ) will return null. Also, conversions to numeric types must be attempted in a try statement that catches NumberFormatException. Uncaught exceptions should never occur within an applet. getDocumentBase( ) and getCodeBase( ) Often, you will create applets that will need to explicitly load media and text. 577 Java will allow the applet to load data from the directory holding the HTML file that started the applet (the document base) and the directory from which the applet’s class file was loaded (the code base). These directories are returned as URL objects by getDocumentBase( ) and getCodeBase( ). They can be concatenated with a string that names the file you want to load. 578 To actually load another file, you will use the showDocument( ) method defined by the AppletContext interface. Eg:Bases.java 579 AppletContext and showDocument( ) One application of Java is to use active images and animation to provide a graphical means of navigating the Web that is more interesting than the underlined blue words used by hypertext. To allow your applet to transfer control to another URL, you must use the showDocument( ) method defined by the AppletContext interface. 580 AppletContext is an interface that lets you get information from the applet’s execution environment. The context of the currently executing applet is obtained by a call to the getAppletContext( ) method defined by Applet. 581 Within an applet, once you have obtained the applet’s context, you can bring another document into view by calling showDocument( ). This method has no return value and throws no exception if it fails, so use it carefully. There are two showDocument( ) methods. The method showDocument(URL) displays the document at the specified URL. 582 The method showDocument(URL, where) displays the specified document at the specified location within the browser window. Valid arguments for where are “_self” (show in current frame), “_parent” (show in parent frame), “_top”(show in topmost frame), and “_blank” (show in new browser window). You can also specify a name, which causes the document to be shown in a new browser window by that name. 583 Summary An applet can react to major events in the following ways: It can initialize itself. It can start running. It can stop running. It can perform a final cleanup, in preparation for being unloaded. 584 What Applets Can and Can't Do Every browser implements security policies to keep applets from compromising system security. implementation of the security policies differs from browser to browser. Also, security policies are subject . Current browsers impose the following restrictions on any applet that is loaded over the network: 585 What Applets Can and Can't Do 1. An applet cannot load libraries or define 2. 3. 4. 5. native methods. It cannot ordinarily read or write files on the host that's executing it. It cannot make network connections except to the host that it came from. It cannot start any program on the host that's executing it. It cannot read certain system properties. 586 Applet Capabilities The java.applet package provides an API that gives applets some capabilities that applications don't have. 1. applets can play sounds, which other programs can't do yet. 2. Applets can usually make network connections to the host they came from. 3. Applets running within a Web browser can easily cause HTML documents to be displayed. 4. Applets can invoke public methods of other applets on the same page. 587 Summarizing... The Basic Applet Life Cycle 1. 2. 3. The browser reads the HTML page and finds any <APPLET> tags. The browser parses the <APPLET> tag to find the CODE and possibly CODEBASE attribute. The browser downloads the .class file for the applet from the URL found in the last step. 588 4. The browser converts the raw bytes downloaded into a Java class, that is a java.lang.Class object. The browser instantiates the applet class to form an applet object. This requires the applet to have a noargs constructor. 6. The browser calls the applet's init() method. 7. The browser calls the applet's start() method. 589 While the applet is running, the browser passes any events intended for the applet, e.g. mouse clicks, key presses, etc., to the applet's handleEvent() method. Update events are used to tell the applet that it needs to repaint itself. 9. The browser calls the applet's stop() method. 10. The browser calls the applet's destroy() method. 590 12. Event Handling 591 The Delegation Event Model The modern approach to handling events is based on the delegation event model, which defines standard and consistent mechanisms to generate and process events. Its concept is quite simple: a source generates an event and sends it to one or more listeners. In this scheme, the listener simply waits until it receives an event. 592 Once received, the listener processes the event and then returns. The advantage of this design is that the application logic that processes events is cleanly separated from the user interface logic that generates those events. A user interface element is able to “delegate” the processing of an event to a separate piece of code. 593 In the delegation event model, listeners must register with a source in order to receive an event notification. This provides an important benefit: notifications are sent only to listeners that want to receive them. This is a more efficient way to handle events than the design used by the old Java 1.0 approach. Previously, an event was propagated up the containment hierarchy until it was handled by a component. 594 This required components to receive events that they did not process, and it wasted valuable time. The delegation event model eliminates this overhead. 595 Events In the delegation model, an event is an object that describes a state change in a source. It can be generated as a consequence of a person interacting with the elements in a graphical user interface. Some of the activities that cause events to be generated are pressing a button, entering a character via the keyboard, selecting an item in a list, and clicking the mouse. 596 Event Sources A source is an object that generates an event. This occurs when the internal state of that object changes in some way. Sources may generate more than one type of event. A source must register listeners in order for the listeners to receive notifications about a specific type of event. Each type of event has its own registration method. 597 General form public void addTypeListener(TypeListener el) Here, Type is the name of the event and el is a reference to the event listener. For example,the method that registers a keyboard event listener is called addKeyListener( ). The method that registers a mouse motion listener is called addMouseMotionListener( ). 598 When an event occurs, all registered listeners are notified and receive a copy of the event object. This is known as multicasting the event. In all cases, notifications are sent only to listeners that register to receive them. Some sources may allow only one listener to register. 599 The general form of such a method is this: public void addTypeListener(TypeListener el) throws java.util.TooManyListenersException Here, Type is the name of the event and el is a reference to the event listener. When such an event occurs, the registered listener is notified. This is known as unicasting the event. 600 A source must also provide a method that allows a listener to unregister an interest in a specific type of event. The general form of such a method is this: public void removeTypeListener(TypeListener el) Here, Type is the name of the event and el is a reference to the event listener. The methods that add or remove listeners are provided by the source that generates events. 601 Event Listeners A listener is an object that is notified when an event occurs. It has two major requirements. First, it must have been registered with one or more sources to receive notifications about specific types of events. Second, it must implement methods to receive and process these notifications. 602 Event Classes The classes that represent events are at the core of Java’s event handling mechanism. At the root of the Java event class hierarchy is EventObject, which is in java.util. It is the superclass for all events. Its one constructor is shown here:EventObject(Object src) Here, src is the object that generates this event. 603 EventObject contains two methods: getSource( ) and toString( ). The getSource( )method returns the source of the event. Its general form is shown here: Object getSource( ) As expected, toString( ) returns the string equivalent of the event. 604 Main Event Classes in java.awt.event 1. ActionEvent :Generated when a button is pressed, a list item is double-clicked, or a menu item is selected. 2. AdjustmentEvent :Generated when a scroll bar is manipulated. 3. ComponentEvent :Generated when a component is hidden, moved, resized,or becomes visible. 4. ContainerEvent :Generated when a component is added to or removed from a container. 605 Main Event Classes 5. FocusEvent: Generated when a component gains or loseskeyboard focus. 6. InputEvent:Abstract super class for all component input event classes. 7. ItemEvent:Generated when a check box or list item is clicked; also occurs when a choice selection is made or a checkable menu item is selected or deselected. 606 Main Event Classes 8. KeyEvent :Generated when input is received from the keyboard. 9. MouseEvent: Generated when the mouse is dragged, moved, clicked, pressed, or released; also generated when the mouse enters or exits a component. 607 Main Event Classes 10.MouseWheelEvent :Generated when the mouse wheel is moved. 11.TextEvent :Generated when the value of a text area or text field is changed. 12.WindowEvent :Generated when a window is activated,closed,deactivated, deiconified, iconified, opened, or quit. 608 The ActionEvent Class An ActionEvent is generated when a button is pressed, a list item is double-clicked, or a menu item is selected. The ActionEvent class defines four integer constants that can be used to identify any modifiers associated with an action event: ALT_MASK,CTRL_MASK, META_MASK, and SHIFT_MASK. In addition, there is an integer constant, ACTION_PERFORMED, which can be used to identify action events. 609 Three constructors ActionEvent(Object src, int type, String cmd) ActionEvent(Object src, int type, String cmd, int modifiers) ActionEvent(Object src, int type, String cmd, long when, int modifiers) Here, src is a reference to the object that generated this event. The type of the eventis specified by type, and its command string is cmd.. 610 The argument modifiers indicates which modifier keys (ALT, CTRL, META, and/or SHIFT) were pressed when the event was generated. The when parameter specifies when the event occurred . You can obtain the command name for the invoking ActionEvent object by usingthe getActionCommand( ) method, shown here: String getActionCommand( ) 611 For example, when a button is pressed, an action event is generated that has a command name equal to the label on that button. The getModifiers( ) method returns a value that indicates which modifier keys (ALT, CTRL, META, and/or SHIFT) were pressed when the event was generated. 612 The AdjustmentEvent Class An AdjustmentEvent is generated by a scroll bar. There are five types of adjustmentevents. The AdjustmentEvent class defines integer constants that can be used to identify them. 1. BLOCK_DECREMENT The user clicked inside the scroll bar to decrease its value. 2. BLOCK_INCREMENT The user clicked inside the scroll bar to increase its value. 3. TRACK The slider was dragged. 613 4. UNIT_DECREMENT The button at the end of the scroll bar was clicked to decrease its value. 5. UNIT_INCREMENT The button at the end of the scroll bar was clicked to increase its value. In addition, there is an integer constant, ADJUSTMENT_VALUE_CHANGED,that indicates that a change has occurred. 614 Constructors AdjustmentEvent(Adjustable src, int id, int type, int data) Here, src is a reference to the object that generated this event. The id equals ADJUSTMENT_VALUE_CHANGED. The type of the event is specified by type,and its associated data is data. The getAdjustable( ) method returns the object that generated the event. Its form is shown here:Adjustable getAdjustable( ) 615 The type of the adjustment event may be obtained by the getAdjustmentType( ) method. It returns one of the constants defined by AdjustmentEvent. The general form is int getAdjustmentType( ) The amount of the adjustment can be obtained from the getValue( ) method, shown here:int getValue( ) Eg:, when a scroll bar is manipulated, this method returns the value represented by that change 616 The ComponentEvent Class A ComponentEvent is generated when the size, position, or visibility of a component is changed. There are four types of component events. The ComponentEvent class defines integer constants that can be used to identify them. The constants and their meanings are shown here: COMPONENT_HIDDEN The component was hidden. 617 COMPONENT_MOVED The component was moved. COMPONENT_RESIZED The component was resized. COMPONENT_SHOWN The component became visible. 618 constructor ComponentEvent(Component src, int type) Here, src is a reference to the object that generated this event. The type of the event is specified by type. ComponentEvent is the superclass either directly or indirectly of ContainerEvent, FocusEvent, KeyEvent, MouseEvent, and WindowEvent. The getComponent( ) method returns the component that generated the event. Component getComponent( ) 619 The ContainerEvent Class A ContainerEvent is generated when a component is added to or removed from a container. There are two types of container events. The ContainerEvent class defines int constants that can be used to identify them: COMPONENT_ADDED and COMPONENT_REMOVED. They indicate that a component has been added to or removed from the container. 620 ContainerEvent is a subclass of ComponentEvent and has this constructor: ContainerEvent(Component src, int type, Component comp) Here, src is a reference to the container that generated this event. The type of the event is specified by type, and the component that has been added to or removed from the container is comp. 621 You can obtain a reference to the container that generated this event by using the getContainer( ) method, shown here: Container getContainer( ) The getChild( ) method returns a reference to the component that was added to or removed from the container. Its general form is shown here: Component getChild( ) 622 The FocusEvent Class A FocusEvent is generated when a component gains or loses input focus. These events are identified by the integer constants FOCUS_GAINED and FOCUS_LOST. FocusEvent is a subclass of ComponentEvent and has these constructors: FocusEvent(Component src, int type) FocusEvent(Component src, int type, boolean temporaryFlag) 623 Here, src is a reference to the component that generated this event. The type of the event is specified by type. The argument temporaryFlag is set to true if the focus event is temporary. Otherwise, it is set to false. The isTemporary( ) method indicates if this focus change is temporary. Its form is shown: boolean isTemporary( ) The method returns true if the change is temporary. Otherwise, it returns false. 624 The InputEvent Class The abstract class InputEvent is a subclass of ComponentEvent and is the superclass for component input events. Its subclasses are KeyEvent and MouseEvent. InputEvent defines several integer constants that represent any modifiers, such as the control key being pressed, that might be associated with the event. 625 The ItemEvent Class An ItemEvent is generated when a check box or a list item is clicked or when a checkable menu item is selected or deselected. There are two types of item events, which are identified by the following integer constants: DESELECTED The user deselected an item. SELECTED The user selected an item. 626 The ItemEvent Class In addition, ItemEvent defines one integer constant, ITEM_STATE_CHANGED, that signifies a change of state. ItemEvent has this constructor: ItemEvent(ItemSelectable src, int type, Object entry, int state) Here, src is a reference to the component that generated this event. 627 The ItemEvent Class The specific item that generated the item event is passed in entry. The current state of that item is in state. The getItem( ) method can be used to obtain a reference to the item that generated an event. Its signature : Object getItem( ) 628 The KeyEvent Class A KeyEvent is generated when keyboard input occurs. There are three types of key events, which are identified by these integer constants: KEY_PRESSED, KEY_RELEASED, and KEY_TYPED. The first two events are generated when any key is pressed or released. The last event occurs only when a character is generated. 629 The KeyEvent Class Remember, not all key presses result in characters. There are many other integer constants that are defined by KeyEvent. For example, VK_0 through VK_9 and VK_A through VK_Z define the ASCII equivalents of the numbers and letters. Here are some others: VK_ENTER VK_ESCAPE VK_CANCEL VK_UP VK_DOWN VK_LEFT VK_RIGHT VK_PAGE_DOWN 630 The KeyEvent Class KeyEvent is a subclass of InputEvent. Here are two of its constructors: KeyEvent(Component src, int type, long when, int modifiers, int code) KeyEvent(Component src, int type, long when, int modifiers, int code, char ch) Here, src is a reference to the component that generated the event. The type of the event is specified by type. 631 The KeyEvent Class The KeyEvent class defines several methods, but the most commonly used ones are : char getKeyChar( ) :returns the character that was entered,int getKeyCode( ) :returns the key code. If no valid character is available, then getKeyChar( ) returns CHAR_UNDEFINED. 632 The MouseEvent Class There are eight types of mouse events. This class defines the following integer constants that can be used to identify them: MOUSE_CLICKED:The user clicked the mouse. MOUSE_DRAGGED:The user dragged the mouse. MOUSE_ENTERED:The mouse entered a component. MOUSE_EXITED:The mouse exited from a component. 633 The MouseEvent Class MOUSE_MOVED :The mouse moved. MOUSE_PRESSED: The mouse was pressed. MOUSE_RELEASED: The mouse was released. MouseEvent is a subclass of InputEvent. Here is one of its constructors. MouseEvent(Component src, int type, long when, int modifiers, int x, int y, int clicks, boolean triggersPopup) 634 The MouseEvent Class Here, src is a reference to the component that generated the event. The type of the event is specified by type. The system time at which the mouse event occurred is passed in when. The modifiers argument indicates which modifiers were pressed when a mouse event occurred. The coordinates of the mouse are passed in x and y. The click count is passed in clicks. 635 The MouseEvent Class The triggersPopup flag indicates if this event causes a pop-up menu to appear on this platform. The most commonly used methods in this class are getX( ) and getY( ). These return the X and Y coordinates of the mouse when the event occurred. Their forms are shown here: int getX( ),int getY( ) 636 The MouseEvent Class Alternatively, you can use the getPoint( ) method to obtain the coordinates of the mouse. It is shown here: Point getPoint( ) It returns a Point object that contains the X, Y coordinates in its integer members: x and y. The translatePoint( ) method changes the location of the event. Its form is shown here: void translatePoint(int x, int y) Here, the arguments x and y are added to the coordinates of the event. 637 The getClickCount( ) method obtains the number of mouse clicks for this event. Its signature is shown here: int getClickCount( ) The isPopupTrigger( ) method tests if this event causes a pop-up menu to appear on this platform. Its form is shown here: boolean isPopupTrigger( ) int getButton( ) 638 It returns a value that represents the button that caused the event. The return value will be one of these constants defined by MouseEvent. NO BUTTON BUTTON1 BUTTON2 BUTTON3 The NOBUTTON value indicates that no button was pressed or released. 639 The MouseWheelEvent Class The MouseWheelEvent class encapsulates a mouse wheel event. It is a subclass of MouseEvent . If a mouse has a wheel, it is located between the left and right buttons. Mouse wheels are used for scrolling. MouseWheelEvent defines these two integer constants. WHEEL_BLOCK_SCROLL A page-up or pagedown scroll event occurred. WHEEL_UNIT_SCROLL A line-up or line-down scroll event occurred. 640 The WindowEvent Class There are ten types of window events. The WindowEvent class defines integer constants that can be used to identify them. The constants and their meanings are: WINDOW_ACTIVATED The window was activated. WINDOW_CLOSED The window has been closed. WINDOW_CLOSING The user requested that the window be closed. 641 WINDOW_DEACTIVATED :The window was deactivated. WINDOW_DEICONIFIED The window was deiconified. WINDOW_GAINED_FOCUS The window gained input focus. WINDOW_ICONIFIED The window was iconified. WindowEvent is a subclass of ComponentEvent. 642 WINDOW_LOST_FOCUS The window lost input focus. WINDOW_OPENED The window was opened. WINDOW_STATE_CHANGED The state of the window changed. 643 Sources of Events 1. Button:Generates action events when the button is pressed. 2. Checkbox:Generates item events when the check box is selected or deselected. 3. Choice :Generates item events when the choice is changed. 4. List :Generates action events when an item is double-clicked; generates item events when an item is selected or deselected. 644 Sources of Events 5. Menu Item :Generates action events when a menu item is selected; generates item events when a checkable menu item is selected or deselected. 6. Scrollbar :Generates adjustment events when the scroll bar is manipulated. 7. Text components :Generates text events when the user enters a character. 8. Window :Generates window events when a window is activated, closed,deactivated, deiconified, iconified, opened, or quit. 645 Event Listener Interfaces The delegation event model has two parts: sources and listeners. Listeners are created by implementing one or more of the interfaces defined by the java.awt.event package. When an event occurs, the event source invokes the appropriate method defined by the listener and provides an event object as its argument. 646 The ActionListener Interface This interface defines the actionPerformed( ) method that is invoked when an actionevent occurs. Its general form is shown here: void actionPerformed(ActionEvent ae) 647 The AdjustmentListener Interface This interface defines the adjustmentValueChanged( ) method that is invoked when an adjustment event occurs. Its general form is shown here: void adjustmentValueChanged (AdjustmentEvent ae) 648 The ComponentListener Interface This interface defines four methods that are invoked when a component is resized, moved, shown, or hidden. Their general forms are shown here: void componentResized(ComponentEvent ce) void componentMoved(ComponentEvent ce) void componentShown(ComponentEvent ce) void componentHidden(ComponentEvent ce) 649 The AWT processes the resize and move events. The componentResized( ) and componentMoved( ) methods are rovided for notification purposes only. 650 The ContainerListener Interface This interface contains two methods. When a component is added to a container, componentAdded( ) is invoked. When a component is removed from a container,componentRemoved( ) is invoked. Their general forms are shown here: void componentAdded(ContainerEvent ce) void componentRemoved(ContainerEvent ce) 651 The FocusListener Interface This interface defines two methods. When a component obtains keyboard focus, focusGained( ) is invoked. When a component loses keyboard focus, focusLost( )is called. Their general forms are shown here: void focusGained(FocusEvent fe) void focusLost(FocusEvent fe) 652 ItemListener Interface This interface defines the itemStateChanged( ) method that is invoked when the state of an item changes. Its general form is shown here: void itemStateChanged(ItemEvent ie) 653 The KeyListener Interface This interface defines three methods. The keyPressed( ) and keyReleased( ) methods are invoked when a key is pressed and released, respectively. The keyTyped( ) method is invoked when a character has been entered. The general forms of these methods are void keyPressed(KeyEvent ke) void keyReleased(KeyEvent ke) void keyTyped(KeyEvent ke) 654 The MouseListener Interface This interface defines five methods. void mouseClicked(MouseEvent me): Invoked if the mouse is pressed and released at the same point. void mouseEntered(MouseEvent me):Called when the mouse enters a component. void mouseExited(MouseEvent me): Called When it leaves. 655 The MouseListener Interface void mousePressed(MouseEvent me) and void mouseReleased(MouseEvent me): These methods are invoked when the mouse is pressed and released, respectively. 656 The MouseMotionListener Interface This interface defines two methods. The mouseDragged( ) method is called multiple times as the mouse is dragged. The mouseMoved( ) method is called multiple times as the mouse is moved. Their general forms are shown here: void mouseDragged(MouseEvent me) void mouseMoved(MouseEvent me) 657 The MouseWheelListener Interface This interface defines the mouseWheelMoved( ) method that is invoked when the mouse wheel is moved. Its general form is shown here. void mouseWheelMoved (MouseWheelEvent mwe) 658 The WindowFocusListener Interface This interface defines two methods: windowGainedFocus( ) windowLostFocus( ). These are called when a window gains or losses input focus. Their general forms are void windowGainedFocus(WindowEvent we) void windowLostFocus(WindowEvent we) 659 The WindowListener Interface Defines 7 methods. The windowActivated( ) and windowDeactivated( ) methods are invoked when a window is activated or deactivated, respectively. If a window is iconified,the windowIconified( ) method is called. When a window is deiconified,the windowDeiconified( ) method is called. When a window is opened or closed, the windowOpened( ) or windowClosed( ) methods are called, respectively. 660 The general Forms The windowClosing( ) method is called when a window is being closed. void windowActivated(WindowEvent we) void windowClosed(WindowEvent we) void windowClosing(WindowEvent we) void windowDeactivated(WindowEvent we) void windowDeiconified(WindowEvent we) void windowIconified(WindowEvent we) void windowOpened(WindowEvent we) 661 Using the delegation event model .. Applet programming Using the delegation event model actually quite easy. Just follow these two steps: 1. Implement the appropriate interface in the listener so that it will receive the type of event desired. 2. Implement code to register and unregister (if necessary) the listener as a recipient for the event notifications. 662 Using the delegation event model .. Remember that a source may generate several types of events. Each event must be registered separately. Also, an object may register to receive several types of events,but it must implement all of the interfaces that are required to receive these events. 663 Handling Mouse Events To handle mouse events, you must implement the MouseListener and the MouseMotionListener interfaces. Eg: MouseEvents.java 664 Handling Keyboard Events Must implement the KeyListener interface. There is one other requirement that your program must meet before it can process keyboard events: it must request input focus. To do this, call requestFocus( ), which is defined by Component. If you don’t, then your program will not receive any keyboard events. Eg: SimpleKey.java, KeyEvents.java(for virtual keys) 665 Adapter Classes Java provides a special feature, called an adapter class, that can simplify the creation of event handlers in certain situations. An adapter class provides an empty implementation of all methods in an event listener interface. Adapter classes are useful when you want to receive and process only some of the events that are handled by a particular event listener interface. 666 Adapter Classes You can define a new class to act as an event listener by extending one of the adapter classes and implementing only those events in which you are interested. For example, the MouseMotionAdapter class has two methods, mouseDragged( )and mouseMoved( ). The signatures of these empty methods are exactly as defined in the MouseMotionListener interface. 667 Adapter Classes If you were interested in only mouse drag events, then you could simply extend MouseMotionAdapter and implement mouseDragged( ). The empty implementation of mouseMoved( ) would handle the mouse motion events for you. Eg: AdapterDemo.java 668 Commonly Used Listener Interfaces Implemented by Adapter Classes Adapter Class ComponentAdapter ContainerAdapter FocusAdapter KeyAdapter MouseAdapter MouseMotionAdapter WindowAdapter Listener Interface ComponentListener ContainerListener FocusListener KeyListener MouseListener MouseMotionListener WindowListener 669 13. AWT Part I 670 The Abstract Window Toolkit (AWT) The AWT contains numerous classes and methods that allow you to create and manage windows. AWT Classes: The AWT classes are contained in the java.awt package. It is one of Java’s largest packages. Fortunately, because it is logically organized in a top-down, hierarchical fashion, it is easier to understand and use than you might at first believe. 671 Window Fundamentals The AWT defines windows according to a class hierarchy that adds functionality and specificity with each level. The two most common windows are those derived from Panel, which is used by applets, and those derived from Frame, which creates a standard window. Much of the functionality of these windows is derived from their parent classes. 672 Component At the top of the AWT hierarchy is the Component class. Component is an abstract class that encapsulates all of the attributes of a visual component. All user interface elements that are displayed on the screen and that interact with the user are subclasses of Component. It defines over a hundred public methods that are responsible for managing events, such as mouse and keyboard input, positioning and sizing the window, and repainting. 673 A Component object is responsible for remembering the current foreground and background colors and the currently selected text font. 674 Container The Container class is a subclass of Component. It has additional methods that allow other Component objects to be nested within it. This makes for a multileveled containment system. A container is responsible for laying out (that is, positioning) any components that it contains. It does this through the use of various layout managers. 675 Panel The Panel class is a concrete subclass of Container. It doesn’t add any new methods; itsimply implements Container. A Panel may be thought of as a recursively nestable, concrete screen component. Panel is the superclass for Applet. When screen output is directed to an applet, it is drawn on the surface of a Panel object. In essence, a Panel is a window that does not contain a title bar, menu bar, or border. 676 Panel Other components can be added to a Panel object by its add( ) method (inherited from Container). Once these components have been added, you can position and resize them manually using the setLocation( ), setSize( ), or setBounds( ) methods defined by Component. 677 Window This message warns users that the window they see was started by an applet and not by software running on their computer. The Window class creates a top-level window. A toplevel window is not contained within any other object; it sits directly on the desktop. Generally, you won’t create Window objects directly. Instead, you will use a subclass of Window called Frame. 678 Frame Frame encapsulates what is commonly thought of as a “window.” It is a subclass of Window and has a title bar, menu bar, borders, and resizing corners. If you create a Frame object from within an applet, it will contain a warning message, such as “Java Applet Window,” to the user that an applet window has been created. 679 This message warns users that the window they see was started by an applet and not by software running on their computer. When a Frame window is created by a program rather than an applet, a normal window is created. 680 Working with Frame Windows After the applet, the type of window you will most often create is derived from Frame. You will use it to create child windows within applets, and top-level or child windows for applications. It creates a standard-style window. Here are two of Frame’s constructors: Frame( ) :The first form creates a standard window that does not contain a title. 681 Frame(String title):The second form creates a window with the title specified by title. Notice that you cannot specify the dimensions of the window. Instead, you must set the size of the window after it has been created. 682 Setting the Window’s Dimensions The setSize( ) method is used to set the dimensions of the window. Its signature is shown here: void setSize(int newWidth, int newHeight) void setSize(Dimension newSize) The new size of the window is specified by newWidth and newHeight, or by the width and height fields of the Dimension object passed in newSize. 683 Setting the Window’s Dimensions The dimensions are specified in terms of pixels. The getSize( ) method is used to obtain the current size of a window. Its signature is shown here: Dimension getSize( ) This method returns the current size of the window contained within the width and height fields of a Dimension object. 684 Hiding and Showing a Window After a frame window has been created, it will not be visible until you call setVisible( ). Its signature is shown here: void setVisible(boolean visibleFlag) The component is visible if the argument to this method is true. Otherwise, it is hidden. 685 Setting a Window’s Title You can change the title in a frame window using setTitle( ), which has this general form: void setTitle(String newTitle):Here, newTitle is the new title for the window. 686 Closing a Frame Window When using a frame window, your program must remove that window from the screen when it is closed, by calling setVisible(false). To intercept a window-close event, you must implement the windowClosing( ) method of the WindowListener interface. Inside windowClosing( ), you must remove the window from the screen. Eg:AppletFrame.java 687 Handling Events in a Frame Window Since Frame is a subclass of Component, it inherits all the capabilities defined by Component. This means that you can use and manage a frame window that you create just like you manage your applet’s main window. For example, you can override paint( ) to display output, call repaint( ) when you need to restore the window, and override all event handlers. 688 Whenever an event occurs in a window, the event handlers defined by that window will be called. Each window handles its own events. For example, the following program creates a window that responds to mouse events. The main applet window also responds to mouse events. When you experiment with this program, you will see that mouse events are sent to the window in which the event occurs. eg:WindowEvents.java 689 Creating a Windowed Program It is possible to create stand-alone AWT-based applications. To do this, simply create an instance of the window or windows you need inside main( ). For example, the following program creates a frame window that responds to mouse clicks and keystrokes: eg:AppWindow .java 690 Displaying Information Within a Window In the most general sense, a window is a container for information. Indeed, much of the power of the AWT comes from its support for these items.. 691 Working with Graphics The AWT supports a rich assortment of graphics methods. All graphics are drawn relative to a window. This can be the main window of an applet, a child window of an applet, or a stand-alone application window. The origin of each window is at the top-left corner and is 0,0. Coordinates are specified in pixels. 692 All output to a window takes place through a graphics context. A graphics context is encapsulated by the Graphics class and is obtained in two ways: It is passed to an applet when one of its various methods, such as paint( ) or update( ), is called. It is returned by the getGraphics( ) method of Component. 693 The Graphics class Defines a number of drawing functions. Each shape can be drawn edge-only or filled. Objects are drawn and filled in the currently selected graphics color, which is black by default. When a graphics object is drawn that exceeds the dimensions of the window, output is automatically clipped. 694 Drawing Lines Different drawing methods are: Lines are drawn by means of the drawLine( ) method, shown here: void drawLine(int startX, int startY, int endX, int endY) drawLine( ) displays a line in the current drawing color that begins at startX,startY and ends at endX,endY. 695 Drawing Rectangles The drawRect( ) and fillRect( ) methods display an outlined and filled rectangle, respectively. They are shown here: void drawRect(int top, int left, int width, int height) void fillRect(int top, int left, int width, int height) The upper-left corner of the rectangle is at top,left. The dimensions of the rectangle are specified by width and height. 696 Drawing Rectangles To draw a rounded rectangle, use drawRoundRect( ) or fillRoundRect( ), both shown here: void drawRoundRect(int top, int left, int width, int height,int xDiam, int yDiam) void fillRoundRect(int top, int left, int width, int height,int xDiam, int yDiam) 697 Drawing Rectangles A rounded rectangle has rounded corners. The upper-left corner of the rectangle is at top,left. The dimensions of the rectangle are specified by width and height. The diameter of the rounding arc along the X axis is specified by xDiam. The diameter of the rounding arc along the Y axis is specified by yDiam. 698 Drawing Ellipses and Circles To draw an ellipse, use drawOval( ). To fill an ellipse, use fillOval( ). General form is: void drawOval(int top, int left, int width, int height) void fillOval(int top, int left, int width, int height) The ellipse is drawn within a bounding rectangle whose upper-left corner is specified by top,left and whose width and height are specified by width and height. To draw a circle, specify a square as the bounding rectangle. 699 Drawing Arcs Arcs can be drawn with drawArc( ) and fillArc( ), shown here: void drawArc(int top, int left, int width, int height, int startAngle,int sweepAngle) void fillArc(int top, int left, int width, int height, int startAngle,int sweepAngle) The arc is bounded by the rectangle whose upper-left corner is specified by top,left and whose width and height are specified by width and height. 700 Drawing Arcs The arc is drawn from startAngle through the angular distance specified by sweepAngle. Angles are specified in degrees. Zero degrees is on the horizontal, at the 3 o’clock position. The arc is drawn counterclockwise if sweepAngle is positive, and clockwise if sweepAngle is negative. Therefore, to draw an arc from 12 o’clock to 6 o’clock, the start angle would be 90 and the sweep angle 180. 701 Drawing Polygons To draw arbitrarily shaped figures use drawPolygon( ) and fillPolygon( ),as shown. void drawPolygon(int x[ ], int y[ ], int numPoints) void fillPolygon(int x[ ], int y[ ], int numPoints). The polygon’s endpoints are specified by the coordinate pairs contained within the x & y arrays. The number of points defined by x and y is specified by numPoints. 702 Sizing Graphics To size a graphics object to fit the current size of the window in which it is drawn, first obtain the current dimensions of the window by calling getSize( ) on the window object. It returns the dimensions of the window encapsulated within a Dimension object. Once you have the current size of the window, you can scale your graphical output accordingly. 703 Working with Color Java supports color in a portable, deviceindependent fashion. The AWT color system allows you to specify any color you want. It then finds the best match for that color,given the limits of the display hardware currently executing your program or applet. Thus, your code does not need to be concerned with the differences in the way color is supported by various hardware devices. 704 Working with Color Color is encapsulated by the Color class. Color defines several constants (for example, Color.black) to specify a number of common colors. You can also create your own colors, using one of the color constructors. 705 Working with Color Color(int red, int green, int blue) :Takes three integers that specify the color as a mix of red, green,and blue. These values must be between 0 and 255.Eg: new Color(255, 100, 100); // light red. Color(int rgbValue) :Takes a single integer that contains the mix of red, green,and blue packed into an integer. The integer is organized with red in bits 16 to 23,green in bits 8 to 15, and blue in bits 0 to 7. 706 Working with Color Eg: 1. int newRed = (0xff000000 | (0xc0 << 16) | (0x00 << 8) | 0x00); 2. Color(float red, float green, float blue): 3. Color darkRed = new Color(newRed); Color(float, float, float), takes three float values (between 0.0 and 1.0) that specify the relative mix of red, green, and blue. 707 Once you have created a color, you can use it to set the foreground and/or background color by using the setForeground( ) and setBackground( ) methods. You can also select it as the current drawing color. 708 Color Methods The Color class defines several methods to p manipulate colors. They are :. Using Hue, Saturation, and Brightness The hue-saturation-brightness (HSB) color model is an alternative to red-green-blue (RGB) for specifying particular colors. Figuratively, hue is a wheel of color. The hue is specified with a number between 0.0 and 1.0 (the colors are approximately: red, orange,yellow, green, blue, indigo, and violet). 709 Color Methods Saturation is another scale ranging from 0.0 to 1.0, representing light pastels to intense hues. Brightness values also range from 0.0 to 1.0, where 1 is bright white and 0 is black. Color supplies two methods that let you convert between RGB and HSB. 1. static int HSBtoRGB(float hue, float saturation, float brightness) HSBtoRGB( ) returns a packed RGB value compatible with the Color(int) constructor 710 Color Methods static float[ ] RGBtoHSB(int red, int green, int blue, float values[ ])RGBtoHSB( ) returns a float array of HSB values corresponding to RGB integers. If values is not null, then this array is given the HSB values and returned. Otherwise, a new array is created and the HSB values are returned in it. In either case, the array contains the hue at index 0, saturation at index 1, and brightness at index 2. 711 getRed( ), getGreen( ), getBlue( ) You can obtain the red, green, and blue components of a color independently using getRed( ),getGreen( ),& getBlue( ),as shown: int getRed( ),int getGreen( ),int getBlue( ) Each of these methods returns the RGB color component found in the invoking Color object in the lower 8 bits of an integer. 712 Int getRGB( ):To obtain a packed, RGB version of a color, use getRGB( ). Setting the Current Graphics Color: By default, graphics objects are drawn in the current foreground color.This may be changed by calling the Graphics method setColor( ): void setColor(Color newColor) :Here, newColor specifies the new drawing color. You can obtain the current color by calling getColor( ):Color getColor( ); eg:ColorDemo.java 713 Working with Fonts The AWT supports multiple type fonts. Fonts have emerged from the domain of traditional typesetting to become an important part of computer-generated documents and displays. The AWT provides flexibility by abstracting font-manipulation operations and allowing for dynamic selection of fonts. Fonts have a family name, a logical font name, and a face name. 714 Working with Fonts The family name is the general name of the font, such as Courier. The logical name specifies a category of font, such as Monospaced. The face name specifies a specific font,such as Courier Italic. Fonts are encapsulated by the Font class. 715 Working with Fonts The Font class defines these variables: Variable Meaning String name Name of the font float pointSize Size of the font in points int size Size of the font in points int style Font style 716 Working with Fonts Creating and Selecting a Font To select a new font, you must first construct a Font object that describes that font. One Font constructor has this general form: Font(String fontName, int fontStyle, int pointSize): Here, fontName specifies the name of the desired font. The name can be specified using either the logical or face name. 717 Working with Fonts All Java environments will support the following fonts:Dialog, DialogInput, Sans Serif, Serif, Monospaced, and Symbol. Dialog is the font used by your system’s dialog boxes. Dialog is also the default if you don’t explicitly set a font. You can also use any other fonts supported by your particular environment, but these other fonts may not be universally available. 718 Working with Fonts The style of the font is specified by fontStyle. It may consist of one or more of these three constants: Font.PLAIN, Font.BOLD, and Font.ITALIC. To combine styles, OR them together. For example, Font.BOLD | Font.ITALIC specifies a bold, italics style. The size, in points, of the font is specified by pointSize. 719 Working with Fonts To use a font that you have created, you must select it using setFont( ), which is defined by Component. It has this general form:void setFont(Font fontObj) Here, fontObj is the object that contains the desired font. Eg:SampleFonts.java: The following program outputs a sample of each standard font. Each time you click the mouse within its window, a new font is selected and its name is displayed. 720 Obtaining Font Information To obtain information about the currently selected font you must first get the current font by calling getFont( ). This method is defined by the Font getFont( ) Once you have obtained the currently selected font, you can retrieve information about it using various methods defined by Font. 721 14.AWT Part II 722 Controls Controls are components that allow a user to interact with your application in various ways—for example, a commonly used control is the push button. A layout manager automatically positions components within a container. Thus, the appearance of a window is determined by a combination of the controls that it contains and the layout manager used to position them. 723 Control Fundamentals The AWT supports the following types of controls: Labels Push buttons Check boxes Choice lists Lists Scroll bars Text editing 724 Adding and Removing Controls To include a control in a window, you must add it to the window. To do this, you must first create an instance of the desired control and then add it to a window by calling add( ),which is defined by Container. The add( ) method has several forms. Component add(Component compObj)Here, compObj is an instance of the control that you want to add. A reference to compObj is returned. 725 Once a control has been added, it will automatically be visible whenever its parent window is displayed. Sometimes you will want to remove a control from a window when the control is no longer needed. To do this, call remove( ). This method is also defined by Container. general form: void remove(Component obj):Here, obj is a reference to the control you want to remove. You can remove all controls by calling removeAll( ). 726 Responding to Controls Except for labels, which are passive controls, all controls generate events when they are accessed by the user. For example, when the user clicks on a push button, an event is sent that identifies the push button. In general, your program simply implements the appropriate interface and then registers an event listener for each control that you need to monitor. 727 Labels The easiest control to use is a label. A label is an object of type Label, and it contains a string, which it displays. Labels are passive controls that do not support any interaction with the user. Label defines the following constructors: Label( ):Label(String str) :The first version creates a blank label Label(String str, int how): The second version creates a label that contains the string specified by str. 728 This string is left-justified. The third version creates a label that contains the string specified by str using the alignment specified by how. The value of how must be one of these three constants: Label.LEFT, Label.RIGHT, or Label.CENTER. 729 You can set or change the text in a label by using the setText( ) method. current label is obtained by calling getText( ). These methods are :void setText(String str) String getText( ):str specifies the new label. You can set the alignment of the string within the label by calling setAlignment( ). 730 To obtain the current alignment, call getAlignment( ). The methods are as follows:void setAlignment(int how) int getAlignment( ). Eg:LabelDemo.java 731 Using Buttons The most widely used control is the push button. A push button is a component that contains a label and that generates an event when it is pressed. Push buttons are objects of type Button. 2 constructors: Button( ) :Creates an empty button. Button(String str):Creates a button that contains str as a label. To set its label call setLabel( ). To retrieve its label by call getLabel( ). 732 Handling Buttons Each time a button is pressed, an action event is generated. This is sent to any listeners that previously registered an interest in receiving action event notifications from that component. Each listener implements the ActionListener interface. That interface defines the actionPerformed( ) method, which is called when an event occurs. An ActionEvent object is supplied as the argument to this method. It contains both a reference to the button that generated the event and a reference to the string that is the label of the button. 733 Handling Buttons Either value is used to identify the button. Each time one is pressed, a message is displayed that reports which button has been pressed. In this version, the label of the button is used to determine which button has been pressed. The label is obtained by calling the getActionCommand( ) method on the ActionEvent object passed to actionPerformed( ). eg:ButtonDemo.java 734 We can also determine which button has been pressed, by comparing the object obtained from the getSource( ). Method to the button objects that you added to the window. To do this, you must keep a list of the objects when they are added. Eg:ButtonList.java 735 Applying Check Boxes A check box is a control that is used to turn an option on or off. It consists of a small box that can either contain a check mark or not. There is a label associated with each check box that describes what option the box represents. You change the state of a check box by clicking on it. Check boxes can be used individually or as part of a group. Check boxes are objects of the Checkbox class. 736 Constructors Checkbox( ) :Creates a check box whose label is initially blank. The state of the check box is unchecked. Checkbox(String str) :The second form creates a check box whose label is specified by str.The state of the check box is unchecked. Checkbox(String str, boolean on): The third form allows you to set the initial state of the check box. If on is true, the check box is initially checked; otherwise, it is cleared. 737 Constructors Checkbox(String str, boolean on, CheckboxGroup cbGroup) Checkbox(String str, CheckboxGroup cbGroup, boolean on) Both create a check box whose label is specified by str and whose group is specified by cbGroup. If this check box is not part of a group, then cbGroup must be null. 738 Constructors The value of on determines the initial state of the check box. To retrieve the current state of a check box, call getState( ). To set its state, call setState( ). You can obtain the current label associated with a check box by calling getLabel( ). To set the label, call setLabel( ). 739 Handling Check Boxes Each time a check box is selected or deselected, an item event is generated. This is sent to any listeners that previously registered an interest in receiving item event notifications from that component. Each listener implements the ItemListener interface. That interface defines the itemStateChanged( ) method. 740 Handling Check Boxes An ItemEvent object is supplied as the argument to this method. It contains information about the event (for example, whether it was a selection or deselection). Eg: CheckboxDemo.java 741 CheckboxGroup It is possible to create a set of mutually exclusive check boxes in which one and only one check box in the group can be checked at any one time. These check boxes are often called radio buttons, because they act like the station selector on a car radio—only one station can be selected at any one time. 742 CheckboxGroup To create a set of mutually exclusive check boxes, you must first define the group to which they will belong and then specify that group when you construct the check boxes. Check box groups are objects of type CheckboxGroup. Only the default constructor is defined, which creates an empty group. You can determine which check box in a group is currently selected by calling getSelectedCheckbox( ). 743 CheckboxGroup You can set a check box by calling setSelectedCheckbox( ). These methods are as follows: Checkbox getSelectedCheckbox( ) void setSelectedCheckbox(Checkbox which): Here, which is the check box that you want to be selected. The previously selected check box will be turned off. Eg:CBGroup.java 744 Choice Controls The Choice class is used to create a pop-up list of items from which the user may choose. Thus, a Choice control is a form of menu. When inactive, a Choice component takes up only enough space to show the currently selected item. When the user clicks on it, the whole list of choices pops up, and a new selection can be made. Each item in the list is a string that appears as a left-justified label in the order it is added to the Choice object. 745 Choice Controls Choice only defines the default constructor, which creates an empty list. To add a selection to the list, call add( ). It has this general form: void add(String name) Here, name is the name of the item being added. Items are added to the list in the order in which calls to add( ) occur. 746 Choice Controls To determine which item is currently selected, you may call either getSelectedItem( ) or getSelectedIndex( ). These methods are shown here: String getSelectedItem( ) :method returns a string containing the name of the item. int getSelectedIndex( ) returns the index of the item. The first item is at index 0. 747 Choice Controls By default, the first item added to the list is selected. To obtain the number of items in the list, call getItemCount( ). You can set the currently selected item using the select( ) method with either a zero-based integer index or a string that will match a name in the list. 748 Choice Controls These methods are shown here: int getItemCount( ): void select(int index) void select(String name) Given an index, you can obtain the name associated with the item at that index by calling getItem( ), which has this general form: String getItem(int index) Here, index specifies the index of the desired item. 749 Handling Choice Lists Each time a choice is selected, an item event is generated. This is sent to any listeners that previously registered an interest in receiving item event notifications from that component. Each listener implements the ItemListener interface. That interface defines the itemStateChanged( ) method. An ItemEvent object is supplied as the argument to this method.eg: 750 Using Lists The List class provides a compact, multiplechoice, scrolling selection list. Unlike the Choice object, which shows only the single selected item in the menu, a List object can be constructed to show any number of choices in the visible window. It can also be created to allow multiple selections. List provides these constructors: List( ): Creates a List control that allows only one item to be selected at any one time. 751 Using Lists List(int numRows) :Here the value of numRows specifies the number of entries in the list that will always be visible (others can be scrolled into view as needed). List(int numRows, boolean multipleSelect): Here if multipleSelect is true, then the user may select two or more items at a time. If it is false, then only one item may be selected. 752 Using Lists To add a selection to the list, call add( ). It has the following two forms: void add(String name) :Adds items to the end of the list. void add(String name, int index) :Adds the item at the index specified by index. Here, name is the name of the item added to the list. Indexing begins at zero. You can specify –1 to add the item to the end of the list. 753 Handling Lists To process list events, the ActionListener interface is to be implemented. Each time a List item is double-clicked, an ActionEvent object is generated. Its getActionCommand( ) method can be used to retrieve the name of the newly selected item. Also, each time an item is selected or deselected with a single click, an ItemEvent object is generated. 754 Its getStateChange( ) method can be used to determine whether a selection or deselection triggered this event. getItemSelectable( ) returns a reference to the object that triggered this event. Eg:ListDemo.java 755 Managing Scroll Bars Scroll bars are used to select continuous values between a specified minimum and maximum. Scroll bars may be oriented horizontally or vertically. A scroll bar is actually a composite of several individual parts. Each end has an arrow that you can click to move the current value of the scroll bar one unit in the direction of the arrow. 756 The current value of the scroll bar relative to its minimum and maximum values is indicated by the slider box (or thumb) for the scroll bar. The slider box can be dragged by the user to a new position. The scroll bar will then reflect this value. In the background space on either side of the thumb, the user can click to cause the thumb to jump in that direction by some increment larger than 1. 757 Typically, this action translates into some form of page up and page down. Scroll bars are encapsulated by the Scrollbar class. Constructors Are: Scrollbar( ) :creates a vertical scroll bar. Scrollbar(int style): and Scrollbar(int style, int initialValue, int thumbSize, int min, int max) The second and third forms allow you to specify the orientation of the scroll bar. 758 If style is Scrollbar.VERTICAL, a vertical scroll bar is created. If style is scrollbar.HORIZONTAL, the scroll bar is horizontal. In the third form of the constructor, the initial value of the scroll bar is passed in initialValue. The number of units represented by the height of the thumb is passed in thumbSize. The minimum and maximum values for the scroll bar are specified by min and max. 759 If you construct a scroll bar by using one of the first two constructors, then you need to set its parameters by using setValues( ), shown here, before it can be used: void setValues(int initialValue, int thumbSize, int min, int max) 760 Handling Scroll Bars To process scroll bar events, you need to implement the AdjustmentListener interface. Each time a user interacts with a scroll bar, an AdjustmentEvent object is generated. Its getAdjustmentType( ) method can be used to determine the type of the adjustment. The types of adjustment events are as follows: BLOCK_DECREMENT A page-down event has been generated. 761 BLOCK_INCREMENT A page-up event has been generated. TRACK :An absolute tracking event has been generated. UNIT_DECREMENT The line-down button in a scroll bar has been pressed. UNIT_INCREMENT The line-up button in a scroll bar has been pressed. Eg:SBDemo.java 762 Using a TextField The TextField class implements a single-line text-entry area, usually called an edit control. Text fields allow the user to enter strings and to edit the text using the arrow keys, cut and paste keys, and mouse selections. TextField is a subclass of TextComponent. Constructors are: TextField( ):Creates a default text field. TextField(int numChars): Creates a text field that is numChars characters wide. 763 Using a TextField TextField(String str):Initializes the text field with the string contained in str. TextField(String str, int numChars):Initializes a text field and sets its width. To obtain the string currently contained in the text field, call getText( ). To set the text, call setText( ). Your program can obtain the currently selected text by calling getSelectedText( ). 764 Using a TextField These methods are:String getSelectedText( ) & void select(int startIndex, int endIndex) getSelectedText( ) returns the selected text. The select( ) method selects the characters beginning at startIndex and ending at endIndex–1. You can control whether the contents of a text field may be modified by the user by calling setEditable( ). 765 Using a TextField You can determine editability by calling isEditable( ). These methods are : boolean isEditable( ) :returns true if the text may be changed and false if not. void setEditable(boolean canEdit): if canEdit is true, the text may be changed. If it is false, the text cannot be altered. You can disable the echoing of the characters as they are typed by calling setEchoChar( ). 766 This method specifies a single character that the TextField will display when characters are entered(thus, the actual characters typed will not be shown). Echo character may be retrieved by calling the getEchoChar( ) method.These methods are: void setEchoChar(char ch) boolean echoCharIsSet( ) char getEchoChar( ) :Here, ch specifies the character to be echoed. eg:TextFieldDemo.java 767 Using a TextArea The AWT includes a simple multiline editor called TextArea. Constructors for TextArea: TextArea( ) TextArea(int numLines, int numChars) TextArea(String str) TextArea(String str, int numLines, int numChars) TextArea(String str, int numLines, int numChars, int sBars) 768 Using a TextArea Here, numLines specifies the height, in lines, of the text area, and numChars specifies its width, in characters. Initial text can be specified by str. In the fifth form you can specify the scroll bars that you want the control to have. sBars must be one of these values: SCROLLBARS_BOTH SCROLLBARS_NONE SCROLLBARS_HORIZONTAL_ONLY SCROLLBARS_VERTICAL_ONLY 769 Using a TextArea TextArea is a subclass of TextComponent. Therefore, it supports the getText( ),setText( ), getSelectedText( ), select( ), isEditable( ), and setEditable( ). TextArea adds the following methods: void append(String str) void insert(String str, int index) void replaceRange(String str, int startIndex, int endIndex): eg:TextAreaDemo.java 770 Understanding Layout Managers A layout manager automatically arranges your controls within a window by using some type of algorithm. Each Container object has a layout manager associated with it. A layout manager is an instance of any class that implements the LayoutManager interface. The layout manager is set by the setLayout( ) method. 771 Understanding Layout Managers If no call to setLayout( ) is made, then the default layout manager is used. Whenever a container is resized (or sized for the first time), the layout manager is used to position each of the components within it. The setLayout( ) method has the following general form: void setLayout(LayoutManager layoutObj) Here, layoutObj is a reference to the desired layout manager. 772 To disable the layout manager and position components manually, pass null for layoutObj. If you do this, you will need to determine the shape and position of each component manually,using the setBounds( ) method defined by Component. Each layout manager keeps track of a list of components that are stored by their names. The layout manager is notified each time you add a component to a container. 773 FlowLayout It is the default layout manager. FlowLayout implements a simple layout style, which is similar to how words flow in a text editor. Components are laid out from the upper-left corner, left to right and top to bottom. When no more components fit on a line, the next one appears on the next line. 774 FlowLayout A small space is left between each component, above and below, as well as left and right. Here are the constructors: FlowLayout( ):Creates the default layout, which centers components and leaves five pixels of space between each component. FlowLayout(int how): lets you specify how each line is aligned. Valid values for how are as follows: FlowLayout.LEFT, FlowLayout.CENTER,FlowLayout.RIGHT 775 FlowLayout These values specify left, center, and right alignment, respectively. FlowLayout(int how, int horz, int vert) Allows you to specify the horizontal and vertical space left between components in horz and vert, respectively. Eg:FlowLayoutDemo.java 776 BorderLayout The BorderLayout class implements a common layout style for top-level windows. It has four narrow, fixed-width components at the edges and one large area in the center. The four sides are referred to as north, south, east, and west. The middle area is called the center. Here are the constructors defined by BorderLayout: 777 BorderLayout( ):creates a default borderlayout. BorderLayout(int horz, int vert):allows you to specify the horizontal and vertical space left between components in horz and vert, respectively. BorderLayout defines the following constants that specify the regions: BorderLayout.CENTER BorderLayout.SOUTH BorderLayout.EAST BorderLayout.WEST BorderLayout.NORTH. Eg:BorderLayoutDemo 778 Using Insets Sometimes you will want to leave a small amount of space between the container that holds your components and the window that contains it. To do this, override the getInsets( ) method that is defined by Container. This function returns an Insets object that contains the top, bottom, left, and right inset to be used when the container is displayed. These values are used by the layout manager to inset the components when it lays out the 779 window. GridLayout GridLayout lays out components in a twodimensional grid. When you instantiate a GridLayout, you define the number of rows and columns. The constructors are: GridLayout(): creates a single-column grid layout. GridLayout(int numRows, int numColumns ) :creates a grid layout with the specified number of rows and columns. 780 GridLayout(int numRows, int numColumns, int horz, int vert):allows you to specify the horizontal and vertical space left between components in horz and vert,respectively. Either numRows or numColumns can be zero. Specifying numRows as zero allows for unlimited-length columns. Specifying numColumns as zero allows for unlimitedlength rows. 781 Menu Bars and Menus A top-level window can have a menu bar associated with it. A menu bar displays a list of top-level menu choices. Each choice is associated with a drop-down menu. This concept is implemented in Java by the following classes: MenuBar, Menu, and MenuItem. Each Menu object in the menu bar contains a list of MenuItem objects. Each MenuItem object represents something that can be selected by the user. 782 These are menu options of type CheckboxMenuItem and will have a check mark next to them when they are selected. To create a menu bar, first create an instance of MenuBar. This class only defines the default constructor. Next, create instances of Menu that will define the selectionsdisplayed on the bar. Following are the constructors for Menu:Menu( ),Menu(String optionName) Menu(String optionName, boolean removable) 783 Here, optionName specifies the name of the menu selection. If removable is true, the popup menu can be removed and allowed to float free. Otherwise, it will remain attached to the menu bar. (Removable menus are implementation-dependent.) The first form creates an empty menu. Individual menu items are of type MenuItem. It defines these constructors: 784 MenuItem( ) MenuItem(String itemName) MenuItem(String itemName, MenuShortcut keyAccel) Here, itemName is the name shown in the menu, and keyAccel is the menu shortcut for this item. You can disable or enable a menu item by using the setEnabled( ) method. Its form is shown here: 785 void setEnabled(boolean enabledFlag) If the argument enabledFlag is true, the menu item is enabled. If false, the menu item is disabled. You can determine an item’s status by calling isEnabled( ). This method is shown here: boolean isEnabled( ) isEnabled( ) returns true if the menu item on which it is called is enabled. Otherwise, it returns false. 786 You can change the name of a menu item by calling setLabel( ). You can retrieve the current name by using getLabel( ). These methods are as follows: void setLabel(String newName) String getLabel( ) Here, newName becomes the new name of the invoking menu item. getLabel( ) returns the current name. 787 Dialog Boxes Dialog box is used to hold a set of related controls. Dialog boxes are primarily used to obtain user input. They are similar to frame windows, except that dialog boxes are always child windows of a top-level window. Also, dialog boxes don’t have menu bars. In other respects, dialog boxes function like frame windows. 788 Dialog boxes may be modal or modeless. When a modal dialog box is active, all input is directed to it until it is closed. This means that you cannot access other parts of your program until you have closed the dialog box. 789 When a modeless dialog box is active, input focus can be directed to another window in your program. Thus, other parts of your program remain active and accessible. Dialog boxes are of type Dialog. 790 15.SWING 791 AbstractButton ButtonGroup ImageIcon JApplet JButton JCheckBox JComboBox list Abstract superclass for Swing buttons. Encapsulates a mutually exclusive set of buttons. Encapsulates an icon. The Swing version of Applet. The Swing push button class. The Swing check box class. Encapsulates a combo box (an combination of a drop-down and text field). 792 JLabel JRadioButton JScrollPane JTabbedPane JTable JTextField JTree The Swing version of a label. The Swing version of a radio button. Encapsulates a scrollable window. Encapsulates a tabbed window. Encapsulates a table-based control. The Swing version of a text field. Encapsulates a tree-based control. 793 JApplet Fundamental to Swing is the JApplet class, which extends Applet. Applets that use Swing must be subclasses of JApplet. JApplet is rich with functionality that is not found in Applet. For example, JApplet supports various “panes,” such as the content pane, the glass pane, and the root pane. 794 When adding a component to an instance of JApplet, do not invoke the add( ) method of the applet. Instead, call add( ) for the content pane of the JApplet object. The content pane can be obtained via the method - Container getContentPane( ) The add( ) method of Container can be used to add a component to a content pane. void add(comp):Here, comp is the component to be added to the content pane. 795 Icons and Labels In Swing, icons are encapsulated by the ImageIcon class, which paints an icon from an image. Two of its constructors are shown here: ImageIcon(String filename) ImageIcon(URL url) The first form uses the image in the file named filename. The second form uses the image in the resource identified by url. 796 ImageIcon The ImageIcon class implements the Icon interface that declares the methods: int getIconHeight( ) :Returns the height of the icon in pixels. int getIconWidth( ) Returns the width of the icon in pixels. void paintIcon(Component comp, Graphics g, int x, int y) 797 Paints the icon at position x, y on the graphics context g. Additional information about the paint operation can be provided in comp. Swing labels are instances of the JLabel class, which extends JComponent. It can display text and/or an icon. Some of its constructors are shown here: JLabel(Icon i),Label(String s) JLabel(String s, Icon i, int align) 798 Here, s and i are the text and icon used for the label. The align argument is either LEFT,RIGHT, CENTER, LEADING, or TRAILING. These constants are defined in the,SwingConstants interface, along with several others used by the Swing classes. The icon and text associated with the label can be read and written by the following methods:Icon getIcon( ),String getText( ),void setIcon(Icon i),void setText(String s),Here, i and s are the icon and text, respectively. 799 Text Fields The Swing text field is encapsulated by the JTextComponent class, which extends JComponent. It provides functionality that is common to Swing text components. One of its subclasses is JTextField, which allows you to edit one line of text. JTextField( ) : Here, s is the string to be presented, and cols is the number of columns in the text field. JTextField(String s) JTextField(int cols) JTextField(String s, int cols) 800 Buttons Swing buttons provide features that are not found in the Button class defined by the AWT. For example, you can associate an icon with a Swing button. Swing buttons are subclasses of the AbstractButton class, which extends JComponent. AbstractButton contains many methods that allow you to control the behavior of buttons, check boxes, and radio buttons. For example, you can define different icons that are displayed for the component when it is disabled, pressed, or selected. 801 Buttons The following are the methods that control this behavior: void setDisabledIcon(Icon di) void setPressedIcon(Icon pi) void setSelectedIcon(Icon si) void setRolloverIcon(Icon ri) Here, di, pi, si, and ri are the icons to be used for these different conditions. 802 Buttons The text associated with a button can be read and written via the following methods: String getText( ),void setText(String s) Here, s is the text to be associated with the button. Concrete subclasses of AbstractButton generate action events when they are pressed. Listeners register and unregister for these events via the methods shown here: void addActionListener(ActionListener al) void removeActionListener(ActionListener al) 803 Buttons Here, al is the action listener.AbstractButton is a superclass for push buttons, check boxes, and radio buttons. The JButton Class The JButton class provides the functionality of a push button. JButton allows an icon,a string, or both to be associated with the push button. constructors : JButton(Icon i),JButton(String s) JButton(String s, Icon i) Here, s and i are the string and icon used for the button. 804 Check Boxes The JCheckBox class, which provides the functionality of a check box, is a concrete implementation of AbstractButton. Its immediate superclass is JToggleButton, which provides support for two-state buttons. constructors are :JCheckBox(Icon i), JCheckBox(Icon i, boolean state) JCheckBox(String s),JCheckBox(String s, boolean state),JCheckBox(String s, Icon i) JCheckBox(String s, Icon i, boolean state) 805 Check Boxes Here, i is the icon for the button. The text is specified by s. If state is true, the check box is initially selected. Otherwise, it is not. The state of the check box can be changed via the following method: void setSelected(boolean state) Here, state is true if the check box should be checked. 806 Radio Buttons Radio buttons are supported by the JRadioButton class, which is a concrete implementation of AbstractButton. Its immediate superclass is JToggleButton, which provides support for two-state buttons. constructors are : JRadioButton(Icon i), JRadioButton(Icon i, boolean state) JRadioButton(String s), JRadioButton(String s, boolean state) JRadioButton(String s, Icon i) 807 JRadioButton(String s, Icon i, boolean state) Here, i is the icon for the button. The text is specified by s. If state is true, the button is initially selected. Otherwise, it is not. Radio buttons must be configured into a group. Only one of the buttons in that group can be selected at any time. 808 The ButtonGroup class is instantiated to create a button group. Its default constructor is invoked for this purpose. Elements are then added to the button group via the following method: void add(AbstractButton ab) Here, ab is a reference to the button to be added to the group. 809 Combo Boxes Swing provides a combo box (a combination of a text field and a drop-down list) through the JComboBox class, which extends JComponent. A combo box normally displays one entry. However, it can also display a drop-down list that allows a user to select a different entry. You can also type your selection into the text field. constructors are JComboBox( ) 810 JComboBox(Vector v) Here, v is a vector that initializes the combo box. Items are added to the list of choices via the addItem( ) method, whose signature is shown here: void addItem(Object obj) Here, obj is the object to be added to the combo box. 811 Tabbed Panes A tabbed pane is a component that appears as a group of folders in a file cabinet. Each folder has a title. When a user selects a folder, its contents become visible. Only one of the folders may be selected at a time. Tabbed panes are commonly used for setting configuration options. Tabbed panes are encapsulated by the JTabbedPane class, which extends JComponent. 812 Tabs are defined via the following method: void addTab(String str, Component comp) Here, str is the title for the tab, and comp is the component that should be added to the tab. Typically, a JPanel or a subclass of it is added. The general procedure to use a tabbed pane in an applet is outlined here:1. Create a JTabbedPane object. 813 2. Call addTab( ) to add a tab to the pane. (The arguments to this method define the title of the tab and the component it contains.) 3. Repeat step 2 for each tab. 4. Add the tabbed pane to the content pane of the applet. 814 Scroll Panes Is a component that presents a rectangular area in which a component may be viewed. Horizontal and/or vertical scroll bars may be provided if necessary. Scroll panes are implemented in Swing by the JScrollPane class, which extends JScrollPane(Component comp) JScrollPane(int vsb, int hsb) JScrollPane(Component comp, int vsb, int hsb) Here, comp is the component to be added to the scroll pane. vsb and hsb are int 815 constants that define when vertical and horizontal scroll bars for this scroll pane are given next: These constants are defined by the ScrollPaneConstants interface. Some examples of these constants are described as follows: 1.HORIZONTAL_SCROLLBAR_ALWAYS :Always provide horizontal scroll bar 2.HORIZONTAL_SCROLLBAR_AS_NEEDED : Provide horizontal scroll bar,if needed. 3.VERTICAL_SCROLLBAR_ALWAYS:Always provide vertical scroll bar 816 4. VERTICAL_SCROLLBAR_AS_NEEDED Provide vertical scroll bar. if needed Here are the steps that you should follow to use a scroll pane in an applet: 1. Create a JComponent object. 2. Create a JScrollPane object. (The arguments to the constructor specify the component and the policies for vertical and horizontal scroll bars.) 3. Add the scroll pane to the content pane of the applet 817 Trees A tree is a component that presents a hierarchical view of data. A user has the ability to expand or collapse individual subtrees in this display. Trees are implemented in Swing by the JTree class, which extends JComponent. Some of its constructors are : JTree(Hashtable ht): Creates a tree in which each element of the hash table ht is a child node. 818 JTree(Object obj[ ]): Each element of the array obj is a child node Here. JTree(TreeNode tn) :The tree node tn is the root of the tree in this form. JTree(Vector v):This form uses the elements of vector v as child nodes. 819 A JTree object generates events when a node is expanded or collapsed. The addTreeExpansionListener( ) and removeTreeExpansionListener( ) methods allow listeners to register and unregister for these notifications. The signatures of these methods are shown : void addTreeExpansionListener(TreeExpansionListener tel) Void removeTreeExpansionListener(TreeExpansionListen er tel) Here, tel is the listener object. 820 The getPathForLocation( ) method is used to translate a mouse click on a specific point of the tree to a tree path. Its signature is shown here: TreePath getPathForLocation(int x, int y) Here, x and y are the coordinates at which the mouse is clicked. The return value is a TreePath object that encapsulates information about the tree node that was selected by the user. 821 Tables A table is a component that displays rows and columns of data. You can drag the cursor on column boundaries to resize columns. You can also drag a column to a new position. Tables are implemented by the JTable class, which extends JComponent. One of its constructors is shown here: JTable(Object data[ ][ ], Object colHeads[ ]) Here, data is a two-dimensional array of the information to be presented, and colHeads is a one-dimensional array with the column 822 headings. Here are the steps for using a table in an applet: 1. Create a JTable object. 2. Create a JScrollPane object. (The arguments to the constructor specify the table and the policies for vertical and horizontal scroll bars.) 3. Add the table to the scroll pane. 4. Add the scroll pane to the content pane of the applet. 823 16. String Handling 824 String Java implements strings as objects of type String. when you create a String object, you are creating a string that cannot be changed. That is, once a String object has been created, you cannot change the characters that comprise that string. Both the String and StringBuffer classes are defined in java.lang. Thus, they are available to all programs automatically. Both are declared final, which means that neither of these classes may be subclassed. 825 The String Constructors The String class supports several constructors. To create an empty String, you call the default constructor. For example, String s = new String(); will create an instance of String with no characters in it. Frequently, you will want to create strings that have initial values. 826 The String class provides a variety of constructors to handle this. To create a String initialized by an array of characters, use the constructor shown here: String(char chars[ ]) Here is an example: char chars[] = { 'a', 'b', 'c' }; String s = new String(chars); This constructor initializes s with the string “abc”. 827 You can specify a subrange of a character array as an initializer using the following constructor: String(char chars[ ], int startIndex, int numChars): Here, startIndex specifies the index at which the subrange begins, and numChars specifies the number of characters to use. Here is an example: char chars[] = { 'a', 'b', 'c', 'd', 'e', 'f' }; String s = new String(chars, 2, 3); This initializes s with the characters cde. 828 You can construct a String object that contains the same character sequence as another String object using this constructor: String(String strObj) Here, strObj is a String object. Consider this example: // Construct one String from another. class MakeString { public static void main(String args[]) { char c[] = {'J', 'a', 'v', 'a'}; 829 String s1 = new String(c); String s2 = new String(s1); System.out.println(s1); System.out.println(s2); } } The output from this program is as follows: Java Java 830 String Length The length of a string is the number of characters that it contains. To obtain this value, call the length( ) method, shown here: int length( ) The following fragment prints “3”, since there are three characters in the string s: char chars[] = { 'a', 'b', 'c' }; String s = new String(chars); System.out.println(s.length()); 831 Special String Operations Because strings are a common and important part of programming, Java has added special support for several string operations within the syntax of the language. These operations include the automatic creation of new String instances from string literals,concatenation of multiple String objects by use of the + operator, and the conversion of other data types to a string representation. 832 There are explicit methods available to perform all of these functions, but Java does them automatically as a convenience for the programmer and to add clarity. 833 String Literals However, there is an easier way to do this using to create a String instance from an array of a string literal. For each string literal in your program, Java automatically constructs a String object. Thus, you can use a string literal to initialize a String object. For example,the following code fragment creates two equivalent strings: char chars[] = { 'a', 'b', 'c' }; String s1 = new String(chars); String s2 = "abc"; // use string literal 834 Because a String object is created for every string literal, you can use a string literal any place you can use a String object. For example, you can call methods directly on a quoted string as if it were an object reference, as the following statement shows. It calls the length( ) method on the string “abc”. As expected, it prints “3”. System.out.println("abc".length()); 835 String Concatenation In general, Java does not allow operators to be applied to String objects. The one exception to this rule is the + operator, which concatenates two strings, producing a String object as the result. This allows you to chain together a series of + operations. For example, the following fragment concatenates three strings: String age = "9"; String s = "He is " + age + " years old."; 836 System.out.println(s); This displays the string “He is 9 years old.” One practical use of string concatenation is found when you are creating very long strings. Instead of letting long strings wrap around within your source code, you can break them into smaller pieces, using the + to concatenate them 837 // Using concatenation to prevent long lines. class ConCat { public static void main(String args[]) { String longStr = "This could have been " + "a very long line that would have " + "wrapped around. But string concatenation " + "prevents this."; System.out.println(longStr);}} 838 String Concatenation with Other Data Types You can concatenate strings with other types of data. For example, consider this slightly different version of the earlier example: int age = 9; String s = "He is " + age + " years old."; System.out.println(s); In this case, age is an int rather than another String, but the output produced is the same as before. 839 This is because the int value in age is automatically converted into its string representation within a String object. This string is then concatenated as before. The compiler will convert an operand to its string equivalent whenever the other operand of the + is an instance of String. Be careful when you mix other types of operations with string concatenation expressions, however. 840 String Conversion and toString( ) When Java converts data into its string representation during concatenation, it does so by calling one of the overloaded versions of the string conversion method valueOf( ) defined by String. valueOf( ) is overloaded for all the simple types and for type Object. For the simple types, valueOf( ) returns a string that contains the human-readable equivalent of the value with which it is called. 841 For objects, valueOf( ) calls the toString( ) method on the object. Here, let’s examine the toString( ) method, because it is the means by which you can determine the string representation for objects of classes that you create. Every class implements toString( ) because it is defined by Object. However, the default implementation of toString( ) is seldom sufficient. 842 For most important classes that you create, you will want to override toString( ) and provide your own string representations. Fortunately, this is easy to do. The toString( ) method has this general form: String toString( ) To implement toString( ), simply return a String object that contains the humanreadable string that appropriately describes an object of your class. 843 By overriding toString( ) for classes that you create, you allow them to be fully integrated into Java’s programming environment. For example, they can be used in print( ) and println( ) statements and in concatenation expressions. 844 Character Extraction The String class provides a number of ways in which characters can be extracted from a String object. Although the characters that comprise a string within a String object cannot be indexed as if they were a character array, many of the String methods employ an index (or offset) into the string for their operation. Like arrays, the string indexes begin at zero. 845 charAt( ) To extract a single character from a String, you can refer directly to an individual character via the charAt( ) method. It has this general form:char charAt(int where) Here, where is the index of the character that you want to obtain. The value of where must be nonnegative and specify a location within the string. charAt( ) returns the character at the specified location. 846 For example, char ch; ch = "abc".charAt(1); assigns the value “b” to ch getChars( ) 847 If you need to extract more than one character at a time, you can use the getChars( ) method. It has this general form: void getChars(int sourceStart, int sourceEnd, char target[ ], int targetStart) Here, sourceStart specifies the index of the beginning of the substring, and sourceEnd specifies an index that is one past the end of the desired substring. 848 Thus, the substring contains the characters from sourceStart through sourceEnd–1. The array that will receive the characters is specified by target. The index within target at which the substring will be copied is passed in targetStart. Care must be taken to assure that the target array is large enough to hold the number of characters in the specified substring. 849 The following program demonstrates getChars( ): class getCharsDemo { public static void main(String args[]) {String s = "This is a demo of the getChars method."; int start = 10;int end = 14; char buf[] = new char[end - start]; s.getChars(start, end, buf, 0); System.out.println(buf);}} 850 getBytes( ): There is an alternative to getChars( ) that stores the characters in an array of bytes. This method is called getBytes( ), and it uses the default character-to-byte conversions provided by the platform. Here is its simplest form: byte[ ] getBytes( ) Other forms of getBytes( ) are also available. 851 getBytes( ) is most useful when you are exporting a String value into an environment that does not support 16-bit Unicode characters. For example, most Internet protocols and text file formats use 8-bit ASCII for all text interchange. toCharArray( ) If you want to convert all the characters in a String object into a character array, the easiest way is to call toCharArray( ). 852 It returns an array of characters for the entire string. It has this general form: char[ ] toCharArray( ) This function is provided as a convenience, since it is possible to use getChars( ) to achieve the same result. String Comparison The String class includes several methods that compare strings or substrings within strings.equals( ) and equalsIgnoreCase( ) 853 To compare two strings for equality, use equals( ). It has this general form: boolean equals(Object str) Here, str is the String object being compared with the invoking String object. It returns true if the strings contain the same characters in the same order, and false otherwise. The comparison is case-sensitive. 854 To perform a comparison that ignores case differences, call equalsIgnoreCase( ). When it compares two strings, it considers AZ to be the same as a-z. It has this general form: boolean equalsIgnoreCase(String str) Here, str is the String object being compared with the invoking String object. It, too, returns true if the strings contain the same characters in the same order, and false otherwise. 855 regionMatches( ):The regionMatches( ) method compares a specific region inside a string with another specific region in another string. There is an overloaded form that allows you to ignore case in such comparisons. Here are the general forms for these two methods: boolean regionMatches(int startIndex, String str2,int str2StartIndex, int numChars) 856 boolean regionMatches(boolean ignoreCase, int startIndex, String str2, int str2StartIndex, int numChars) For both versions, startIndex specifies the index at which the region begins within the invoking String object. The String being compared is specified by str2. The index at which the comparison will start within str2 is specified by str2StartIndex. 857 The length of the substring being compared is passed in numChars. In the second version, if ignoreCase is true, the case of the characters is ignored. Otherwise, case is significant. startsWith( ) and endsWith( ) String defines two routines that are, more or less, specialized forms of regionMatches( ). The startsWith( ) method determines whether a given String begins with a specified string. 858 Conversely, endsWith( ) determines whether the String in question ends with a specified string. They have the following general forms:boolean startsWith(String str) boolean endsWith(String str) Here, str is the String being tested. If the string matches, true is returned. Otherwise, false is returned. For example, "Foobar".endsWith("bar") and "Foobar".startsWith("Foo")are both true. 859 A second form of startsWith( ), shown here, lets you specify a starting point: boolean startsWith(String str, int startIndex) Here, startIndex specifies the index into the invoking string at which point the search will begin. For example, "Foobar".startsWith("bar", 3) returns true equals( ) Versus == 860 It is important to understand that the equals( ) method and the == operator perform two different operations. As just explained, the equals( ) method compares the characters inside a String object. The == operator compares two object references to see whether they refer to the same instance. The following program shows how two different String objects can contain the same characters, but references to these objects will not compare as equal: 861 // equals() vs == class EqualsNotEqualTo { public static void main(String args[]) { String s1 = "Hello"; String s2 = new String(s1); System.out.println(s1 + " equals " + s2 + " > " + s1.equals(s2)); System.out.println(s1 + " == " + s2 + " -> " + (s1 == s2));} } 862 The variable s1 refers to the String instance created by “Hello”. The object referred to by s2 is created with s1 as an initializer. Thus, the contents of the two String objects are identical, but they are distinct objects. This means that s1 and s2 do not refer to the same objects and are, therefore, not ==, as is shown here by the output of the preceding example: Hello equals Hello -> true Hello == Hello -> false 863 compareTo( ) Often, it is not enough to simply know whether two strings are identical. For sorting applications, you need to know which is less than, equal to, or greater than the next. A string is less than another if it comes before the other in dictionary order. A string is greater than another if it comes after the other in dictionary order. The String method compareTo( ) serves this purpose. 864 It has this general form: int compareTo(String str) Here, str is the String being compared with the invoking String. The result of the comparison is returned and is interpreted as shown here:Value Meaning Less than zero The invoking string is less than str.Greater than zero The invoking string is greater than str.Zero The two strings are equal.Here is a sample program that sorts an array of strings 865 If you want to ignore case differences when comparing two strings, use compareToIgnoreCase( ), shown here: int compareToIgnoreCase(String str) This method returns the same results as compareTo( ), except that case differences are ignored. 866 Searching Strings The String class provides two methods that allow you to search a string for a specifiedcharacter or substring: indexOf( ) Searches for the first occurrence of a character or substring. lastIndexOf( ) Searches for the last occurrence of a character or substring. These two methods are overloaded in several different ways. 867 In all cases, the methods return the index at which the character or substring was found, or –1 on failure. To search for the first occurrence of a character, use int indexOf(int ch) To search for the last occurrence of a character, use int lastIndexOf(int ch) Here, ch is the character being sought. 868 To search for the first or last occurrence of a substring, use int indexOf(String str) int lastIndexOf(String str) Here, str specifies the substring. You can specify a starting point for the search using these forms: int indexOf(int ch, int startIndex) int lastIndexOf(int ch, int startIndex) int indexOf(String str, int startIndex) int lastIndexOf(String str, int startIndex) 869 Here, startIndex specifies the index at which point the search begins. For indexOf( ), the search runs from startIndex to the end of the string. For lastIndexOf( ), the search runs from startIndex to zero. indexOfDemo.java 870 Modifying a String Because String objects are immutable, whenever you want to modify a String, you must either copy it into a StringBuffer or use one of the following String methods, which will construct a new copy of the string with your modifications complete. substring( ) You can extract a substring using substring( ). It has two forms. The first is String substring(int startIndex) 871 Here, startIndex specifies the index at which the substring will begin. This form returns a copy of the substring that begins at startIndex and runs to the end of the invoking string. The second form of substring( ) allows you to specify both the beginning and ending index of the substring: String substring(int startIndex, int endIndex) 872 Here, startIndex specifies the beginning index, and endIndex specifies the stopping point. The string returned contains all the characters from the beginning index, up to, but not including, the ending index. StringReplace.java 873 concat( ):You can concatenate two strings using concat( ), shown here: String concat(String str) This method creates a new object that contains the invoking string with the contents of str appended to the end. concat( ) performs the same function as +. For example, String s1 = "one"; String s2 = s1.concat("two"); puts the string “onetwo” into s2. 874 It generates the same result as the following sequence:String s1 = "one"; String s2 = s1 + "two"; replace( ) The replace( ) method replaces all occurrences of one character in the invoking string with another character. It has the following general form: String replace(char original, char replacement) 875 Here, original specifies the character to be replaced by the character specified by replacement. The resulting string is returned. For example, String s = "Hello".replace('l', 'w'); puts the string “Hewwo” into s. trim( ): The trim( ) method returns a copy of the invoking string from which any leading and trailing whitespace has been removed. It has this general form:String trim( ) 876 Here is an example: String s = " Hello World ".trim(); This puts the string “Hello World” into s. The trim( ) method is quite useful when you process user commands. For example,the following program prompts the user for the name of a state and then displays that state’s capital. It uses trim( ) to remove any leading or trailing whitespace that may have inadvertently been entered by the user.eg:”UseTrim.java” 877 Data Conversion Using valueOf( ) The valueOf( ) method converts data from its internal format into a human-readable form. It is a static method that is overloaded within String for all of Java’s built-in types,so that each type can be converted properly into a string. valueOf( ) is also overloaded for type Object, so an object of any class type you create can also be used as an argument. 878 Here are a few of its forms: static String valueOf(double num) static String valueOf(long num) static String valueOf(Object ob) static String valueOf(char chars[ ]): valueOf( ) :is called when a string representation of some other type of data is needed—for example, during concatenation operations. 879 You can call this method directly with any data type and get a reasonable String representation. All of the simple types are converted to their common String representation. Any object that you pass to valueOf( ) will return the result of a call to the object’s toString( ) method. In fact, you could just call toString( ) directly and get the same result. 880 Changing the Case of Characters Within a String: The method toLowerCase( ) converts all the characters in a string from uppercase to lowercase. The toUpperCase( ) method converts all the characters in a string from lowercase to uppercase. Nonalphabetical characters, such as digits, are unaffected. 881 Here are the general forms of these methods: String toLowerCase( ) String toUpperCase( ) Both methods return a String object that contains the uppercase or lowercase equivalent of the invoking String. Here is an example that uses toLowerCase( ) and toUpperCase( ): Eg:ChangeCase.java 882 StringBuffer StringBuffer is a peer class of String that provides much of the functionality of strings. String represents fixed-length, immutable character sequences. In contrast,StringBuffer represents growable and writeable character sequences. StringBuffer may have characters and substrings inserted in the middle or appended to the end. 883 StringBuffer will automatically grow to make room for such additions and often has more characters preallocated than are actually needed, to allow room for growth. StringBuffer Constructors StringBuffer( ) :reserves room for 16 characters without reallocation. StringBuffer(int size) :Accepts an integer argument that explicitly sets the size of the buffer. 884 StringBuffer(String str):accepts a String argument that sets the initial contents of the StringBuffer object and reserves room for 16 more characters without reallocation. StringBuffer allocates room for 16 additional characters when no specific buffer length is requested, because reallocation is a costly process in terms of time. Also, frequent reallocations can fragment memory. 885 By allocating room for a few extra characters, StringBuffer reduces the number of reallocations that take place. length( ) and capacity( ) The current length of a StringBuffer can be found via the length( ) method, while the total allocated capacity can be found through the capacity( ) method. They have the following general forms: int length( ) int capacity( ) 886 example:// StringBuffer length vs. capacity. class StringBufferDemo { public static void main(String args[]) { StringBuffer sb = new StringBuffer("Hello"); System.out.println("buffer = " + sb); System.out.println("length = " + sb.length()); System.out.println("capacity = " + sb.capacity());}} 887 Here is the output of this program, which shows how StringBuffer reserves extra space for additional manipulations: buffer = Hello length = 5 capacity = 21 Since sb is initialized with the string “Hello” when it is created, its length is 5. Its capacity is 21 because room for 16 additional characters is automatically added. 888 ensureCapacity( ):If you want to preallocate room for a certain number of characters after a StringBuffer has been constructed, you can use ensureCapacity( ) to set the size of the buffer. General form: void ensureCapacity(int capacity) Here, capacity specifies the size of the buffer. setLength( ): To set the length of the buffer within a StringBuffer object, use setLength( ). 889 Its general form is shown here: void setLength(int len): Here, len specifies the length of the buffer. This value must be nonnegative. When you increase the size of the buffer, null characters are added to the end of the existing buffer. If you call setLength( ) with a value less than the current value returned by length( ), then the characters stored beyond the new length will be lost. 890 The setCharAtDemo sample program in the following section uses setLength( ) to shorten a StringBuffer. charAt( ) and setCharAt( ) The value of a single character can be obtained from a StringBuffer via the charAt( ) method. You can set the value of a character within a StringBuffer using setCharAt( ). 891 Their general forms are shown here: char charAt(int where) void setCharAt(int where, char ch) For charAt( ), where specifies the index of the character being obtained. For setCharAt( ), where specifies the index of the character being set, and ch specifies the new value of that character. For both methods, where must be nonnegative and must not specify a location beyond the end of the buffer. 892 // Demonstrate charAt() and setCharAt(). class setCharAtDemo { public static void main(String args[]) { StringBuffer sb = new StringBuffer("Hello"); System.out.println("buffer before = " + sb); System.out.println("charAt(1) before = " + sb.charAt(1)); sb.setCharAt(1, 'i');sb.setLength(2); System.out.println("buffer after = " + sb); System.out.println("charAt(1) after = " + sb.charAt(1));}} 893 Here is the output generated by this program: buffer before = Hello charAt(1) before = e buffer after = Hi charAt(1) after = i 894 getChars( ) To copy a substring of a StringBuffer into an array, use the getChars( ) method. It has this general form: void getChars(int sourceStart, int sourceEnd, char target[ ],int targetStart) Here, sourceStart specifies the index of the beginning of the substring, and sourceEnd specifies an index that is one past the end of the desired substring. 895 The substring contains the characters from sourceStart through sourceEnd–1. The array that will receive the characters is specified by target. The index within target at which the substring will be copied is passed in targetStart. Care must be taken to assure that the target array is large enough to hold the number of characters in the specified substring. 896 append( ) The append( ) method concatenates the string representation of any other type of data to the end of the invoking StringBuffer object. String.valueOf( ) is called for each parameter to obtain its string representation. The result is appended to the current StringBuffer object. The buffer itself is returned by each version of append( ). 897 insert( ) The insert( ) method inserts one string into another. It is overloaded to accept values of all the simple types, plus Strings and Objects. Like append( ), it calls String.valueOf( ) to obtain the string representation of the value it is called with. This string is then inserted into the invoking StringBuffer object. These are a few of its forms: StringBuffer insert(int index, String str) StringBuffer insert(int index, char ch) 898 StringBuffer insert(int index, Object obj) Here, index specifies the index at which point the string will be inserted into the invoking StringBuffer object. reverse( ) You can reverse the characters within a StringBuffer object using reverse( ), shown here:StringBuffer reverse( ) 899 delete( ) and deleteCharAt( ) StringBuffer delete(int startIndex, int endIndex) StringBuffer deleteCharAt(int loc) The delete( ) method deletes a sequence of characters from the invoking object. Here, startIndex specifies the index of the first character to remove, and endIndex specifies an index one past the last character to remove. 900 Thus, the substring deleted runs from startIndex to endIndex–1. The resulting StringBuffer object is returned. The deleteCharAt( ) method deletes the character at the index specified by loc. It returns the resulting StringBuffer object. 901 replace( ):It replaces one set of characters with another set inside a StringBuffer object. StringBuffer replace(int startIndex, int endIndex, String str) The substring being replaced is specified by the indexes startIndex and endIndex. Thus, the substring at startIndex through endIndex–1 is replaced. The replacement string is passed in str. 902 substring( ): Returns a portion of a StringBuffer. It has the following two forms: String substring(int startIndex) String substring(int startIndex, int endIndex) The first form returns the substring that starts at startIndex and runs to the end of the invoking StringBuffer object. The second form returns the substring that starts at startIndex and runs through endIndex–1. 903 17. JDBC 904 18. Networking 905 Thank You ... 906