Академический Документы
Профессиональный Документы
Культура Документы
-
2012
681.3.06
32.973.26-018.2
12
. .
12
:
.
.
ISBN 978-5-9775-0735-6
. ., 2011
, "-", 2011
.......................................................................................................................... 19
Java? .............................................................................................................................. 20
............................................................................................................................ 21
Java- ...................................................................................................... 24
JDK? .............................................................................................................................. 25
JRE? .............................................................................................................................. 27
JDK? .................................................................................................................... 27
JDK? ................................................................................................................ 28
Java....................................................................................................... 30
Microsoft............................................................................................................. 30
Java ........................................................................................................................... 31
Java ........................................................................................................................ 32
............................................................................................................................... 33
I. JAVA ....................................... 35
1. , ...................................... 37
Java ............................................................................................................ 37
................................................................................................................................. 40
..................................................................................................................................... 42
...................................................................................................................................... 42
..................................................................................................................................... 42
..................................................................................................................... 43
................................................................................................................................. 43
.................................................................................................................................... 44
............................................................................................................................................. 45
..................................................................................... 45
..................................................................................................................... 47
............................................................................................................ 47
........................................................................................................................... 48
............................................................................................................................ 48
............................................................................................. 49
......................................................................................... 49
........................................................................................................ 50
.................................................................................................... 52
................................................................................................... 52
........................................................................................................................... 53
........................................................................................................................... 54
.............................................................................................................. 54
....................................................................................................... 55
........................................................................................................................... 56
................................................................................................................ 56
........................................................................................................................... 56
..................................................................................................................................... 56
............................................................................................................. 57
..................................................................................................................................... 58
........................................................................................................................................ 59
..................................................................................................... 59
............................................................................................................... 59
........................................................................................................................... 61
................................................................................................................... 62
continue ................................................................................................... 64
break ...................................................................................................................... 65
........................................................................................................................... 65
................................................................................................................ 65
......................................................................................................................................... 67
......................................................................................................... 69
.................................................................................................................................... 71
......................................................................................................... 71
2. - Java ....................... 73
.................................................................................................... 73
- .................................................... 76
............................................................................................................................ 76
................................................................................................................................ 79
.................................................................................................................... 80
.......................................................................................................................... 81
KISS ....................................................................................................................... 83
........................................................................................................................... 84
? .................................................................................................... 84
.............................................................................................. 86
.............................................................................................................. 87
.................................................................................................... 88
Java ........................................................................................ 89
........................................................................................................................... 90
.................................................................................................... 90
.................................................................................................. 91
Object ................................................................................................................................... 92
.................................................................................................................... 93
new ................................................................................................................................ 94
........................................................................................................................... 94
............................................................................................................ 94
Complex ............................................................................................................................... 96
main().................................................................................................................................. 99
.............................................................................. 100
............................................................................................................... 101
...................................................................................................................... 103
" " "" ................................................................................... 107
.................................................................................................................................. 108
....................................................................................................... 108
3. , .................................................... 109
......................................................................................................................... 110
.................................................................................................. 111
................................................................................................. 113
.......................................................................................................... 115
Java- ................................................................................................................................... 116
................................................................................................................................. 117
.............................................................................................................................. 121
............................................................................................................... 124
Design patterns ............................................................................................................................. 126
MVC ............................................................................................. 126
Singleton ................................................................................................................ 127
.................................................................................................................................. 129
....................................................................................................... 129
5. ..................................................................................... 156
String.................................................................................................................................. 157
.............................................................................................................. 157
......................................................................................................................... 162
.................................................................................................................. 162
..................................................................................................... 162
........................................................................................ 163
....................................................................................................... 163
...................................................................................... 164
........................................................................................................... 164
................................................................................................. 166
........................................................................................................... 167
................................................................................................. 167
....................................................................................... 168
..................................................................................................... 168
................................................................... 168
........................................................... 168
......................................................................................................................... 169
StringBuilder ...................................................................................................................... 169
...................................................................................................................... 169
..................................................................................................... 170
...................................................................................................... 170
....................................................................................................... 171
............................................................................................................. 171
..................................................................................................... 171
...................................................................................................... 171
.................................................................................................. 172
StringTokenizer .......................................................................................................... 172
.................................................................................................................................. 173
....................................................................................................... 173
6. -...................................................................................... 174
Vector ................................................................................................................................. 174
.............................................................................................................. 175
.......................................................................................... 175
......................................................................................................... 176
.................................................................................................. 176
................................................................................... 176
, ............................................................................... 176
............................................................................................... 177
......................................................................................................... 177
Stack ................................................................................................................................... 178
Hashtable ........................................................................................................................... 179
Hashtable ........................................................................................... 180
Hashtable....................................................................................... 180
...................................................................................... 180
.......................................................................... 181
Hashtable ................................................................ 181
......................................................................................................... 181
Properties ................................................................................................................... 182
Collection .................................................................................................................. 185
List............................................................................................................................. 185
Set .............................................................................................................................. 186
SortedSet ........................................................................................................... 186
NavigableSet ..................................................................................................... 187
Queue ........................................................................................................................ 188
BlockingQueue .................................................................................................. 188
Deque ........................................................................................................................ 188
BlockingDeque .................................................................................................. 189
7. - ......................................................................................... 203
..................................................................................................................... 203
............................................................................................................ 203
................................................................................................. 203
............................................................................................................ 204
......................................................................................................... 204
............................................................................................................ 205
........................................................................................ 205
- ............................................................................................. 206
................................................................................................................. 206
....................................................................................................... 208
............................................................................................. 208
Calendar .................................................................................................................... 209
GregorianCalendar.............................................................................................. 209
.......................................................................................... 210
...................................................................................................... 211
............................................................................................................... 211
....................................................................................................... 212
III.
.......................................................................... 213
8. ............................... 215
.............................................................................................................. 217
AWT .............................................................................................................. 220
9. .......................................................................... 226
Graphics ............................................................................................................. 226
.................................................................................................................... 226
......................................................................................................................... 228
....................................................................................................... 228
Polygon ...................................................................................................................... 229
......................................................................................................................... 230
Graphics ........................................................................................ 230
............................................................................................................... 231
........................................................................................................ 231
................................................................................................................ 231
FontMetrics ................................................................................................................ 235
......................................................................................................................... 238
Java 2D ................................................................................................................. 238
........................................................................................................ 240
AffineTransform ......................................................................................................... 240
......................................................................................................................... 243
Java 2D ....................................................................................... 243
BasicStroke ................................................................................................................ 243
GeneralPath ............................................................................................................... 246
GradientPaint TexturePaint ................................................................................. 247
LinearGradientPaint RadialGradientPaint.......................................................... 249
Java 2D ............................................................................................. 250
............................................................................................. 254
......................................................................................................................... 256
.................................................................................................................................. 256
....................................................................................................... 256
10
......................................................................................................................... 314
JSpinner ................................................................................................................. 314
JScrollBar ............................................................................................ 316
JSlider .................................................................................................................. 316
......................................................................................................................... 318
JProgressBar ..................................................................................................... 318
JTree ........................................................................................................ 318
Swing ................................................................................. 322
JMenuBar ............................................................................................. 322
JMenu ............................................................................................................... 323
JMenuItem.............................................................................................. 323
JPopupMenu ............................................................................ 325
JColorChooser ................................................................................. 326
......................................................................................................................... 328
JFileChooser ...................................................................................... 328
FileFilter ........................................................................................... 328
................................................................................. 330
..................................................................................... 330
.................................................................................................. 331
Swing ..................................................................................................................... 333
....................................................................................................... 333
11
12
13
................................................................................................................................. 480
....................................................................................................................... 480
Swing ..................................................................................................... 481
JApplet............................................................................................................................. 482
................................................................................................................................. 483
.................................................................................................................................. 484
....................................................................................................... 484
14
................................... 539
.......................................................................................... 539
.................................................................................................................................. 541
....................................................................................................... 541
15
16
............................................................................................................... 677
- ....................................................................... 679
.................................................................................. 681
............................................................................................ 682
............................................................................ 684
.............................................................................. 686
........................................................... 690
JSP ............................................................................................... 690
JSTL ........................................................................................ 692
core ................................................................................................................... 693
xml .................................................................................................................... 696
fmt .................................................................................................................... 696
sql ..................................................................................................................... 697
fn ...................................................................................................................... 697
Frameworks................................................................................................................................... 697
JavaServer Faces ........................................................................................................................... 698
....................................................................................................... 703
17
.................................................................................................... 758
.............................................................................................. 760
, , , . ,
, . ... - . ,
, , , . .
. :
, 1996 .;
, "" FAQ (Frequently Asked Questions);
, , ( , , , );
,
;
Java, "How to...?";
,
;
- ,
Java ;
Java.
, Java XXI .
, , , , , ,
, .
20
, .
, . " Java".
. , .
, .
, .
Java .
, Java Web-, , .
Android Java. Java Web-.
. , . Swing Java.
XML. Java.
, , , .
, !
Java?
, . , Java ( "", ).
, , Java, , .
Java ( Java 23 1995 .) ,
.
Java .
, Java . JavaBeans, Java , CORBA.
(servlets), JSP (JavaServer Pages) EJB (Enterprise JavaBeans). JDBC. ,
Java , Oracle, Linux, MacOS X,
AIX. ? , Java
. -
.
Java
, , , Java. Smalltalk,
21
Pascal, C++ ., , , .
, , , : . Java - ,
Pascal . Java
, ,
.
, Java
Java, : Clojure, Scala, Jython,
Pascal C++, - Java:
.
Java - ,
Algol, Pascal.
, Java ,
. Java.
, Java- , , Java
.
Java , (deprecated), , , , . -
.
.
I , .
- Java, , /.
1 , , , ,
, Java. Java, ,
.
2 - :
, , , , , . ""
,
.
22
Java. , , ,
.
3 ,
, .
Java API.
II ,
Java,
. , .
- .
4 Java,
,
, .
5 , ,
Java, , ,
.
6 , Java ,
.
7 -, , ,
.
III () AWT (Abstract Window Toolkit) Swing . Java , . Java, .
.
Swing
MS Windows, X Window System ., .
8 AWT,
. Swing, AWT.
9 ,
, Java.
10 ,
AWT , AWT.
11 ,
Swing.
12 Swing.
23
13 Swing.
14 , AWT Swing .
15
, , Java.
16 , Swing.
17 Swing ,
, , .
18, -, Java-,
, .
19 Swing, .
20 AWT.
IV Java, .
,
, .
Java .
, .
21 Java ,
.
22 Java
(threads) .
23 Java / .
24 Java, -
.
V Web- Java, , , .
25 Java, Web: JAR, JavaBeans,
JDBC.
26 .
27 JSP,
Web-.
, 28 XML Java
XML.
24
Java-
, , ,
Java, ("", ""
source), .
, . .
. , , :
,
.
, Java, ,
Java
, - ,
Java (Java Virtual Machine, JVM). Java . , Java ,
.
JVM , 1 , JVM
- (bytecodes), 2 3 . 1,8 . JVM
Java (Virtual Machine Specification, VMS). ,
, Java.
Java , , , -. , (dynamic binding).
.
, , Java, -. - . ,
. - ,
. -. , , JVM.
, .
Java "Write once, run anywhere" " , ".
- . , -
, ,
. . JIT-
(Just-In-Time),
,
. .
Sun Microsystems HotSpot
25
Java. , ,
.
Sun Microsystems picoJava, JVM. Java- . -. Java
JVM , , -,
.
. Java,
JVM .
JVM . JavaOS, .
Java . Andriod Java,
Dalvik, Linux.
, , MS Windows 2000/XP/Server 2003, Red Hat Linux, Fedora Core Linux,
SUSE Linux . , . "" .
, JVM , -
-. Java, . -, ,
, ,
-. ,
C/C++ , "" (native methods). "" .
Oracle, Sun Microsystems Java,
: , , , . JDK (Java
Development Kit). .
. , JDK IBM.
JDK?
JDK :
- javac;
java, JVM;
jre ( );
26
appletviewer, ;
jdb;
javap;
jar;
javadoc;
""
javah;
keytool;
native2ascii, ;
rmic rmiregistry ;
serialver, ;
"" ;
Java API (Application Programming Interface).
JDK :
. .
javac_g, java_g
27
JRE?
JRE
-, java ( jre) . JDK, , . Oracle JRE ,
, ,
Java, .
JRE JDK, Oracle .
JDK?
, JDK .
- : , http://www.oracle.com/
28
src.zip.
-! JDK , Java. . ,
JDK,
. Java "", .
zip- jar-, src.zip.
PATH,
bin, /usr/java/jdk1.7.0/bin. , Java, JAVA_HOME,
JDK, /usr/java/jdk1.7.0.
Java, ,
java -version
JDK?
JDK ,
, MS Windows X Window System,
Command Prompt MS Windows.
UNIX, Linux, BSD , Xterm.
Java , Notepad,
WordPad MS Windows, vi, emacs UNIX.
, java. , , MyProgram.java, .
29
javac
:
javac MyProgram.java
,
, class. , , MyProgram,
MyProgram.class, -.
, ,
. , . JDK , ""
.
- java, -, (
):
java MyProgram
.
, ( MS
Windows exe)
. Java .
class- - JAR. ,
25. JDK MS Windows jar java, jar-.
, ( bat MS Windows
Shell- UNIX), java .
Java- (launcher) Java.
JDK: java.exe , , Java
Java main().
Java src/launcher. . , ,
Java Launcher SyncEdit, http://www.syncedit.com/software/javalauncher/,
Advanced Installer for Java Caphyon, http://www.advancedinstaller.com/.
, , Java, , .
AOT (Ahead-Of-Time) compiler. ,
GCC (GNU Compiler Collection) GCJ,
-, , - .
30
, "", , .
Java
Java, 1996 ., IDE (Integrated Development Environment) Java,
. , Eclipse, IntelliJ IDEA, NetBeans,
JDK,
, .
JDK. , Eclipse
.
JDK , JBuilder Embarcadero IBM Rational Application Developer.
, JDK. ,
Java.
, . .
RAD (Rapid Application Development).
- , -,
, ; -,
; -, , , .
Java CASE-. , Rational Rose Java.
Java, , NetBeans IDE, http://netbeans.org/.
, Java.
Microsoft
, , ,
. , , , , Microsoft Java.
, , Microsoft
Java, ,
Visual Studio. - ActiveX.
, - ,
ActiveX. "" Java -,
Microsoft.
Sun Microsystems Microsoft Visual J++.
Java Microsoft -, ""
, -, Visual J++. Visual Studio .NET 2005
31
Java
, Java
. ,
Java . Oracle
Java:
http://www.oracle.com/technetwork/java/index.html Java,
JDK;
http://forums.oracle.com/forums/category.jspa?categoryID=285 Java;
http://www.java.net/ , Java.
IBM http://www.ibm.com/developer/java/,
.
Microsoft Java
http://www.microsoft.com/mscorp/java/default.mspx.
:
http://www.artima.com/forums/ , Java;
http://www.developer.com/java/ Java;
http://www.freewarejava.com/ Java ;
http://www.jars.com/ Java Review Service;
http://www.javable.com/ c , Java;
http://javaboutique.internet.com/ ;
http://www.javalobby.com/ , Java;
http://www.javaranch.com/ Java;
http://www.javaworld.com/ ;
http://www.jfind.com/ ;
http://www.jguru.com/ ;
http://java.sys-con.com/ Java;
http://www.theserverside.com/ Java-;
http://www.codeguru.com/Java/ , -
32
http://securingjava.com/ ;
http://www.servlets.com/ ;
http://www.javacats.com/ Java Java.
:
http://www.mindviewinc.com/Index.php / ,
;
http://www.davidreilly.com/ ,
Java.
, , , . ,
, .
Java
, .
.
James Gosling, Bill Joy, Guy Steele,
Gilad Bracha, "The Java Language Specification, Third Edition".
http://java.sun.com/docs/books/jls/,
400 .
Java Tim
Lindholm, Frank Yellin, "The Java Virtual Machine Specification, Second Edition".
http://java.sun.com/docs/books/vmspec/.
"" Java , . :
., ., . Java. 3- .: .
. .: "", 2001. 624 .: .
Java
., Java. . . . .: , 2008.
223 . , .
Oracle Java Tutorial, : http://download.
oracle.com/javase/tutorial/ /. : Mary
Campione, Kathy Walrath, "The Java Tutorial, Second Edition: Object-Oriented
Programming for the Internet".
Java API , James
Gosling, Frank Yellin and the Java Team, "The Java Application Programming Interface",
Volume 1: Core Packages; Volume 2: Window Toolkit and Applets.
33
,
.
,
, ; ; "" , , "
", , , , , .
Java
1.
2.
- Java
3.
,
, , ,
.
, . , .
, " ",
.
Java , JLS (Java Language Specification), . , , Java, , , , :
Java .
, ,
" ", . , , .
Java
, ,
"Hello, World!". .
1.1 . ,
Java.
1.1. Java
class HelloWorld{
public static void main(String[] args){
System.out.println("Hello, XXI entury World!");
}
}
I. Java
38
, ! Java.
, Java, -
, (class).
class, ,
, HelloWorld. ,
, (class body).
-
, (method). , .
. -
main, . , , main.
, ( -
(returns)) ,
. , . .
void, .
(parameters) . , ,
. main() , ,
. Java API String,
. ,
args.
-
(modifiers). : public ,
; static main() . , , ,
main() .
, ,
, .
, , (method body),
.
, main() ,
System.out.println "Hello, XXI entury World!".
,
.
System.out.println , System, Java API,
out, Java
API, PrintStream, println(). ,
.
1. ,
39
println()
, , MS-DOS
Prompt, Command Prompt Xterm .
, ln,
println print line. Java API
print(), . , Pascal.
Java SE 5 (Java Standard Edition) System.out.printf(), . 23,
.
. Java ,
main, Main, MAIN " " Java.
String, System , main .
, Century century, ""
, .
Java .
. ,
helloworld helloWorld, Java- , "Code Conventions for the Java Programming Language",
http://www.oracle.com/technetwork/java/codeconv-138413.html.
:
() ; -
, ;
;
, ;
;
, .
, , JLS, . 6.8, Java .
, ,
:
? - ,
. .
"Code Conventions" ,
(
, ),
, (indent) .
, - ,
(Notepad), emacs vi. , -
I. Java
40
HelloWorld.java
. , :
javac HelloWorld.java
-, HelloWorld.class
.
-,
( !):
java HelloWorld
:
Hello, XXI Century World!
class .
- , Eclipse NetBeans,
""
.
, . . ,
1. ,
41
, , "" . , , Java,
.
:
, //, ,
, ;
/* , -
, */ (
);
/** ,
, */.
.
,
, . . Java ,
JDK javadoc,
HTML .
javadoc, @.
JDK.
( 1.2).
1.2.
/**
* ...
* @author ()
* @version 1.0 ( )
*/
class HelloWorld{ // HelloWorld
//
public static void main(String[] args){
// args
/*
* */
System.out.println("Hello, XXI entury World!");
// ,
//
// System.out.println("Farewell, XX entury!");
}
}
, . , , ( ),
.
I. Java
42
Java .
. .
:
: +5, -7, 12345678;
, b B: 0b1001, 0B11011;
, : 027, -0326, 0777 ( -
8 9);
, , ,
.
1. ,
43
, x X: 0xff0a,
0xFC2D, 0X45a8, 0X77FF (
).
: 1_001_234, 0xFC_2D.
int (. ).
"L" ( L
l), long (. ): +25L, -037l, 0xffL, 0XDFDFl.
l,
.
:
: 37.25, -128.678967, +27.035;
: 2.5e34, -0.345e-25, 37.2E+4; -
E; .
F f, float (. ): 3.5f,
-45.67F, 4.7e-5f. D ( d): 0.045D, -456.77889d,
double, , double.
, . :
, ,
( ): 'a', 'N', '?';
, :
'\n'
'\r'
'\f'
'\b'
BS (Backspace) 8;
'\t'
HT (Horizontal Tabulation) 9;
'\\' ;
'\"' ;
'\''
I. Java
44
0 255 ,
: '\123' S, '\346' CP1251.
,
,
.
'\377' 255;
Unicode
u :
S, '\u0416' .
'\u0053'
char (. ).
Unicode '\u0410' , '\u042F' , '\u0430' , '\u044F' .
, Unicode,
.
Java Unicode.
.
, , , , ,
. , ,
.
:
" \n "
"\"\" !"
, .
, .
" " + ""
" ". , . .
, (+);
( ) , :
" , " +
" "
1. ,
45
, Unicode, "":
System.out.println("\u0429\u043e\u0441\u0441\u0438\u044f");
(names) , ,
( (identifiers)) (qualified names).
Java Java (Java letters) 09, .
(, 2e3: 2000,0 ?)
Java ,
($) (_), .
. Java
.
:
a1
aName
my_var
theName
var3_5
a2Vh36kBnMt456dX
_var
veryLongVarName
l, ,
, .
, "Code Conventions".
Character, Java API, , , : isJavaIdentifierStart(),
, Java, isJavaIdentifierPart(), , , , (_)
($).
Java, class, void, static, , .
(qualified name) , , , System.out.println.
, Java, : (primitive types) (reference types).
I. Java
46
(arrays), (classes)
(interfaces). Java SE 5 (enum).
. ( )
, boolean, (numeric) .
(integral1) (floating-point).
: byte, short, int, long, char.
, int, JLS
char . , , , 2 + '', Unicode
'\u0416' ''. 1046,
1048.
, 2 + "", , ,
, ,
"2".
: float double.
. 1.2 Java.
. 1.2. Java
, . ,
, ,
. . , . . .
"integral" . The Java Language Specification, Third Edition. James Gosling, Bill Joy, Guy Steele, Gilad Bracha
(. ). .
1. ,
47
boolean ,
2 > 3, .
: true () false (). Java.
:
boolean b = true, bb = false, bool2;
,
bool2 = true, ; b == bb b != bb, .
Java :
(NOT) ! ( );
(AND) & ();
(OR) | ( );
(XOR) ^ ().
boolean,
true false. ,
, . 1.1.
1.1.
b1
b2
!b1
b1 & b2
b1 | b2
b1 ^ b2
true
true
false
true
true
false
true
false
false
false
true
true
false
true
true
false
true
true
false
false
true
false
false
false
:
;
, ;
, ;
, .
, "To be or not to be" :
2b | ! 2b.
I. Java
48
:
(conditional-AND) &&;
(conditional-OR) ||.
.
,
, . . true
false.
,
(n != 0) && (m/n > 0.001) (n == 0) || (m/n > 0.001),
.
Java .
Java, JLS, ( , ) . . 1.2. ,
Pentium.
1.2.
()
byte
128 127
short
32 768 32 767
int
long
9 223 372 036 854 775 808 9 223 372 036 854 775 807
char
char ,
int, 4 , .
:
byte b1 = 50, b2 = -99, b3;
short det = 0, ind = 1, sh = 'd';
1. ,
49
, char, . , ,
.
: , , ,
, .
, 50 b1, ,
00110010, 99 b2 ,
: 99 , 01100011,
, 10011100, , 10011101.
, ; , 1, , . ,
,
. , , , ,
A B, A B.
, .
. ,
. Java .
, , .
:
+ ();
- ();
* ();
/ ( , );
( ) % ();
( ) ++;
( ) --.
.
, ,
(
I. Java
50
:
, . 5/2.0 5.0/2 5.0/2.0, 2,5
.
:
a % b = a (a / b) * b
int, ,
long. long.
(promotion) byte, short, char. int, ,
long, long. int long,
long. , .
.
, 1.3, , . 1.3.
1.3.
class InvalidDef{
public static void main(String[] args){
byte b1 = 50, b2 = -99;
1. ,
51
short k = b1 + b2;
// !
System.out.println(k= + k);
}
}
. 1.3.
.
, . ,
byte b = (byte)300;
b 44. , 300,
100101100, 00101100.
(widening) ,
.
int long, , , ,
.
Java .
I. Java
52
Java :
>;
<;
>=;
<=;
==;
!=.
, ,
=> .
: true,
3 != 5; false, 3 == 5.
. ,
a < x < b.
Java , , a < x,
true false, Java , , b, .
(a < x) && (x < b), ,
a < x && x < b, .
. (bitwise) , , " ".
Java :
(complement) ~ ();
(bitwise AND) &;
(bitwise OR) |;
(bitwise XOR) ^.
,
int long, , , . . 1.3.
1.3.
n1
n2
~n1
n1 & n2
n1 | n2
n1 ^ n2
1. ,
53
32 .
, ~x (-x)1.
Java :
<<;
>>;
>>>.
,
. , , , .
, b1 << 2 2
0...00110010 b1, 0...011001000,
200. ; ,
32- , .
b2 << 2 1...10011101 .
1...1001110100, 396.
, n 2 n.
b1 >> 2 0...00001100, 12, b2 >> 2
1...11100111, 25, . . ,
. .
, .
. ,
b2 >>> 2 001...100111, 1 073 741 799.
10011101
b2, . . 0...00100111, b2 , :
(b2 & 0xFF) >>> 2.
.
I. Java
54
3. 'D' + 5?
, , :
4. (b1 + 1) % (++b2 / b1++).
5. (b1 < 1) && (b2 == -99) || (ind >= 0).
6. (b1 | 1) & (big ^ b1).
7. (b1<<3 + 1<<2) % (b2>>5 / b1>>>2).
Java : float double. ,
, IEEE 7541985 .
:
, POSITIVE_INFINITY -
, 3.0*6e307 ;
NEGATIVE_INFINITY, -
, -3.0*6e307
;
" ", NaN (Not a Number) , ,
.
4 .
, ,
, 0.0 == -0.0
, true.
.
, , . . 1.4.
C/C++
Java %, ++ --
.
1.4.
float
78
double
17
1. ,
55
:
float x = 0.001f, y = -34.789F;
double z1 = -16.2305, z2;
, .
:
double,
double;
, float, float;
.
(simple assignment operator)
(=), , ,
: x = 3.5, y = 2 * (x 0.567) / (x + 2), b = x < y, bb = x >= y && b.
: , , , . .
, , : , , , .
,
3.5 = x. x = y x, y, y = x y.
11
(compound assignment operators): +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=, >>>=. , .
:
x = a
x = ( x)(x a)
// !
// !
b + 10 b int,
int , , b
I. Java
56
.
byte.
8. x = y = z = 1?
9. x += y -= z /= x + 2?
.
, . . true false, ,
, , :
x < 0 ? 0 : x
x > y ? x y : x + y
. . true,
.
. false,
, .
n == 0 ? m : m / n, . , .
, , (expressions). , , , , 2 + true.
.
: x + y + z
(x + y) + z. :
x = y = z x = (y = z).
.
.
-
1. ,
57
.
int a = 3, b = 5;
b + (b = 3) 8;
(b = 3) + b 6. b += (b = 3) 8, .
C/C++
C++ 8.
. a b
b += a += b += 7
20. ,
, b 12, , , b, 5.
a += b += 7;
b += a;
27, b, 12.
C/C++
C++ 27.
.
, . . , .
, .
.
, . " ". . ,
, .
.
.
1. ++ --.
2. ++ --, ~ !.
3. ().
4. *, / %.
5. + -.
6. : <<, >>, >>>.
I. Java
58
, , ,
, , .
: -, ,
, , - .
. (statements) . ,
.
: , ,
, .
Java :
( );
-;
;
if;
while, do-while, for;
switch;
break, continue return;
, {};
.
1. ,
59
Java,
.
Java goto.
.
,
(expression statement). , . ,
.
P ASCAL
Java , .
.
, .
, .
, {x = 5; y = 7;}. , {}.
,
.
.
.
. , .
(if-then-else statement)
. Java :
if () 1 else 2
. .
true, 1,
, 2 . , if. " then" .
false, 2, 1 (" else").
60
I. Java
, false, ,
.
then,
else. .
"Code Conventions"
, :
if (a < x){
x = a + b;
} else {
x = a b;
}
.
, .
- , :
if (n == 0){
sign = 0;
} else if (n < 0){
sign = -1;
} else {
sign = 1;
}
("dangling else"):
int ind = 5, x = 100;
if (ind >= 10) if (ind <= 20) x = 0; else x = 1;
if else, ?
x 100 1? ,
, Java, : else if, else.
x 100.
:
if (ind > 10) {if (ind < 20) x = 0;} else x = 1;
, . .
, :
if (ind >= 10 && ind <= 20) x = 0;
else x = 1;
1.4
ax2 + bx + c = 0 , .
1. ,
61
1.4.
class QuadraticEquation{
public static void main(String[] args){
double a = 0.5, b = -2.7, c = 3.5, d, eps=1e-8;
if (Math.abs(a) < eps)
if (Math.abs(b) < eps)
if (Math.abs(c) < eps)
//
System.out.println(" ");
else
System.out.println(" ");
else
System.out.println("x1 = x2 = " +(-c / b));
else {
//
if((d = b*b 4*a*c)< 0.0){
//
d = 0.5 * Math.sqrt(-d) / a;
a = -0.5 * b/ a;
System.out.println("x1 = " +a+ " +i " +d+", x2 = " +a+ " i " +d);
} else {
//
d = 0.5 * Math.sqrt(d) / a;
a = -0.5 * b / a;
System.out.println("x1 = " +(a + d)+ ", x2 = " +(a d));
}
}
}
}
a, b ? . System.in.read(byte[] bt), ,
bt ASCII, . ,
Double(new String(bt)).doubleValue(). ? 23.
, ,
(. 21).
13. y, x + 1, x < 0,
x + 2, 0 <= x < 1, x + 10 .
I. Java
62
14. , z true,
M(x, y) , false .
while :
while ()
. true, , . ,
, false.
false, . , , . while
, .
, :
int i = 0;
double s = 0.0;
while ((s += 1.0 / ++i) < 10);
i , ,
s 10. . , ,
, , .
:
while (true)
, - ,
break, 1.5. ,
<Ctrl>+<C> UNIX Task Manager Windows.
, {}.
do-while :
do while ()
, . , true.
P ASCAL
do-while , .
,
do-while .
1. ,
63
, - f(x), [a; b]
. 1.5 ,
(, ).
1.5.
class Bisection{
static double f(double x){
return x*x*x 3*x*x + 3;
// - ...
}
public static void main(String[] args){
double a = 0.0, b = 1.5, c, y, eps = 1e-8;
do{
c = 0.5 *(a + b); y = f(c);
if (Math.abs(y) < eps) break;
// .
// [a; c] :
if (f(a) * y < 0.0) b = c;
// , . b c
// :
else a = c;
// a c
// , [a; b]
} while(Math.abs(b-a) >= eps);
System.out.println("x = " +c+ ", f(" +c+ ") = " +y);
}
}
Bisection : main()
f(x). f() :
, :
return
main() break, , .
static f(). , f()
main(), .
for :
for (1; ; 2)
1.
, . ,
. , .
. , true,
, 2.
64
I. Java
. , 2
. . false, .
,
1;
while (){
2;
}
, continue, 2 - .
1 . .
for : ,
, . :
for (;;)
- .
for , , ,
int s = 0;
for (int k = 1; k <= N; k++) s += k * k;
// k
N .
Java for, "for-each",
. , .
continue
continue . . continue
. continue
:
for (int i = 0; i < N; i++){
if (i == j) continue;
s += 1.0 / (i j);
}
:
continue
, , Java, ,
.
1. ,
65
. .
P ASCAL
.
, .
break
break .
break
, .
.
M1: { //
M2: { //
M3: { // ...
if (- ) break M2;
// true,
}
//
}
//
}
, , .
, break .
15. , .
16. , , 2 .
switch . -
( long) ,
. :
I. Java
66
switch (){
case 1: 1
case 2: 2
case N: N
default: Def
}
,
:
1. ,
67
switch (dayOfWeek){
case "Mon": case "Tue": case "Wed": case "Thu": case "Fri":
System.out.println(" "); break;
case "Sat": case "Sun":
System.out.println(" "); break;
default:
System.out.println(" ");
}
break,
.
, ,
.
Java ,
. .
(declaration).
(reference) , .
, ,
, , ,
double[] a, b;
a b double. . ,
:
int i = 0, ar[], k = -1;
i k ar.
(instantation). , , , - . Java new , , ,
.
,
a = new double[5];
b = new double[100];
ar = new int[50];
.
0. a : a[0],
a[1] ... a[4]. a[5] . -
I. Java
68
:
double[] a = new double[5], b = new double[100];
int i = 0, ar[] = new int[50], k = -1;
, . , :
double[] a = {0.01, -3.4, 2.89, 4.5, -6.7};
:
a = new double[] {0.1, 0.2, -0.3, 0.45, -0.02};
, new,
:
System.out.println(new char[] {'H', 'e', 'l', 'l', 'o'});
,
. ,
a = b a b 100
double .
"" null,
:
ar = null;
, , ,
.
, a == b, a != b. , ; ,
.
Java , .
length. .
1. ,
69
. ,
, a.length 5, b.length 100, ar.length
50.
length a :
a[a.length 1], a[a.length 2] . . :
double aMin = a[0], aMax = aMin;
for (int i = 0; i < a.length; i++){
if (a[i] < aMin) aMin = a[i];
if (a[i] > aMax) aMax = a[i];
}
double range = aMax aMin;
. , 1.
, , , . Java SE 5,
Java for, "for-each", . "for-each":
double aMin = a[0], aMax = aMin;
for (double x : a){
if (x < aMin) aMin = x;
if (x > aMax) aMax = x;
}
double range = aMax aMin;
, for x , .
.
, , : (a[2] + a[4]) / a[0] . .
C/C++
Java , -
'\u0000'.
Java . :
char[][] c;
char[] c[];
char c[][];
I. Java
70
:
c = new char[3][];
, , -. -:
c[0] = new char[2];
c[1] = new char[4];
c[2] = new char[3];
:
int[][] d = new int[3][4];
:
int[][] inds = {{1, 2, 3}, {4, 5, 6}};
1.6 , 10 , .
1.4 .
1.6.
class PascalTriangle{
public static final int LINES = 10;
//
public static void main(String[] args){
int[][] p = new int[LINES][];
p[0] = new int[1];
System.out.println(p[0][0] = 1);
p[1] = new int[2];
p[1][0] = p[1][1] = 1;
System.out.println(p[1][0] + " " + p[1][1]);
for (int i = 2; i < LINES; i++){
p[i] = new int[i+1];
System.out.print((p[i][0] = 1) + " ");
for (int j = 1; j < i; j++)
System.out.print((p[i][j] = p[i1][j-1] + p[i1][j]) + " ");
System.out.println(p[i][i] = 1);
}
}
}
1. ,
71
--! . , , . Java,
, , . , .
. . , .
, , .
1. Java?
2. Java?
3. main()?
4. ?
5. ?
6. ?
7. 032?
8. 02?
9. " "?
10. " "?
11. 3.45 % 2.4?
12. 12 | 14 & 10?
13. 3 << 4?
72
I. Java
14. ?
15. continue ?
16. break ?
17. ?
18. ?
19. ?
20. , ?
-
Java
, ,
. ,
, , , , .
,
. - , , . , .
,
.
.
, , ,
. , .
: FORTRAN, Algol , . ,
, . , , .
: , . ,
. . ,
. .
.
.
, , , ,
74
I. Java
, .
, . .
, Pascal,
. , .
:
. "" . .
,
.
, . . , Pascal,
" + = ".
.
. ,
- . ,
.
,
.
,
, , (public) , , , , (private) .
. (interface),
(implementation) . , , , , ,
. -. Turbo Pascal
, "" (header) .
++, , . Java ,
interface, .
, (incapsulation) . . , "" ,
- , . , , .
, , ,
- . .
2. - Java
75
, ,
,
. , .
: ?
: , ,
; , , ,
, .
, , , . : , , , , , , . -
: , , , , , , , ,
. .
, ,
.
,
. (object-oriented programming),
(OOP) .
. .
,
, , - . , . , . , .
, , .
. ,
, width height,
, (x, y)
, , , , Times New Roman,
color, , .
, - , , move(), - size(),
iconify(), - . ! , : ,
, .
, , "" ,
: ", , ",
,
, !
76
I. Java
-
. , - ,
(object-oriented analysis, OOA). - , (object-oriented
design, OOD).
-
. ?
? ? ? - ,
. .
-
. ,
- . , ,
, . .
- , , . , , :
. ,
. , ,
.
,
.
, , , , , , , .
,
. .
,
. " ",
? , , .
, , . , ? , -
2. - Java
77
, .
.
, , . ,
, .
? . "
". . "",
"".
: " ". "" , , - , , , .
"" , "", "", " ", " ", " ". " "
, , , .
" " -
? " "? -, " " , , .
, - , .
, , , .
-
(classes). . , , ,
.
.
, ,
, . , . (class fields). ,
, . ,
.
, ,
. (class methods).
, , . ,
, .
(nested classes),
, , , . "" . ,
(class members).
-
I. Java
78
, ,
Java.
:
class Automobile{
int maxVelocity;
// , .
int speed;
// , .
int weight;
// , .
// ...
void moveTo(int x, int y){
// , (x, y).
// x y , .
int a = 1;
// a , .
// .
// (x, y)
}
// ...
}
P ASCAL
Java , .
, , (instances) . , (. 1).
: , , .
Automobile lada2110, fordScorpio, oka;
new , , .
lada2110 = new Automobile();
fordScorpio = new Automobile();
oka = new Automobile();
, .
, , , new Automobile().
(constructor) , .
, ,
. :
lada2110.maxVelocity = 150;
fordScorpio.maxVelocity = 180;
oka.maxVelocity = 350;
// ?
oka.moveTo(35, 120);
2. - Java
79
, Java String.
int strlen = " String".length();
, Automobile ? , . ,
? . ,
? ? : .
.
. , .
(pets): (cats), (dogs),
(cows) . :
class Pet{
//
Master person;
//
int weight, age, eatTime[];
// , ,
int eat(int food, int drink, int time){
//
// ...
if (time == eatTime[i]) person.getFood(food, drink);
//
}
void voice();
// ,
// ...
}
, ,
Pet:
class Cat extends Pet{
int mouseCatched;
void toMouse();
//
}
class Dog extends Pet{
void preserve();
}
// , :
//
//
// :
//
I. Java
80
, ,
Pet. . Dog
Pet , Dog. , :
Dog tuzik = new Dog(), sharik = new Dog();
:
tuzik.age = 3;
int p = sharik.eat(30, 10, 12);
:
class Pointer extends Dog{ ... }
class Setter extends Dog{ ... }
//
//
, , . extends
"", , Dog (extension) Pet.
, : ,
. , Dog (subclass) Pet, Pet (superclass) Dog.
: ,
, -, -, ,
, .
(inheritance) ,
, Dog Pet.
.
Master. :
class Master{
//
String name;
// ,
//
void getFood(int food, int drink); //
// ...
}
2. - Java
81
". "" .
" ", : " "?
, .
, . -
person.
. ,
, .
, , ,
. .
Chappi, ,
. (polymorphism)
.
, -
. " "
" ", .
, sharik, eat(), ,
person,
. person.getFood(food, drink).
(contract) ,
, sharik (responsibility) , person
getFood(),
.
, - (modularity).
: .
, , .
Java private
. :
private int mouseCatched;
private String name;
private void preserve();
,
, tuzik sharik.preserve().
Master
private void getFood(int food, int drink);
getFood() sharik
.
I. Java
82
, private public, :
public void getFood(int food, int drink);
.
++
Java private, public protected
.
. : "
".
,
(access methods), (get
method) (set method). get set, .
Java, ( -
Java JavaBeans), .
Master name :
public String getName(){
return name;
}
public void setName(String newName){
name = newName;
}
, set, . , , . .
is-, true false. , Master
, , :
public boolean isEmpty(){
return name == null;
}
name, :
if (master01.isEmpty()) master01.setName("");
, , . ,
, , (low
coupling) . . ,
2. - Java
83
.
, , , (high cohesion). , ,
, .
, (Karl J. Lieberherr), . : " m()
, , m(),
, m()".
, , , . , ,
.
? Pet
private Master person;
sharik.person? , .
, ,
.
, , Java (protected) , protected, sharik person Pet, Pet :
protected Master person;
, , , .
- , Java .
, , , ,
.
.
, , ,
.
KISS
,
KISS . :
"Keep It Simple, Stupid!"
, , ,
. , , . - -
84
I. Java
. ,
.
, , . ,
. , . , , .
. . Java
. , .
. ,
.
1. .
2. .
3. .
?
, class,
. "Code Conventions"
.
class (class modifiers).
public, abstract, final, strictfp. protected, private, static.
.
, , , ,
, .
, , , , , , . 1.
public, protected, private, static, final, transient, volatile.
, JLS ,
. .
void,
, , , , , .
.
2. - Java
85
86
I. Java
f() : ,
x, . bisect() : , b2 . bisect() Bisection2, (private).
. , , . - ,
.
.
: .
, ,
. , , .
, . , , , , .
Java, ,
. , :
class Dummy1{
private static void f(int a){
a = 5;
}
public static void main(String[] args){
int x = 7;
System.out.println(": " + x);
f(x);
System.out.println(": " + x);
}
}
7 f(), a, - x.
. - -, ,
, , . , ,
-. .
2. - Java
87
class Dummy2{
private static void f(int[] a){
a[0] = 5;
}
public static void main(String[] args){
int[] x = {7};
System.out.println(": " + x[0]);
f(x);
System.out.println(": " + x[0]);
}
}
x , , a. a ,
x. , ": 7", ": 5". , ,
f() , , .
.
:
class Dummy3{
private static void f(int[] a){
a = new int[]{5};
}
public static void main(String[] args){
int[] x = {7};
System.out.println(": " + x[0]);
f(x);
System.out.println(": " + x[0]);
}
}
7. f()
, , a
x, . a ,
{5}, x , - {7}.
P ASCAL
++
Java .
, (signature) . , .
, / .
I. Java
88
, , .
(overloading). . , 1 println(), ,
.
println, . , . PrintStream, print() println().
, , , :
class Truck extends Automobile{
void moveTo(int x, int y){
// - ...
}
// - , Truck...
}
.
Truck, :
Truck gazel = new Truck();
2. - Java
89
Java
. Pet voice(). Chorus,
2.2.
2.2.
abstract class Pet{
abstract void voice();
}
class Dog extends Pet{
int k = 10;
@Override
void voice(){
System.out.println("Gav-gav!");
}
}
class Cat extends Pet{
@Override
void voice(){
System.out.println("Miaou!");
}
}
class Cow extends Pet{
@Override
void voice(){
System.out.println("Mu-u-u!");
}
}
public class Chorus{
public static void main(String[] args){
Pet[] singer = new Pet[3];
singer[0] = new Dog();
singer[1] = new Cat();
singer[2] = new Cow();
I. Java
90
for (Pet p: singer)
p.voice();
}
}
. 2.1 . !
. 2.1. Chorus
4. .
5. .
6. .
Pet voice() , .
. (abstract),
abstract.
, ,
, . , abstract.
2. - Java
91
? , .
? , ?
2.2.
singer[] Dog, Cat, Cow, -
Pet , Pet. . , , k Dog, singer[0].k. "",
. , , , , . ,
.
, , , , :
void voice(){}
, . , .
.
final, . . ,
, .
sin(), cos() . Math. , Math.cos(x)
x. , .
, ,
(private).
final ,
.
final , . , , Math:
public final class Math{ . . . }
final .
final , ( , , )
, . .
Java :
public final int MIN_VALUE = -1, MAX_VALUE = 9999;
"Code Conventions" ,
.
92
I. Java
Object
Java Object.
, . .
extends , Pet, Java
Object, :
class Pet extends Object{ . . . }
.
Object , Java. , Object.
,
, equals(), , ,
. :
Object obj1 = new Dog(), obj2 = new Cat();
if (obj1.equals(obj2)) ...
- : obj1 , . , , obj2.equals(obj1),
obj2, .
1, :
obj1 == obj2; obj1 != obj2;
, ,
.
equals() , Object : . ; , , " " Object,
. , String equals()
, ,
, 5.
Object, , hashCode()
, , . . Java. hashCode(),
Object, - .
hashCode() .
Object, ,
toString(). ,
String. Object toString() ,
hashCode(). toString() , Java , , -
2. - Java
93
println(). toString() , , .
, new, , . ,
"", ?
"" (class constructor).
. . .
. ,
, .
.
:
,
super() , ;
,
this() , .
super() , , , , ,
.
,
, return, , .
. , , / .
, ,
, . , , . ,
94
I. Java
, . . .
,
Object.
new
, new.
.
, :
double a[] = new double[100];
.
.
, .
, false,
null.
new .
"" :
Dog k9 = new Dog();
:
new Dog().voice();
voice().
, Java, .
, new , , .
7. , 46.
,
.
. .
(instance variables) .
, , . ,
Automobile . (class variables).
2. - Java
95
, .
Java static. 2.3 number.
2.3.
class Automobile{
private static int number;
Automobile(){
number++;
System.out.println("From Automobile constructor:" +
" number = " + number);
}
}
public class AutomobileTest{
public static void main(String[] args){
Automobile lada2105
= new Automobile(),
fordScorpio = new Automobile(),
oka
= new Automobile();
}
}
, . 2.2.
. 2.2.
, ,
Automobile.number, , lada2105.number,
, . , , .
,
static. static
, , Java
, , , .
I. Java
96
.
.
,
.
.
, .
( ), .
Math, ,
Math.abs(x), Math.sqrt(x). System.out.println().
main() , .
(class methods),
, (instance methods).
:
this super;
;
;
, -
, .
1.5 f()
2.1 b2 Bisection2, f() .
static.
,
. , ,
, static, ,
:
static int[] a = new a[10];
static{
for (int k: a) a[k] = k * k;
}
, , ,
, .
, , : " ,
!" :
, .
Complex
. , , -
2. - Java
97
. , , Java. .
2.4 , , . , , ().
2.4. Complex
class Complex{
private static final double EPS = 1e-12; // .
private double re, im;
// .
// :
Complex(double re, double im){
this.re = re; this.im = im;
}
Complex(double re){this(re, 0.0);}
Complex(){this(0.0, 0.0);}
Complex(Complex z){this(z.re, z.im);}
// :
public double getRe(){return re;}
public double getIm(){return im;}
public Complex getZ(){return new Complex(re, im);}
public void setRe(double re){this.re = re;}
public void setIm(double im){this.im = im;}
public void setZ(Complex z){re = z.re; im = z.im;}
// :
public double mod(){return Math.sqrt(re * re + im * im);}
public double arg(){return Math.atan2(re, im);}
// : ?
public boolean isReal(){return Math.abs(im) < EPS;}
public void pr(){
//
System.out.println(re + (im < 0.0 ? "" : "+") + im + "i");
}
// Object:
public boolean equals(Complex z){
return Math.abs(re z.re) < EPS &&
Math.abs(im z.im) < EPS;
}
public String toString(){
return "Complex: " + re + " " + im;
}
// , +=, -=, *=, /=
public void add(Complex z){re += z.re; im += z.im;}
public void sub(Complex z){re -= z.re; im -= z.im;}
public void mul(Complex z){
double t = re * z.re im * z.im;
im = re * z.im + im * z.re;
re = t;
}
98
I. Java
. 2.3 .
2. - Java
99
. 2.3. ComplexTest
main()
, (application),
main.
, .
main() ,
, (public), (static),
(void). ,
(String[]). args,
.
- , main() Java , . java ,
main(), . main()
,
, .
main() .
main() .
java main() ,
.
java . ,
. , .
2.5, ,
, main() .
I. Java
100
2.5. main()
class Echo{
public static void main(String[] args){
for (String s: args)
System.out.println("arg = " + s);
}
}
. 2.4 .
. 2.4.
, .
main().
/++
Java ,
main(), args[0]. argc
args.length, . .
:
System.getProperties().list(System.out);
. 2.4,
. Java main(). :
class VarArgs{
private static int[] args1 = {1, 2, 3, 4, 5, 6};
private static int[] args2 = {100, 90, 80, 70};
2. - Java
101
Java .
, .
, .
public static int sum(int... args){
int result = 0;
for (int k: args) result += k;
return result;
}
.
public static void main(String[] args){
System.out.println(Sum1 = + sum(1, 2, 3, 4, 5, 6));
System.out.println(Sum2 = + sum(100, 90, 80, 70));
}
Java . , ,
.
(scope) ? ? ? 2.6
.
2.6.
class ManyVariables{
static int x = 9, y;
static{
x = 99;
}
// .
// .
// y 0.
// .
//
// .
// !
I. Java
102
int a = 1, p;
// .
// ,
//
// .
// p 0.
// .
//
// .
// !
p = 999;
}
static void f(int b){
int a =
int c;
// b ,
// .
2;
// "a".
// f()
// "a".
// , f().
//
// .
= 555; // ! .
= 333; // , .
{ int c
int x
}
// x .
for (int d = 0; d < 10; d++){
// d .
int a = 4;
// !
int e = 5;
// , for.
e++;
// .
System.out.println("e = " + e);
// "e = 6".
}
// d e .
}
public static void main(String[] args){
int a = 9999; // ,
// main().
f(a);
}
}
,
. '\u0000', false, null.
. , . , .
!
, .
2. - Java
103
2.6 :
(instance initialization). , , .
, static- , . , static-
. ,
? ,
, .
, , (nested) .
, (inner) . . "" , , .
? ,
.
, -
? , ,
, !
, ,
?
. , new
.
?..
, .
- (member
classes), , (local classes), / . , ,
.
- static.
-
, . (nested top-level classes), . . ,
.
(inner).
.
, , ,
. (anonymous classes).
2.7 .
I. Java
104
2.7.
class Nested{
static private int pr; // pr ,
// A AB.
String s = "Member of Nested";
// .
static class A{
// Nested.A
private int a = pr;
String s = "Member of A";
// A .
static class AB{
// Nested.A.AB
private int ab = pr;
String s = "Member of AB";
}
}
// Nested .
class B{
// Nested.B
private int b = pr;
String s = "Member of B";
// B .
class BC{
// Nested.B.BC
private int bc = pr;
String s = "Member of BC";
}
void f(final int i){ // final i j
// D.
final int j = 99;
//
//
class D{
// D f().
private int d = pr;
String s = "Member of D";
void pr(){
// ,
// "s".
System.out.println(s + (i+j)); // "s" "this.s".
System.out.println(B.this.s);
System.out.println(Nested.this.s);
System.out.println(AB.this.s); // .
System.out.println(A.this.s);
// .
}
}
D d = new D();
// , f().
d.pr();
// f().
}
}
void m(){
new Object(){
// ,
// .
2. - Java
105
? -?
, , .
, , . KISS
.
.
, Nested ,
pr. Java .
,
.
Java -
, ,
Object.
, .
,
new .
. .
.
106
I. Java
? .
? super
, this.
? .
?.. KISS!!!
, , :
Nested$1$D.class D, Nested;
Nested$1.class ;
Nested$A$AB.class Nested.A.AB;
Nested$A.class Nested.A;
Nested$B$BC.class Nested.B.BC;
Nested$B.class Nested.B;
Nested.class Nested;
NestedClasses.class main().
"" , ,
. , , . . .
, . Java .
.
. , . . , final. . , private,
.
. Java ,
, , , .
person Master Pet. Master ,
Pet, Master (inner)
. :
class Pet{
// .
class Master{
// .
string name; // , .
// ...
2. - Java
107
,
.
-. , Master, Pet
?
, ? " " "".
108
I. Java
: "
Master Pet" " Master Pet"?
, , . Master Pet ,
. Master Pet.
-
Java. ,
[36].
, . "" . II III
.
Java .
1. ?
2. ?
3. - ?
4. ?
5. ?
6. ?
7. ?
8. Java?
9. ?
10. ?
11. ?
12. Java?
13. ?
14. ?
15. ?
16. main() ?
17. main() ?
,
Java API .
.
. , - , . ,
, .
Java
(packages). Java .
(subpackages).
.
.
class ( -), , . .
(namespace). ,
, .
, .
, , . , : ..
(fully qualified name).
, -,
, , .
, , , , . ,
, . ,
.
, private, protected public , "" .
private, protected, public,
(default access), . . . -
110
I. Java
public,
, , public, .
, .
?
, java-
package ;
:
package mypack;
mypack ,
, mypack. ,
.
. , ,
subpack, :
package mypack.subpack;
subpack mypack.
, -
package mypack.subpack.sub;
. . .
package ; , .
Java mypack, subpack class- -.
A, B : mypack.A, mypack.subpack.B.
"Code Conventions"
. , , ,
. , ,
, :
com.sun.developer
.
. ?
(unnamed package),
(current working directory) .
3. ,
111
class- , java-.
. . , Java . Java .
, Java SE 7 API java, javax, org.
java applet, awt, beans, dyn, io, lang, math, net, nio, rmi,
security, sql, text, util . , ( ) java.awt
, color, datatransfer, dnd, event, font, geom, im,
image, print.
, Java SE API .
.
. , , . 3.1.
. 3.1.
3.1. Base.java p1
package p1;
class Inp1{
public void f(){
Base b = new Base();
//
b.priv = 1; // "priv has private access in p1.Base"
b.pack = 1;
b.prot = 1;
I. Java
112
b.publ = 1;
}
}
3.1, , private,
.
Inp2.java : Inp2 Derivedp2, Base.
p2.
Base. . 3.2 .
, Base p1 public, p2 .
3.2. Inp2.java p2
package p2;
import p1.Base;
class Inp2{
public static void main(String[] args){
Base b = new Base();
//
b.priv = 1;
// "priv has private access in p1.Base"
//
b.pack = 1;
// "pack is not public in p1.Base;
// cannot be accessed from outside package"
//
b.prot = 1;
// "prot has protected access in p1.Base"
b.publ = 1;
}
}
class Derivedp2 extends Base{
public void f(Base a){
3. ,
//
//
a.priv = 1;
a.pack = 1;
//
= 1;
1;
1;
1;
a.prot
a.publ =
//
priv =
//
pack =
//
//
//
//
113
prot = 1;
publ = 1;
super.prot = 1;
}
}
, , .
, public,
. , protected, ,
, .
, .
. 3.1 .
3.1.
private
"package"
protected
public
* protected- .
, class-, - , ,
.
. D:\jdk1.3\MyProgs\ch3
classes Base.java Inp2.java, 3.1 3.2. 3.2
.
.
1. classes p1 p2.
2. Base.java p1 p1 .
I. Java
114
. 3.2.
classes p1 class.
2. -classpath ,
classes, p1:
javac -classpath classes -d classes Inp2.java
, -d, classes p2
class-, "" p1,
-classpath.
3. classes.
4. java p2.Inp2.
"" , ,
MS-DOS.
3. ,
115
. 3.3.
3.2 import.
?
, : , , java.lang.
. ,
3.2 Base p1.Base.
I. Java
116
, , ,
, . -
import, .
import : import
, . , import .
import , *. .
import p1.*;
, , public.
.
, ? , .
java.lang , .
import,
.
Java SE 5 import, import static.
,
import static java.lang.Math.*;
Math .
double r = Math.cos(Math.PI * alpha);
,
double r = cos(PI * alpha);
, import
"" .
C/C++
import include
.
Java-
Java.
package.
import.
.
3. ,
117
.
public-.
, .
, ,
.
"Code Conventions" , ,
.
Java . , class- .
, ,
, . 3.4, .
"", Object. D B , . 3.4, . (multiple inheritance).
. , B C
, . 3.4, . "" .
. 3.4.
, f(), D. , f() ,
, . . A.f()? , B ? , : .f() C.f()? , ,
.
-, f(). KISS.
,
. ,
.
Java
.
extends .
super .
, - ?
, Automobile,
I. Java
118
Truck Car.
Pickup. , .
Java . , ,
, .
(interface), ,
, .
, ,
, class-.
interface, public, , , .
public , .
interface , extends
- . ,
, , , ,
.
, .
. , , abstract . , static final . .
,
public.
:
interface
interface
interface
interface
Automobile{ . . . }
Car extends Automobile{ . . . }
Truck extends Automobile{ . . . }
Pickup extends Car, Truck{ . . . }
, , . , ,
, .
, ,
?
, (implementation). , . ,
, implements , , .
:
interface Automobile{ . . . }
interface Car extends Automobile{ . . . }
class Truck implements Automobile{ . . . }
class Pickup extends Truck implements Car{ . . . }
3. ,
119
:
interface Automobile{ . . . }
interface Car extends Automobile{ . . . }
interface Truck extends Automobile{ . . . }
class Pickup implements Car, Truck{ . . . }
,
, . , abstract.
Pickup f(), Car, Truck ? .
Pickup. -.
, Java - , .
, , , , ,
.
, . , - . .
3.3 , ""
2.2.
3.3.
interface Voice{
void voice();
}
class Dog implements Voice{
@Override
public void voice(){
System.out.println("Gav-gav!");
}
}
class Cat implements Voice{
@Override
public void voice(){
System.out.println("Miaou!");
}
}
class Cow implements Voice{
@Override
public void voice(){
I. Java
120
System.out.println("Mu-u-u!");
}
}
public class Chorus{
public static void main(String[] args){
Voice[] singer = new Voice[3];
singer[0] = new Dog();
singer[1] = new Cat();
singer[2] = new Cow();
for (Voice v: singer)
v.voice();
}
}
3. ,
121
, Lights, , .
Timer . shift() . sleep()
Thread , . try{}catch(){},
21.
TrafficRegulator Lights
Lights.RED . . , RED, YELLOW GREEN
.
3.4, , , ,
. Java SE 5
(enumerations). ,
, . Lights, 3.4,
, :
enum Lights{ RED, YELLOW, GREEN, ERROR }
122
I. Java
, . ,
. , , ? Lights.
Java ,
enum ,
java.lang.Enum. extends, , . ,
Java API.
Enum , 3.5.
3.5.
enum Lights { RED, YELLOW, GREEN, ERROR }
public class EnumMethods{
public static void main(String[] args){
for (Lights light: Lights.values()){
System.out.println(": " + light.getDeclaringClass());
System.out.println(" : " + light.ordinal());
}
}
}
, -, ,
Lights. light Lights. values(), ,
. , , light.
-, , .
getDeclaringClass() Enum. 3.5 Lights.
-, , ,
0, 1, 2 . . ordinal() Enum.
. ,
, . , , Enum, values(), .
Lights.
, ERROR
1 shift() .
:
TrafficRegulator
enum Lights{
RED(0), YELLOW(1), GREEN(2), ERROR(-1);
private int value;private int currentValue = 0;
Lights(int value){
this.value = value;}
public int getValue(){ return value; }
3. ,
123
, ,
value. Lights
. 3.6.
3.6.
enum Lights{
RED(0), YELLOW(1), GREEN(2), ERROR(-1);
private int value;
private int currentValue = 0;
Lights(int value){
this.value = value;
}
public int getValue(){ return value; }
public Lights nextLight(){
currentValue = (currentValue + 1) % 3;
return Lights.values()[currentValue];
}
}
class Timer {
private int delay;
private static Lights light = Lights.RED;
Timer(int sec){
delay = 1000 * sec;
}
public Lights shift(){
Lights count = light.nextLight();
try{
switch (count){
case RED:
Thread.sleep(delay);
break;
case YELLOW: Thread.sleep(delay/3); break;
case GREEN: Thread.sleep(delay/2); break;
}
}catch(Exception e){
return Lights.ERROR;
}
return count;
}
}
I. Java
124
public class TrafficRegulator{
public static void main(String[] args){
Timer t = new Timer(1);
, ,
. - .
. , ordinal().
. 3.7
,
eval()
Operation.
3.7.
public enum Operation{
PLUS { double eval(double
MINUS { double eval(double
TIMES { double eval(double
DIVIDE{ double eval(double
x,
x,
x,
x,
double
double
double
double
y){
y){
y){
y){
return
return
return
return
x
x
x
x
*
/
y;
y;
y;
y;
}},
}},
}},
}};
, 1, , "at-sign", "". , @Override, 2.2,
:
public @interface Override{ }
3. ,
125
(marker
annotation). ,
-. ,
, default
. ,
public @interface MethodDescription{
int id();
String description() default "[Method]";
String date();
}
, . .
" " .
:
@MethodDescription(
id = 123456,
description = "Calculation method",
date = "04.01.2008"
)
public int someMethod(){
. . .
}
, value(), :
public @interface Copyright{
String value();
}
, " ":
@ Copyright("2008 My Company")
public class MyClass{
. . .
}
, - Java, , . , .
Java,
. ,
(design patterns).
126
I. Java
Design patterns
. : " " " ", , .
? .
, .
, , , ,
, . : ,
, . . . : , , . : , , .
MVC.
MVC
.
, (Controller), -
, , . ,
, .
, (Model), -
, , , -
- , .
, (View),
,
, .
, .
? .
, ,
. - , ? , .
? .
80- Smalltalk
MVC (Model-View-Controller). , , , ,
.
3. ,
127
. ,
, , , , . , MVC.
, , .
- MVC
. setXxx(), .
. getXxx() isXxx() .
MVC . , , setXxx() ,
. , ,
, .
"-" (subscribe-publish). ,
fireXxx(), ,
getXxx() isXxx() .
.
MVC Swing,
11.
90- XX , MVC. ,
.
Singleton
, , . , ,
. Singleton,
3.8.
3.8. Singleton
final class Singleton{
private static Singleton s = new Singleton(0);
private int k;
private Singleton(int i){ // .
k = i;
}
public static Singleton getReference(){ // .
return s;
}
128
I. Java
Singleton .
. s
Singleton , .
getReference(), s setValue() getValue().
Singleton ,
.
[7].
" " (Gang of Four), , , "GoF".
"design patterns".
. "", " ", " ".
GoF 23 , :
: Factory, Abstract Factory, Singleton, Builder, Prototype;
: Adapter, Bridge, Composite, Decorator, Facade,
Flyweight, Proxy;
: Chain of Responsibility, Command, Interpreter, Iterator,
3. ,
129
.
Java,
. , , ,
IV. II III , Core API. .
Java, , , .
-.
1. Java?
2. , , ?
3. "" ,
?
4. , ?
5. ?
6. main() (public)?
7. , ?
8. Java , ?
?
9. Java ? ?
II
Java API
4.
- generics
5.
6.
7.
- generics
Java - . , ,
, Java .
. Java .
, ,
.
Java -
(wrapper) . , ,
, , , ,
.
. 4.1 Java.
java.lang .
Number, , , , : byteValue(), doubleValue(), floatValue(), intValue(),
longValue(), shortValue().
- Byte, Short, Integer, Long, Float Double. -,
Integer, , .
equals(), Object,
, Character Boolean
. 4.1.
134
compareTo(), , , ,
compareTo(). :
0, ;
(1), ,
, true, false.
int compare(xxx a, xxx b);
, a b,
boolean, byte, short, char, int, long, float, double, ,
compareTo(), .
Xxx valueOf(xxx a);
-
String, ,
: Byte.parseByte(), Double.parseDouble(), Float.parseFloat(), Integer.parseInt(),
Long.parseLong(), Short.parseShort(). String, , .
, , . . ,
,
.
MAX_VALUE MIN_VALUE, .
Double Float POSITIVE_INFINITY, NEGATIVE_INFINITY, NaN,
1, isNaN(), isInfinite().
, floatToIntBits() doubleToLongBits(), , , int long .
. -
4. - generics
135
,
intBitsToFloat() longBitsToDouble().
toBinaryString(), toHexString() toOctalString() Integer
Long int long,
, , , .
4.1 , . 4.2 .
. 4.2.
4.1.
class NumberTest{
public static void main(String[] args){
int i = 0;
short sh = 0;
double d = 0;
Integer k1 = Integer.valueOf(55);
Integer k2 = Integer.valueOf(100);
Double d1 = Double.valueOf(3.14);
try{
i = Integer.parseInt(args[0]);
sh = Short.parseShort(args[0]);
d = Double.parseDouble(args[1]);
d1 = new Double(args[1]);
k1 = new Integer(args[0]);
}catch(Exception e){}
double x = 1.0 / 0.0;
System.out.println("i = " + i);
System.out.println("sh = " + sh);
136
parseInt() ,
4.1 try{}catch(){}.
21.
Java SE 5 JDK java.util.concurrent.atomic, ,
, AtomicInteger AtomicLong, .
. addAndGet(), getAndAdd(), incrementAndGet(),
getAndnIncrement(), decrementAndGet(), getAndDecrement, getAndSet(), set()
.
4.1 ,
:
Integer k1 = Integer.valueOf(55);
- , . Java, .
Integer k1 = 55;
k1 .
Java : , ,
. , . , (auto boxing) .
. k1
, ,
int n = k1;
k1 Integer 55. ,
intValue() Integer,
.
4. - generics
137
.
.
class AutoBox{
static int f(Integer value){
return value; // .
}
public static void main(String[] args){
Integer n = f(55);
}
}
main() 55
f() . f() n
Integer.
,
k1++ (k1 + k2 / k1), ! ,
!
(generics)
Java
(generics), , . ,
(generic)
class MyGenericClass<T>{
private T data;
public MyGenericClass(){}
public MyGenericClass(T data){
this.data = data;
}
public T getData(){
return data;
}
public void setData(T data){
this.data = data;
}
}
data , T. , . T
Type.
- , . :
class MyGenericClassDemo{
public static void main(String[] args){
MyGenericClass<Integer> iMyGen = new MyGenericClass<Integer>(55);
138
Integer n = iMyGen.getData();
MyGenericClass<Double> dMyGen = new MyGenericClass<Double>(-37.3456);
Double x = dMyGen.getData();
}
}
,
, ( " ", "diamond operator"). , Java 7, , :
class MyGenericClassDemo{
public static void main(String[] args){
MyGenericClass<Integer> iMyGen = new MyGenericClass<>(55);
Integer n = iMyGen.getData();
MyGenericClass<Double> dMyGen = new MyGenericClass<>(-37.3456);
Double x = dMyGen.getData();
}
}
. , , , , , .
double. 4.2
- .
4.2.
class Average<T extends Number>{
T[] data;
public Average(T[] data) { this.data = data; }
public double average(){
double result = 0.0;
for (T t: data) result += t.doubleValue();
return result / data.length;
}
public static void main(String[] args){
Integer[] iArray = {1, 2, 3, 4};
Double[] dArray = {3.4, 5.6, 2.3, 1.24};
Average<Integer> iAver = new Average<>(iArray);
System.out.println("int average = " + iAver.average());
Average<Double> dAver = new Average<>(dArray);
System.out.println("double average = " + dAver.average());
}
}
4. - generics
139
, ,
T Number. , T
. , average() doubleValue()
Number, , T Number .
, .
<T extends SomeClass> ,
T. , <T super SomeClass>,
T SomeClass .
. :
class MyGenericClass2<S, T>{
private S id;
private T data;
public MyGenericClass2(){}
public MyGenericClass2(S id, T data){
this.id = id;
this.data = data;
}
public S getId(){
return id;
}
public void setId(S data){
this.id = id;
}
public T getData(){
return data;
}
public void setData(T data){
this.data = data;
}
}
, S, T
. ,
, . ,
. :
public MyGenericClass2<S, T> makeClass2(S id,
MyGenericClass<T> data){
return new MyGenericClass2(id, data.getData());
}
, 4.3.
140
4.3.
public class MyGenericClass2Demo<S, T>{
public MyGenericClass2<S, T>
makeClass2(S id, MyGenericClass<T> data){
return new MyGenericClass2(id, data.getData());
}
public static void main(String[] args){
MyGenericClass<Double> dMyGen = new MyGenericClass<>(34.456);
MyGenericClass2Demo<Long, Double> d =
new MyGenericClass2Demo<>();
MyGenericClass2<Long, Double> ldMyGen2 =
d.makeClass2(123456L, dMyGen);
}
}
(wildcard type)
,
, , :
Number n = new Long(123456L);
Number d = new Double(27.346);
, :
Number[] n = new Long[100];
? ,
4.3 :
MyGenericClass2<Number, Number> n =
d.makeClass2(123456L, dMyGen);
// !
. , - B A,
, G<B> G<A>.
(wildcard type), .
" " " ". ,
:
MyGenericClass2<? extends Number, ? extends Number> n = // .
d.makeClass2(123456L, dMyGen);
// .
4. - generics
141
MyGenericClass2<?, ?> n =
d.makeClass2(123456L, dMyGen);
MyGenericClass2 n =
d.makeClass2(123456L, dMyGen);
, .
<? extends Type>, " Type,
Type", <? super Type>, "
Type, Type".
, , :
public MyGenericClass2<S, T> makeClass2(S id,
MyGenericClass<? extends Number> data){
return new MyGenericClass2(id, data.getData());
}
, , . :
Average<? extends Number> a =
// !
new Average<? extends Number>(iArray);
Average<? extends Number>[] a =
// !
new Average<? extends Number>[10];
( ) :
Average<? extends Number>[] a =
new Average<?>[10];
// .
, .
(type parameters) . , 4.4.
4.4.
public class MyGenericClass2Demo{
public <S, T> MyGenericClass2<S, T>
makeClass2(S id, MyGenericClass<T> data){
return new MyGenericClass2(id, data.getData());
}
142
makeClass2() , , MyGenericClass2Demo,
<S, T>.
public <S extends Number, T extends Number>
MyGenericClass2<S, T>
makeClass2(S id, MyGenericClass<T> data){
return new MyGenericClass2(id, data.getData());
}
4.4, ,
.
,
, .
, ,
.
(Angelika Langer), Java Generics FAQ, http://
www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html.
Boolean
, , .
Boolean(String s) , true, s
"true" , false
.
valueOf(boolean b) Boolean boolean.
,
Boolean b = new Boolean("true");
Boolean b = Boolean.valueOf(true);
Boolean b = true;
4. - generics
143
booleanValue() , .
parseBoolean(String s) true, s "true" , false .
Character
.
digit(char ch, in radix);
ch radix
int.
forDigit(int digit, int radix);
digit (
char) radix.
Character.MIN_RADIX
Character.MAX_RADIX.
toString() , , .
toLowerCase(), toUpperCase(), toTitleCase() , , .
Unicode,
.
getName(int code);
Unicode- code.
, :
isDefined() , Unicode;
isDigit() , Unicode;
isIdentifierIgnorable() , -
;
isISOControl() , ;
isBmpCodePoint() , \u0000\uFFFF;
isSupplementaryCodePoint() , \uFFFF;
isJavaIdentifierPart() , -
144
isJavaIdentifierStart() , ;
isLetter() , Java;
isLetterOrDigit() , Unicode;
isLowerCase() , ;
isSpaceChar() , Unicode;
isTitleCase() , ;
isUnicodeIdentifierPart() ,
Unicode;
isUnicodeIdentifierStart() , Unicode;
isUpperCase() , ;
isWhitespace() , .
, , ,
Java API.
4.5 , . 4.3
.
4.5. Character CharacterTest
class CharacterTest{
public static void main(String[] args){
char ch = '9';
Character c1 = Character.valueOf(ch);
System.out.println("ch = " + ch);
System.out.println("c1.charValue() = " +
c1.charValue());
System.out.println("number of 'A' = " +
Character.digit('A', 16));
System.out.println("digit for 12 = " +
Character.forDigit(12, 16));
System.out.println("c1 = " + c1.toString());
System.out.println("ch isDefined? " +
Character.isDefined(ch));
System.out.println("ch isDigit? " +
Character.isDigit(ch));
System.out.println("ch isIdentifierIgnorable? " +
Character.isIdentifierIgnorable(ch));
System.out.println("ch isISOControl? " +
Character.isISOControl(ch));
System.out.println("ch isJavaIdentifierPart? " +
Character.isJavaIdentifierPart(ch));
System.out.println("ch isJavaIdentifierStart? " +
Character.isJavaIdentifierStart(ch));
4. - generics
145
146
-
.
BigInteger
.
Java , , .
, Java API BigInteger, java.math.
Number, ,
doubleValue(), floatValue(), intValue(), longValue(). byteValue() shortValue()
, Number.
BigInteger , . , . .
.
BigInteger ( ), . :
BigInteger(String value) ,
, ;
BigInteger(String value, int radix) value, radix;
BigInteger(byte[] value) ,
value, .
ZERO, ONE TEN , BigInteger.
toByteArray() .
BigInteger , BigInteger:
abs() , ,
this;
add(x) this + x;
this x;
gcd(x) this -
x;
4. - generics
147
max(x) this x;
min(x) this x;
mod(x) this x;
modInverse(x) , this, x;
modPow(n, m) this, n, m;
multiply(x) this * x;
negate() , ;
not() ~this;
or(x) this | x;
pow(n) , , n;
remainder(x) this % x;
shiftLeft(n) this << n;
shiftRight(n) this >> n;
signum() sign(x);
subtract(x) this x;
xor(x) " " this ^ x.
4.6 , . 4.4 .
4.6. BigInteger BigIntegerTest
import java.math.BigInteger;
class BigIntegerTest{
public static void main(String[] args){
BigInteger a = new BigInteger("99999999999999999");
BigInteger b = new BigInteger("88888888888888888888");
System.out.println("bits in a = " + a.bitLength());
System.out.println("bits in b = " + b.bitLength());
System.out.println("a + b = " + a.add(b));
System.out.println("a & b = " + a.and(b));
System.out.println("a & ~b = " + a.andNot(b));
System.out.println("a / b = " + a.divide(b));
BigInteger[] r = a.divideAndRemainder(b);
System.out.println("a / b: q = " + r[0] + ", r = " + r[1]);
System.out.println("gcd(a, b) = " + a.gcd(b));
System.out.println("max(a, b) = " + a.max(b));
System.out.println("min(a, b) = " + a.min(b));
System.out.println("a mod b = " + a.mod(b));
System.out.println("1/a mod b = " + a.modInverse(b));
System.out.println("a^n mod b = " + a.modPow(a, b));
148
, 4.6
java.math.
BigDecimal
BigDecimal java.math.
:
BigInteger int. ,
76,34862 7 634 862 BigInteger 5
int. ,
, Integer.MAX_VALUE.
4. - generics
149
BigDecimal
, :
ROUND_CEILING ;
ROUND_DOWN , ;
ROUND_FLOOR ;
ROUND_HALF_DOWN ,
;
ROUND_HALF_EVEN ,
;
ROUND_HALF_UP ,
;
ROUND_UNNECESSARY , ,
;
ROUND_UP , .
;
BigDecimal(BigInteger mantissa, int scale) mantissa -
scale ; scale , ;
BigDecimal(double d) -
d; d NaN, ;
BigDecimal(String val) val, -
Java.
, .
, , ,
, BigDecimal(0.1), , ,
. . 4.5. , BigDecimal("0.1"), 1.
MathContext .
doubleValue(), floatValue(), intValue(), longValue().
ZERO, ONE TEN , BigDecimal.
.
BigDecimal. x
150
BigDecimal, n int, r , :
abs() this;
add(x) this + x;
divide(x, r) this / x r;
divide(x, n, r) this / x
r;
max(x) this x;
min(x) this x;
movePointLeft(n) n ;
movePointRight(n) n ;
multiply(x) this * x;
negate() ;
scale() ;
setScale(n) n;
setScale(n, r) n -
r;
signum() , ;
subtract(x) this x;
toBigInteger() , ;
unscaledValue() ;
upl() .
4.7 , . 4.5 .
Java SE 5 BigDecimal .
4.7. BigDecimal BigDecimalTest
import java.math.*;
class BigDecimalTest{
public static void main(String[] args){
BigDecimal x = new BigDecimal("-12345.67890123456789");
BigDecimal y = new BigDecimal("345.7896e-4");
BigDecimal z = new BigDecimal(new BigInteger("123456789"), 8);
System.out.println("|x| = " + x.abs());
System.out.println("x + y = " + x.add(y));
System.out.println("x / y = " + x.divide(y, BigDecimal.ROUND_DOWN));
System.out.println("x / y = " + x.divide(y, 6, BigDecimal.ROUND_HALF_EVEN));
System.out.println("max(x, y) = " + x.max(y));
System.out.println("min(x, y) = " + x.min(y));
4. - generics
151
. ,
. .
4.8,
. 4.6.
4.8.
import java.math.*;
class Calc{
public static void main(String[] args){
if (args.length < 3){
152
. 4.6.
. 4.6 ? UNIX , .
, Java.
(shell) ,
. , Java ,
, .
. Java ,
.
Class
Object, Java, , , .
Object.
4. - generics
153
Class , . , , , , ,
, , , .
Class , Java getClass()
Object, :
String s = " ";
Class c = s.getClass();
,
Class, . (reflection). ,
.
forName(String class) Class Class
, , :
Class c1 = Class.forName("java.lang.String");
Class class:
Class c2 = java.lang.String.class;
154
Field[] fld = null;
String s = "Some string";
c = s.getClass();
try{
c1 = Class.forName("java.lang.String");
c2 = java.lang.String.class;
if (!c1.isPrimitive())
fld = c1.getDeclaredFields();
}catch(Exception e){}
System.out.println("Class
c: "
System.out.println("Class
c1: "
System.out.println("Class
c2: "
System.out.println("Superclass c: "
System.out.println("Package
c: "
System.out.println("Modifiers c: "
for(int i = 0; i < fld.length; i++)
System.out.println(fld[i]);
+
+
+
+
+
+
//
//
// String
c);
c1);
c2);
c.getSuperclass());
c.getPackage());
c.getModifiers());
}
}
, , , . try{}catch(){}.
21.
4. - generics
155
1. Java ?
2. - ?
3. BigInteger?
4. BigDecimal?
5.
-?
6. Java ?
7.
?
8. ?
9. , ?
. , Java .
String StringBuilder.
StringBuilder, ,
StringBuffer, 23.
StringBuilder Java, Java SE 5,
.
CharSequence,
. :
length() ;
charAt(int pos) , pos .
, ;
subSequence(int start, int end) ,
start
end .
,
, , , .
, char
byte,
.
? String - , , .
.
String .
, StringBuilder StringBuffer, , ,
. , String, Java StringBuilder StringBuffer, ,
String. , :
String s = "" + " " + "";
5.
157
:
String s = new StringBuffer().append("").append(" ")
.append("").toString();
StringBuffer StringBuilder,
append() "", " ", "", StringBuffer StringBuilder String toString().
, Unicode,
. char.
String
, .
.
String -:
String s1 = " .";
, , :
String s2 = " String, " +
" ";
String s = "",
, String s = null,
.
new. String :
String() ;
String(String str) :
, ;
String(StringBuffer str) StringBuffer;
String(StringBuilder str) StringBuilder;
String(byte[] byteArray) byteArray;
String(char[] charArray) charArray Unicode;
String(byte[] byteArray, int offset, int count) -
Unicode;
158
Unicode, ,
Unicode, ;
Unicode- encoding;
String(byte[] byteArray, int offset, int count, String encoding) ,
Unicode- , charset;
String(byte[] byteArray, int offset, int count, Charset charset) ,
.
offset, count encoding
.
, byteArray,
Unicode- ASCII- . ASCII-, .
Unicode
. '\u0000'
'\u00FF' Unicode, Latin1. , , .
, " " (locale) ( MS Windows Regional Options (
) Control Panel ( )), ,
, Unicode, .
MS Windows CP1251.
ASCII- CP1251,
Java . '\u0400'
'\u04FF' Unicode.
:
MS-DOS CP866;
UNIX KOI8-R;
Apple Macintosh MacCyrillic;
ISO8859-5.
, 11100011 (0xE3 ) CP1251
, CP866 , KOI8R , ISO8859-5 , MacCyrillic .
ASCII- ,
CP1251, Unicode- Java .
,
encoding charset ,
.
5.
159
5.1 .
, "" :
byteCp1251 "" CP1251;
byteCp866 "" CP866;
byteKOI8R "" KOI8-R.
.
, c[] s1, , CP866, s2. , s3 .
5.1.
class StringTest{
public static void main(String[] args){
String winLikeWin = null, winLikeDOS = null, winLikeUNIX = null;
String dosLikeWin = null, dosLikeDOS = null, dosLikeUNIX = null;
String unixLikeWin = null, unixLikeDOS = null, unixLikeUNIX = null;
String msg = null;
byte[] byteCp1251 = {
(byte)0xD0, (byte)0xEE, (byte)0xF1,
(byte)0xF1, (byte)0xE8, (byte)0xFF
};
byte[] byteCp866 = {
(byte)0x90, (byte)0xAE, (byte)0xE1,
(byte)0xE1, (byte)0xA8, (byte)0xEF
};
byte[] byteKOI8R = {
(byte)0xF2, (byte)0xCF, (byte)0xD3,
(byte)0xD3, (byte)0xC9, (byte)0xD1
};
char[] c = {'', '', '', '', '', ''};
String s1 = new String(c);
String s2 = new String(byteCp866);
// MS Windows
String s3 = "";
System.out.println();
try{
// Cp866 MS Windows
msg = new String("\"\" ".getBytes("Cp866"), "Cp1251");
winLikeWin = new String(byteCp1251, "Cp1251");
//
winLikeDOS = new String(byteCp1251, "Cp866");
winLikeUNIX = new String(byteCp1251, "KOI8-R");
dosLikeWin = new String(byteCp866, "Cp1251");
//
dosLikeDOS = new String(byteCp866, "Cp866");
//
dosLikeUNIX = new String(byteCp866, "KOI8-R");
unixLikeWin = new String(byteKOI8R, "Cp1251");
unixLikeDOS = new String(byteKOI8R, "Cp866");
unixLikeUNIX = new String(byteKOI8R, "KOI8-R");
//
160
" + s1);
" + s2);
" + s3);
"
"
"
"
"
"
"
"
"
+
+
+
+
+
+
+
+
+
winLikeWin);
winLikeDOS);
winLikeUNIX);
dosLikeWin);
dosLikeDOS);
dosLikeUNIX);
unixLikeWin);
unixLikeDOS);
unixLikeUNIX);
}
}
5.
161
Unicode
byteCp1251, byteCp866 byteKOI8R. write()
FilterOutputStream java.io.
Java, c[], byteCp866 -.
.
, CP866, CP1251. ?
.
1, Command Prompt
MS Windows CP866.
, "\"\" " , CP866, msg.
. 5.1
codes.txt. MS Windows CP1251.
. 5.2 codes.txt Notepad ().
. 5.2.
, -. Unicode
, ,
.
9 24, ,
, . Java
Unicode.
, , Java Unicode .
:
copyValueOf(char[] charArray);
copyValueOf(char[] charArray, int offset, int length);
162
. ,
char[] c = {'C', '', '', '', '', '', '', '', '', ''};
String s1 = String.copyValueOf(c);
String s2 = String.copyValueOf(c, 3, 7);
s1 "", s2 "".
1. .
(concatenation), (+). ,
, .
, . :
String attention = ": ";
String s = attention + " ";
+= :
attention += s;
+ , . , ,
"2" + 2 + 2, "222". 2 + 2 + "2",
"42", .
"2" + (2 + 2), "24".
concat(), :
String s = attention.concat(" ");
, . . ,
length():
String s = "Write once, run anywhere.";
int len = s.length();
int len = "Write once, run anywhere.".length();
- String.
, , length.
, . 4.7, . ,
, , , String.
5.
163
ind ( )
charAt(int ind). ind , , . ,
char ch = s.charAt(3);
ch 't'.
toCharArray().
dst, ind , begin end ,
getChars(int begin, int end, char[] dst, int ind) void.
end begin , , ind ind + (end begin) 1.
:
dst == null;
begin ;
begin end;
end ;
ind ;
ind + (end begin) dst.length.
,
char[] ch = {'', '', '', '', '', ' ', '', '', '', '', ''};
" ".getChars(2, 8, ch, 2);
:
ch = {'', '', '', '', '', '', ' ', '', '', '', ''};
, ASCII, getBytes().
Unicode ASCII .
, - ,
getBytes(String encoding) getBytes(Charset encoding).
5.1 msg. "\" \"" CP866-
Command Prompt MS Windows.
substring(int begin, int end) begin
end .
end begin. , long.
164
end,
,
String s = "Write once, run anywhere.";
String sub1 = s.substring(6, 10);
String sub2 = s.substring(16);
split(String regExp) , , regExp,
. .
,
String s = "Write:once,:run:anywhere.";
String[] sub = s.split(":");
sub sub[0],
"Write", sub[1], "once,:run:anywhere.".
,
regExp . (regular
expression) , , . , - , :
String[] word = s.split(\\s+);
== . , . ,
String s1 = "- ";
String s2 = " ";
s1 == s2 false.
5.
165
true , ,
s1 = s2.
, s3 :
String s3 = "- ";
s1 == s3 true, ,
"- "
s1, s3. ,
String .
, , , . .
equals(Object obj), Object,
true, obj null, String, , ,
. false.
equalsIgnoreCase(Object obj) , ,
, .
, s2.equals(" ") false, s2.equalsIgnoreCase("
") true.
compareTo(String str) int, :
1. this str ,
, , k
.
2. this.charAt(k) str.charAt(k), . .
Unicode .
3. this.length() str.length(), . .
.
4. , 0.
str null, .
, equals() true.
compareToIgnoreCase(String str) ,
,
this.toUpperCase().toLowerCase().compareTo(
str.toUpperCase().toLowerCase());
.
Unicode , . , '\u0401',
, '\u0451'.
166
,
RuleBasedCollator java.text.
this len
str
regionMatches(int ind1, String str, int ind2, int len);
, .
, :
regionMatches(boolean flag, int ind1, String str, int ind2, int len);
.
ch this
indexOf(int ch), 1, ch
this .
, "".indexOf('') 1.
, , this.charAt(k++) == ch, true.
ch this indexOf(int ch, int ind). ch ind.
ind < 0, , ind ,
, . . 1.
, "".indexOf('', indexOf('') + 1) 3.
ch this
lastIndexOf(int ch). . ch
, 1.
, "".lastIndexOf('') 5.
ch this lastIndexOf(int ch, int ind),
, ind. ind ,
; ind < 0, 1.
5.
167
.
sub this
indexOf(String sub). sub 1, sub this. , "".indexOf("") 4.
, - ind,
indexOf(String sub, int ind). ind < 0, ; ind
, , . . 1.
sub this
lastIndexOf(String sub),
sub this 1, sub this.
sub this, ind lastIndexOf(String str, int ind). ind
, ; ind < 0, 1.
, this sub, startsWith(String sub), true,
this sub , sub .
sub this, ind startsWith(String sub, int ind). ind , false.
, this sub, endsWith(String sub). , true,
sub sub .
, if (fileName.endsWith(".java")) Java.
, sub == null.
, , .
toLowerCase() ,
, . . .
toUpperCase() , , . . .
.
,
toLowerCase(Locale loc);
toUpperCase(Locale loc);
168
replace(char old, char new) ,
old new. old ,
.
, " ".replace('', '')
" ".
.
replace(String old, String new) , old new. old ,
.
replaceAll(String oldRegEx, String new) ,
oldRegEx new. old
, .
oldRegEx ,
.
replaceFirst(String oldRegEx, String new) ,
, , .
.
trim() , , '\u0020'.
Java
.
String valueOf(type elem)
boolean, char, int, long, float, double, char[]
Object.
valueOf(char[] ch, int offset, int len)
ch, offset len .
, toString(),
Object. .
valueOf() toString() . , toString().
elem - :
"" + elem. elem.toString().
5.
169
2. .
3. .
4. .
StringBuilder
StringBuilder .
(capacity),
16 . .
, ,
.
,
ensureCapacity(int minCapacity);
, minCapacity
. .
N.
Max(2 * N + 2, minCapacity)
, .
setLength(int newLength) .
, '\u0000'.
, ,
, , '\u0000'.
.
newLength , .
C
, .
, String,
length(), capacity().
StringBuilder .
StringBuilder :
StringBuilder() 16 ;
StringBuilder(int capacity) capacity;
StringBuilder(String str) str.length() + 16,
str;
StringBuilder(CharSequence str) , str.
170
StringBuilder append(),
. ,
, .
append(String str) str .
str == null, "null".
StringBuffer CharSequence.
append(type elem) boolean, char, int, long,
.
float, double,
str sub , :
append(char[] str);
append(char[] sub, int offset, int len);
insert() ,
, . , , .
, .
, . , .
insert(int ind, String str) str
ind. str == null, "null".
,
String s = new StringBuilder(" ").
insert(4, "").toString();
s == " ".
sb.insert(sb.length(), "xxx") , sb.append("xxx").
insert(int ind, type elem) boolean, char,
int, long, float, double, .
str sub , :
insert(int ind, char[] str);
insert(int ind, char[] sub, int offset, int len);
5.
171
:
insert(int ind, harSequence str);
insert(int ind, CharSequence sub, int start, int end);
CharSequence.
delete(int begin, int end) , begin
end ; end ,
.
,
String s = new StringBuilder(" ").
delete(4, 6).toString();
s == " ".
begin , end, .
begin == end, .
deleteCharAt(int ind) ind.
.
ind ,
.
replace(int begin, int end, String str) ,
begin end , end
, , str.
begin , end, .
, replace() delete()
insert().
reverse() .
,
String s = new StringBuilder(" ").
reverse().toString();
s == " ".
172
(parsing) ,
. - (parser), . , : YACC, LEX .
split().
. , - , .
java.util StringTokenizer, .
StringTokenizer
StringTokenizer java.util ,
.
, StringTokenizer(String str), , str , , '\t',
'\n' '\r'. .
, StringTokenizer(String str, String delimeters),
delimeters, :
StringTokenizer(",:-", " \t\n\r,:-");
. ,
, , , , .
delimeters . .
:
StringTokenizer(String str, String delimeters, boolean flag);
:
nextToken() ;
hasMoreTokens() true, ,
false,
, countTokens(), .
, nextToken(String newDelimeters), " " . newDelimeters;
, nextToken().
, nextElement() hasMoreElements(),
Enumeration. nextToken() hasMoreTokens().
5.
173
( 5.2).
5.2.
import java.util.*;
class MyParser{
public static void main(String[] args){
String s = ", ";
StringTokenizer st = new StringTokenizer(s, " \t\n\r,.");
while(st.hasMoreTokens()){
// - ,
//
System.out.println(st.nextToken());
}
}
}
- -: Vector, Stack
, . .
Java.
, JDK. . , , .
ZIP- src.zip, JDK, D:\jdk1.7.0.
jdk1.7.0 , , src,
, JDK, .
1. Java , ?
2. String StringBuilder?
3. StringBuffer StringBuilder?
4. : append()
StringBuilder?
5. : split() StringTokenizer?
-
5.2 . ?
. ,
, , , .
. , .
, , , .
,
.
, ,
, .
Java Vector,
Object.
Vector
Vector java.util Object, , . .
0, 1, 2 . . , .
, (size) ,
(capacity) . ,
ensureCapacity(int minCapacity)
trimToSize().
Java 2 Vector , . , -.
. , Java.
6. -
175
:
Vector() 10 ;
Vector(int capacity) capacity;
Vector(int capacity, int increment)
capacity
increment, -
;
Vector(Collection c) .
capacity , .
. , , . Vector ,
,
(generic) , , :
Vector<String> v = new Vector<String>();
, " ",
Vector<String> v = new Vector<>();
,
String.
.
add(Object element) (
addElement(Object element)).
add(int index, Object element) insertElementAt(Object element,
int index) index. ,
, ,
.
addAll(Collection coll) coll.
addAll(int index, Collection coll) index coll.
:
Vector v = new Vector();
v.add(new Date());
v.add(" ");
v.add(new Integer(10));
v.add(20);
.
: 10 -
176
set(int index, Object element)
index, element (
setElementAt(Object element, int index)).
size().
capacity() .
isEmpty() true, .
firstElement(), lastElement(), get(int index)
elementAt(int index).
Object. , :
String s = (String)v.get(1);
, ,
Vector<String> v = new Vector<>();
v.add("First");
v.add("Second");
,
String s = v.get(1);
Object[] toArray()
toArray(Object[] a). a,
.
,
contains(Object element) true, element .
containsAll(Collection c) true,
.
6. -
177
element:
indexOf(Object element) -
;
indexOf(Object element, int begin) , begin -
;
lastIndexOf(Object element)
;
lastIndexOf(Object element, int start) start
.
, 1.
remove(Object element) element. true, .
remove(int index) index
Object.
void:
.
clear(),
setSize(0).
. 6.1 5.2,
.
removeAllElements()
6.1.
import java.util.*;
class MyParser{
public static void main(String[] args){
Vector<String> v = new Vector<>();
String s = ", .";
StringTokenizer st = new StringTokenizer(s, " \t\n\r,.");
178
while (st.hasMoreTokens()){
//
v.add(st.nextToken());
//
System.out.println(v.firstElement()); //
System.out.println(v.lastElement()); //
v.setSize(4);
//
v.add(".");
// .
v.set(3, "");
// 3.
for (int i = 0; i < v.size(); i++)
// .
System.out.print(v.get(i) + " ");
System.out.println();
for (String s: v)
// .
System.out.print(s + " ");
System.out.println();
}
}
Vector , Object, ,
, .
. , .
. .
Stack
Stack Vector.
Stack java.util .
(stack)
, , , . LIFO (Last In First Out,
).
Stack().
, "" , , .
Vector Stack , :
push(Object item) item ;
pop() ;
peek() , ;
empty() , ;
search(Object item) item . -
1, 2 . . , 1.
6. -
179
6.2 ,
, .
6.2.
import java.util.*;
class StackTest{
static boolean checkParity(String expression, String open, String close){
Stack<String> stack = new Stack<>();
StringTokenizer st = new StringTokenizer(expression,
" \t\n\r+*/-(){}", true);
while (st.hasMoreTokens()){
String tmp = st.nextToken();
if (tmp.equals(open)) stack.push(open);
if (tmp.equals(close)) stack.pop();
}
if (stack.isEmpty()) return true;
return false;
}
public static void main(String[] args){
System.out.println(
checkParity("a (b (c a) / (b + c) 2)", "(", ")"));
}
}
, .
Hashtable.
Hashtable
Hashtable Dictionary. " ". . .
" . . " , , .
. "
", " ", " ", " 1975" . .
.
Hashtable (size) ,
: (capacity) ,
(load factor) ,
.
180
Hashtable
Hashtable :
Hashtable() 101 -
0,75;
Hashtable(int capacity) capacity
0,75;
Hashtable(int capacity, float loadFactor) -
capacity loadFactor;
Hashtable(Map f) Hashtable, -
f, , f,
11, 0,75.
,
.
(generics) :
Hashtable<Integer, String> h = new Hashtable<Integer, String>();
, " ",
Hashtable<Integer, String> h = new Hashtable<>();
.
.
Hashtable
Hashtable :
Object put(Object key, Object value) "key value", key
, value key, .
null, .
null, ;
void putAll(Map f) f.
get(Object key) key Object , .
, .
6. -
181
containsKey(Object key) true,
key.
containsValue(Object value) contains(Object value) true, value.
isEmpty() true, .
Hashtable
values() value Collection.
, .
keySet() key
Set. Set , .
entrySet() "key value" Set. Set , .
, Hashtable : , .
toString() , .
elements() keys()
Enumeration.
remove(Object key) key, ,
, null, key .
clear() , .
6.3 , Hashtable , . 6.1 .
6.3.
import java.util.*;
class PhoneBook{
public static void main(String[] args){
Hashtable<String, String> yp = new Hashtable<>();
String name = null;
yp.put("John",
"123-45-67");
yp.put("Lennon", "567-34-12");
yp.put("Bill",
"342-65-87");
yp.put("Gates", "423-83-49");
yp.put("Batman", "532-25-08");
try{
name = args[0];
182
}catch(Exception e){
System.out.println("Usage: java PhoneBook Name");
return;
}
if (yp.containsKey(name))
System.out.println(name + "'s phone = " + yp.get(name));
else
System.out.println("Sorry, no such name");
}
}
. 6.1.
Properties
Properties Hashtable ,
, String.
" ",
.
Properties :
Properties() ;
Properties(Properties default) default.
Hashtable Properties :
, - :
String getProperty(String key)
key;
, , key ;
load(InputStream in) in;
list(PrintStream out) list(PrintWriter out)
out;
6. -
183
header.
6.4 . 6.2
Java.
6.4.
class Prop{
public static void main(String[] args){
System.getProperties().list(System.out);
}
}
. 6.2.
184
NavigableSet
Deque
LinkedBlockingDeque BlockingDeque
ArrayDeque
. 6.3. -
AbstractMap
HashMap
LinkedHashMap
WeakHashMap
TreeMap
Arrays
Bitset
Collections
Dictionary
Hashtable
Map
SortedMap
NavigableMap
Map.Entry
Properties
. 6.4. -
6. -
185
Collection
Collection java.util List, Set
Queue. , :
boolean add(Object obj) obj ;
false,
, ; true, ;
boolean addAll(Collection coll) coll
;
void clear() ;
boolean contains(Object obj) obj ;
boolean containsAll(Collection coll)
coll
boolean isEmpty() , ;
Iterator iterator() ;
boolean remove(Object obj) ;
false,
, true, ;
;
boolean retainAll(Collection coll) ,
coll;
int size() ;
Object[] toArray() ;
Object[] toArray(Object[] a) a,
List
List java.util, Collection, . (sequence). , ,
. Set List
.
186
Vector List.
List Collection , index :
void add(int index, Object obj) obj index;
, index, , ;
boolean addAll(int index, Collection coll) coll;
Object get(int index) , index;
int indexOf(Object obj) obj -
ListIterator listIterator() ;
ListIterator listIterator(int index) -
index;
Object set(int index, Object obj) , index,
obj;
List subList(int from, int to) from -
to .
Set
Set java.util, Collection, , . (set). , .
Set , add()
, .
SortedSet.
SortedSet
SortedSet java.util, Set, ,
, - Comparator.
, , ,
.
:
Comparator comparator() ;
Object first() , ;
6. -
187
toElement ;
Object last() , ;
SortedSet subSet(Object fromElement, Object toElement) -
fromElement toElement ;
SortedSet tailSet(Object fromElement) ,
fromElement .
NavigableSet
NavigableSet java.util, SortedSet, , .
, ,
.
null, :
Object lower(Object elem) ,
elem;
Object floor(Object elem) ,
elem;
Object higher(Object elem) ,
elem;
Object ceiling(Object elem) -
, elem.
:
NavigableSet subSet(Object fromElement, boolean fromInclusive,
Object toElement,
boolean toInclusive)
fromElement
,
fromInclusive == true,
toElement inclusive;
NavigableSet tailSet(Object fromElement, boolean inclusive) ,
fromElement inclusive.
, :
Object pollFirst() -
;
Object pollLast()
188
Queue
Queue java.util, Collection,
. , , . .
FIFO (First In First Out,
).
Queue Collection ,
:
Object element() , .
, ;
Object peek() , .
element() ;
Object remove() . , ;
Object poll() .
remove() ;
boolean offer(Object obj) true,
.
BlockingQueue
BlockingQueue java.util.concurrent, Queue,
, , . , , , , . , ,
, , .
:
Object take() , -
, ;
void put(Object element) element ,
, ;
int drainTo(Collection coll, int num) num
, coll, ;
int drainTo(Collection coll) , -
coll .
Deque
Deque (double ended queue) java.util,
, , .
Queue,
6. -
189
Deque Queue , :
Object getFirst() , . -
element() Queue. ,
;
Object getLast() , . -
, ;
Object peekFirst() , .
peek() Queue. ;
Object peekLast() , . -
;
void addFirst(Object obj) ;
void addLast(Object obj) .
add() Collection;
;
boolean offerLast(Object obj) true,
. offer() Queue;
Object removeFirst() . -
remove() Queue. ,
;
Object removeLast() . -
, ;
Object pollFirst() . -
removeLast() ;
boolean removeFirstOccurrence(Object obj)
obj true, . , ;
true, . , .
obj
BlockingDeque
BlockingQueue java.util.concurrent, Queue
Deque, , ,
. ,
, , , -
190
. , ,
, , .
:
Object takeFirst() ,
, . take() BlockingQueue;
Object takeLast() ,
, ;
void putFirst(Object element) element ,
, . put()
BlockingQueue;
, .
Map
Map java.util ,
, " ".
, ,
(map).
(dictionary) (associative array).
.
, " ".
Hashtable Map.
Map , :
boolean containsKey(Object key) key;
boolean containsValue(Object value) value;
Set entrySet()
, Map.Entry;
Object get(Object key) , key;
Set keySet() ;
Object put(Object key, Object value) "key value",
, key, ;
void putAll(Map m) m;
Collection values() .
Map Map.Entry,
.
6. -
191
Map.Entry
, entrySet():
getKey() getValue() ;
setValue(Object value) .
SortedMap
SortedMap, Map, Map. , , Comparator.
, ,
, , , .
, :
Comparator comparator() ;
Object firstKey() , ;
SortedMap headMap(Object toKey) toKey -
;
Object lastKey() , ;
SortedMap subMap(Object fromKey, Object toKey) -
fromKey toKey ;
SortedMap tailMap(Object fromKey) ,
fromKey .
NavigableMap
NavigableMap java.util, SortedMap, , .
, ,
. null, :
Map lowerEntry(Object key)
, key;
Object lowerKey(Object key) ,
key;
Map floorEntry(Object key)
, key;
Object floorKey(Object key) ,
key;
Map higherEntry(Object key)
, key;
192
, key;
Map ceilingEntry(Object key) -
, key;
Object ceilingKey(Object key) -
, key.
:
NavigableMap subMap(Object fromKey, boolean fromInclusive, Object toKey, boolean
toInclusive)
fromKey
fromInclusive == true,
toKey
inclusive;
boolean inclusive) ,
fromKey inclusive.
, :
Map pollFirstEntry() -
;
Map pollLastEntry() -
-
, .
, . , Java Collections Framework -.
java.util.
AbstractCollection Collection, iterator(), size().
AbstractList List, get(int) size().
, .
AbstractSequentialList List, listIterator(int index) size().
ListIterator.
AbstractSet Set, , AbstractCollection.
6. -
193
, .
Iterator
7080- , , : , , ,
, , .
: , , , .
, , , [11].
90- , , .
, . Java Collections
Framework Iterator,
. iterator(), Iterator . ,
, , , Iterator .
StringTokenizer, 5.
Iterator :
hasNext() true, ;
next()
Object;
remove() .
, .
,
next() . next() . next()
.
194
remove() , . , remove()
, , .
6.5 6.1 . , List "for-each".
6.5.
6.5.
Vector<String> v = new Vector<>();
String s = ", .";
StringTokenizer st = new StringTokenizer(s, " \t\n\r,.");
while (st.hasMoreTokens()){
//
v.add(st.nextToken()); // .
}
System.out.println(v.firstElement()); // .
System.out.println(v.lastElement()); // .
v.setSize(4);
// .
v.add(".");
// .
v.set(3, "");
// 3.
// List
// :
for (int i = 0; i < v.size(); i++)
// .
System.out.print(v.get(i) + " ");
System.out.println();
// :
Iterator it = v.iterator();
// .
try{
while (it.hasNext())
// ,
System.out.println(it.next()); // .
}catch(Exception e){}
// for-each:
for (String s: v)
// .
System.out.println(s); // .
ListIterator
ListIterator Iterator,
, .
,
.
6. -
195
ListIterator :
void add(Object element) element ;
boolean hasPrevious() true, ,
;
int nextIndex() ;
, ;
Object previous() ;
int previousIndex() ;
void set(Object element) element;
next() previous().
, , , ,
. , , "" . 6.5 try{}catch(){}.
6.5 ListIterator.
// 6.1...
// ...
ListIterator lit = v.listIterator();
// .
// .
try{
while(lit.hasNext())
// ,
System.out.println(lit.next());
//
// .
// .
// .
while(lit.hasPrevious())
System.out.println(lit.previous());
}catch(Exception e){}
, next() previous()
.
, , - Java.
,
ArrayList
ArrayList Vector,
List Iterator.
, . ArrayList Vector , ArrayList . , . 22.
196
ArrayList :
ArrayList() ;
ArrayList(Collection coll) , -
coll;
ArrayList(int initCapacity) initCapacity.
LinkedList List, Queue Deque. Iterator ListIterator, .
, , . LinkedList . , null.
LinkedList :
LinkedList() ;
LinkedList(Collection coll) ,
coll.
LinkedList .
.
6. -
197
1. 6.1 .
,
HashMap Map, Iterator.
HashMap Hashtable . :
HashMap() 0,75;
HashMap(int capacity) capacity
0,75;
HashMap(int capacity, float loadFactor) -
capacity loadFactor;
HashMap(Map f) HashMap, -
f, , f, 11, 0,75.
WeakHashMap HashMap , , , .
LinkedHashMap Map.
, , . .
:
linkedHashMap() 16 ;
LinkedHashMap(int capacity) capacity ;
LinkedHashMap(int capacity, float loadFactor) capacity
loadFactor;
LinkedHashMap(int capacity, float loadFactor, boolean order) -
TreeMap SortedMap.
, .
, , Comparator.
198
:
TreeMap() ;
TreeMap(Comparator c) ,
c;
TreeMap(Map f) , f,
;
TreeMap(SortedMap sf) , sf
.
, ,
entrySet(), :
Iterator it = tm.entrySet().iterator();
, .
Comparator :
int compare(Object obj1, Object obj2) , obj1
- obj2; , ;
, obj1 obj2. , , ,
,
;
boolean equals(Object obj) obj,
true,
- , .
,
, SortedMap .
.
6.6 Complex 2.4. ComplexCompare,
Comparator. 6.7
.
6.6.
import java.util.*;
class ComplexCompare implements Comparator{
public int compare(Object obj1, Object obj2){
Complex z1 = (Complex)obj1, z2 = (Complex)obj2;
double re1 = z1.getRe(), im1 = z1.getIm();
double re2 = z2.getRe(), im2 = z2.getIm();
if (re1 != re2)
return (int)(re1 re2);
6. -
199
2. 6.3 .
,
HashSet
HashSet
Set Iterator.
, -
.
HashSet :
HashSet() 0,75;
HashSet(int capacity) capacity
0,75;
HashSet(int capacity, float loadFactor) -
capacity loadFactor;
HashSet(Collection coll) ,
coll,
LinkedHashSet Set Iterator.
, , . .
LinkedHashSet , :
LinkedHashSet() 16 0,75;
LinkedHashSet(int capacity) capacity -
0,75;
LinkedHashSet(int capacity, float loadFactor)
capacity loadFactor;
0,75.
200
TreeSet SortedSet Iterator.
TreeSet . .
, , Comparator.
, ,
- , .
TreeSet , :
TreeSet() ;
TreeSet(Comparator c) , -
c;
TreeSet(Collection coll) , coll,
;
TreeSet(SortedMap sf) , sf,
.
6.7 , .
ComplexCompare, 6.6.
6.7.
TreeSet<Complex> ts = new TreeSet<>(new ComplexCompare());
ts.add(new Complex(1.2, 3.4));
ts.add(new Complex(-1.25, 33.4));
ts.add(new Complex(1.23, -3.45));
ts.add(new Complex(16.2, 23.4));
Iterator it = ts.iterator();
while (it.hasNext())
((Complex)it.next()).pr();
// for (Complex z: ts) z.pr(); // .
. . Collections.
Collections
Collections , ,
Collections. ,
JDK, .
6. -
201
, , ,
.
,
List. Collections :
static void sort(List coll) -
coll, List;
static void sort(List coll, Comparator c) coll ,
c.
:
static int binarySearch(List coll, Object element) element -
coll
, ;
, element ,
;
static int binarySearch(List coll, Object element, Comparator c) , -
, c.
:
static Object max(Collection coll) -
coll;
static Object max(Collection coll, Comparator c) , -
c;
static Object min(Collection coll) -
coll;
static Object min(Collection coll, Comparator c) , -
c.
"" :
static void shuffle(List coll) ;
static void shuffle(List coll, Random r) -
r.
reverse(List coll) .
copy(List from, List to) from to.
fill(List coll, Object element)
coll element.
Collections .
3. , , .
202
, , Java
. ,
.
,
, .
1. ?
2. ?
3. ?
4. List Set?
5. List Queue?
6. Deque Queue?
7. Java NavigableSet NavigableMap?
8. ?
9. ?
10. ?
11. ?
12. ?
13. - ?
14. Vector, ArrayList?
15. Iterator "for-each"?
16. - ""?
-
, , , , .
Arrays java.util . .
Arrays
.
:
static void sort(type[] a);
Object , c, Comparator:
static void sort(Object[] a, Comparator c);
static void sort(Object[] a, int from, int to, Comparator c);
element
.
204
:
static int binarySearch(type[] a, type element);
:
static <T> int binarySearch(T[] a, T element, Comparator<? Super T> c);
static <T> int binarySearch(T[] a, int from, int to, T element,
Comparator<? Super T> c);
element , ,
c.
.
, ,
, .
Arrays
value:
static void fill(type[], type value);
static void fill(type[], int from, int to, type value);
type Object.
Arrays, ,
type:
static type[] copyOf(type[] a, int newLength);
a, . a
newLength, newLength a, , newLength.
:
static <T> T[] copyOf(T[] a, int newLength);
:
static <T, U> T[] copyOf(U[] a, int newLength, Class<? extends T[]> newType);
7. -
205
, from
to, copyOfRange().
. :
static type[] copyOfRange(type[] a, int from, int to);
to , -
.
:
static <T> T[] copyOfRange(T[] a, int newLength, int from, int to);
:
static <T, U> T[] copyOfRange(U[] a, int from, int to, Class<? extends T[]> newType);
Arrays :
static boolean equals(type[] a1, type[] a2);
type Object.
true, ,
.
:
static boolean deepEquals(Object[] a1, Object[] a2);
, .
Arrays :
static String toString(type[] a);
type Object.
,
.
String.valueOf(type).
:
static String deepToString(Object[] a);
. .
206
-
Arrays - :
static int hashCode(type[] a);
type Object.
List, -
List.hashCode().
:
static int deepHashCode(Object[] a);
- .
.
7.1
Arrays.
7.1. Arrays
import java.util.*;
class ArraysTest{
public static void main(String[] args){
int[] a = {34, -45, 12, 67, -24, 45, 36, -56};
Arrays.sort(a);
for (int i: a)
System.out.print(a[i] + " ");
System.out.println();
Arrays.fill(a, Arrays.binarySearch(a, 12), a.length, 0);
for (int i: a)
System.out.print(a[i] + " ");
System.out.println();
}
}
, -. , ..
( ): 27.06.2011. // ( ): 06/27/11.
, "",
Locale java.util. language country. -
7. -
207
//
//
// CP1251
. ,
, , Locale.getDefault().
, .
Locale :
Locale(String language, String country);
Locale(String language, String country, String variant);
language ,
ISO639, : "ru", "fr", "en". country ,
ISO3166, : "RU", "US", "GB". variant , , , "Traditional".
"ru_RU", "en_GB", "en_US", "en_CA" . .
:
Locale.setDefault(Locale newLocale);
Locale
, locale:
String getCountry() ;
String getDisplayCountry() ,
;
String getDisplayCountry(Locale locale) .
.
, JVM (Java Virtual
Machine, Java), , :
Locale[] getAvailableLocales();
String[] getISOCountries();
String[] getISOLanguages();
208
java.util: Calendar Date.
Date , 1 1970 . 00:00:00
. " " UNIX,
"Epoch".
Date .
, Epoch ,
, System.currentTimeMillis().
Date . Date() , , , Date(long millisec) .
, , long getTime(),
setTime(long newTime).
:
boolean after(long when) true, when ;
boolean before(long when) true, when ;
boolean after(Object when) true, when Date -
.
, ,
int, when; , ; , when:
int compareTo(Date when);
int compareTo(Object when) when Date, -
.
, Date,
Calendar.
(time zone),
(Daylight Savings Time, DST), TimeZone
java.util. SimpleTimeZone.
SimpleTimeZone ,
getDefault(), , , .
,
, ,
getDefault(), ,
, useDaylightTime(),
setDefault(TimeZone zone).
7. -
209
Calendar
Calendar , : , , . Java API GregorianCalendar.
Calendar , / :
Calendar
Calendar
Calendar
Calendar
getInstance();
getInstance(Locale loc);
getInstance(TimeZone tz);
getInstance(TimeZone tz, Locale loc);
JANUARY DECEMBER,
MONDAY SUNDAY.
int getFirstDayOfWeek(),
setFirstDayOfWeek(int day), :
setFirstDayOfWeek(Calendar.MONDAY);
.
get(int field) , field.
Calendar
:
ERA
WEEK_OF_YEAR
DAY_OF_WEEK
SECOND
YEAR
WEEK_OF_MONTH
DAY_OF_WEEK_IN_MONTH
MILLISECOND
MONTH
DAY_OF_YEAR
HOUR_OF_DAY
ZONE_OFFSET
DATE
DAY_OF_MONTH
MINUTE
DST_OFFSET
GregorianCalendar
: BC (Before
Christ) AD (Anno Domini).
, / :
GregorianCalendar();
GregorianCalendar(int year, int month, int date);
GregorianCalendar(int year, int month, int date, int hour, int minute);
GregorianCalendar(int year, int month, int date, int hour, int minute, int second);
GregorianCalendar(Locale loc);
GregorianCalendar(TimeZone tz);
GregorianCalendar(TimeZone tz, Locale loc);
210
setGregorianChange(Date date).
15 1582 .
14 1918 ., , greg :
GregorianCalendar greg = new GregorianCalendar();
greg.setGregorianChange(new
GregorianCalendar(1918, Calendar.FEBRUARY, 14).getTime());
, ,
isLeapYear().
, DateFormat SimpleDateFormat
java.text.
DateFormat :
SHORT : 27.07.11 17:32; -
;
LONG :
.
DEFAULT, MEDIUM.
SimpleDateFormat ,
- , :
SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy hh.mm");
System.out.println(sdf.format(new Date()));
: 27-07-2011 17.32.
d , M , y , h
, m .
SimpleDateFormat.
DateFormatSymbols.
SimpleDateFormat. getInstance() DateFormat,
DateFormat. , , .
format() DateFormat
, .
Date.
7. -
211
:
System.out.println("LONG: " + DateFormat.getDateTimeInstance(
DateFormat.LONG, DateFormat.LONG).format(new Date()));
, ,
double random() java.lang.Math.
,
.
Random java.util. :
Random(long seed) ,
seed;
Random() .
, copyOf() copyOfRange()
Arrays(), System
java.lang, Java. , . :
static void arraycopy(Object src, int src_ind, Object dest, int dest_ind, int count);
, src, count ,
src_ind, , dest,
dest_ind.
, , , .
null.
212
src dest , . , , .
int[] arr = {5, 6, 7, 8, 9, 1, 2, 3, 4, 5, -3, -7};
System.arraycopy(arr, 2, arr, 1, arr.length 2);
System
(run time).
Runtime.
Runtime JVM
. getRuntime().
.
freeMemory() totalMemory() ,
JVM , ,
long. ,
.
exit(int status) JVM status. , . System,
.
halt(int status) JVM. .
loadLibrary(String libName)
libName.
load(String fileName)
fileName, .
, System
.
gc() (garbage
collection). Java
, . - System.gc().
, exec() . .
, Runtime.getRuntime().exec("notepad") Notepad
() MS Windows.
exec() Process, . destroy() , exitValue()
. waitFor()
, .
III
8.
9.
10.
AWT
11.
Swing
12.
13.
14.
Swing
15.
16.
17.
18.
19.
Swing
20.
,
. . , ,
.
, ,
, . , , ,
, ,
: , , ,
.
: MS Windows, X Window System, Macintosh.
: , , , , . . API, , .
: MFC, Motif, OpenLook, Qt, Tk, Xview, OpenWindows, OpenGL, GTK+ .
, .
Java , Java . , .
JDK : , .
Java .
Java , , .
, .
-, .
216
III.
peer-.
Java, peer-, AWT
(Abstract Window Toolkit). , Java
peer-, (peer-to-peer) , .
AWT ,
: MS Windows, Motif, OpenLook, OpenWindows, ,
AWT, "" .
, peer-,
. Java .
- peer- "" (native) ,
++, JDK.
JDK 1.1 AWT .
, Java peer. "" (lightweight),
, peer-, "" (heavy).
"" ,
(look and feel). , ,
- : "Motif", "Metal",
"Windows 95" - , .
"" PL&F (Pluggable
Look and Feel). "plaf".
"" Java,
Swing. AWT,
Swing , , AWT.
Swing JDK 1.1. Java SE JDK AWT
, "100 % Pure Java".
Java SE AWT Swing,
, ,
Java 2D, , DnD (Drag and
Drop).
, Java SE / Input Method Framework
/,
, Accessibility.
Java SE: AWT, Swing, Java 2D, DnD, Input Method
Framework Accessibility Java, JFC (Java Foundation Classes).
,
AWT Swing.
8.
217
()
(component) . ""
, -, . , ,
. , , , , , (). .
, , , .
, , AWT Component
, Component. Component .
AWT.
(container). "", . , Java Container . JComponent
Swing.
Component ,
Container
add().
Container , Component.
, ,
- , .
, ,
. , , .
:
(title bar),
,
;
(border), .
Frame.
AWT, Frame, 8.1. , .
8.1. AWT
import java.awt.*;
class TooSimpleFrame extends Frame{
public static void main(String[] args){
III.
218
TooSimpleFrame Frame, .
fr, setSize()
400 150 . ,
. ,
.
setVisible(true). , , AWT, , ,
,
, setVisible(true).
, . , , . , ,
,
. , <Alt>+<F4>.
, <Ctrl>+<C>.
8.2 8.1 , .
8.2.
import java.awt.*;
import java.awt.event.*;
class SimpleFrame extends Frame{
SimpleFrame(String s){
super(s);
setSize(400, 150);
setVisible(true);
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent ev){
System.exit(0);
}
});
}
public static void main(String[] args){
new SimpleFrame(" ");
}
}
, SimpleFrame, Frame,
s .
8.
219
,
addWindowListener(), .
, WindowAdapter.
windowClosing(), .
exit() System.
.
15,
, AWT,
.
, . . , ,
"Hello, XXI Century World!", , . 8.3
, . 8.1 .
8.3.
import java.awt.*;
import java.awt.event.*;
class HelloWorldFrame extends Frame{
HelloWorldFrame(String s){
super(s);
}
public void paint(Graphics g){
g.setFont(new Font("Serif", Font.ITALIC|Font.BOLD, 30));
g.drawString("Hello, XXI Century World!", 20, 100);
}
public static void main(String[] args){
Frame f = new HelloWorldFrame(", XXI !");
f.setSize(400, 150);
f.setVisible(true);
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent ev){
System.exit(0);
}
});
}
}
. 8.1. -
220
III.
AWT
. 8.2 AWT.
: Button, Canvas, Checkbox, Choice, Container, Label, List, Scrollbar, TextArea,
TextField, MenuBar, Menu, PopupMenu, MenuItem, CheckboxMenuItem. , Canvas "" ,
Component "" .
. 8.2. AWT
8.
221
Swing
Swing
javax.swing JFrame, 8.4.
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
EXIT_ON_CLOSE JFrame,
. ,
WindowConstants, :
DISPOSE_ON_CLOSE , , -
;
DO_NOTHING_ON_CLOSE ;
HIDE_ON_CLOSE . .
Swing
setBackground(Color.WHITE),
8.4. Swing
import java.awt.*;
import javax.swing.*;
class SimpleFrame extends JFrame{
SimpleFrame(String s){
super(s);
setBackground(Color.WHITE);
setSize(400, 150);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public void paint(Graphics g){
g.setFont(new Font("Serif", Font.ITALIC|Font.BOLD, 30));
g.drawString("Hello, XXI Century World!", 20, 100);
}
public static void main(String[] args){
new SimpleFrame(" ");
}
}
III.
222
paint() Component, ,
8.3. , Swing.
, ,
html. , . , txt
. ,
.
Desktop java.awt. , :
browse(URI file) ,
file;
mail() ;
mail(URI mailto) , "To",
file;
.
,
Desktop ,
getDesktop(). , isDesktopSupported().
, Desktop :
Desktop d = null;
if (Desktop.isDesktopSupported())
d = Desktop.getDesktop();
,
- Desktop
public boolean isSupported(Desktop.Action action);
Action:
BROWSE ;
MAIL ;
8.
223
EDIT , ;
OPEN ;
PRINT .
, Desktop :
if (d.isSupported(Desktop.Action.BROWSE))
d.browse(new URI("http://www.bhv.ru"));
if (d.isSupported(Desktop.Action.MAIL))
d.mail();
if (d.isSupported(Desktop.Action.EDIT))
d.edit(new File("/home/user/java/src/MyDesktop.java");
if (d.isSupported(Desktop.Action.OPEN))
d.open(new File("/home/user/java/src/MyDesktop.java");
if (d.isSupported(Desktop.Action.PRINT))
d.print new File("/home/user/java/src/MyDesktop.java");
System Tray
Java (notification
area), (system tray) .
. java.awt
SystemTray. add(TrayIcon icon) icon , remove(TrayIcon icon) .
.
, , TrayIcon.
. , , , ,
. 15.
,
.
:
TrayIcon icon = null;
if (SystemTray.isSupported()){
SystemTray tray = SystemTray.getSystemTray();
Image im = Toolkit.getDefaultToolkit.getImage("myicon.gif");
icon = new TrayIcon(im);
tray.add(icon);
}
SystemTray. 15.
224
III.
Splash Screen
(splash screen) - ,
. ,
-splash. , name.gif, :
java splash:name.gif SimpleFrame
,
java jar SimpleFrame.jar
MANIFEST.MF, 25.
- SplashScreen
java.awt. setImageURL(URL image)
, Graphics2D
createGraphics(). -
update(). :
SplashScreen splash = SplashScreen.getSplashScreen();
if (splash != null){
Graphics2D g = splash.createGraphics();
g.setPaintMode();
g.drawString("Loading...", 100, 200);
// . ., , 9.
g.update();
}
, AWT . . .
.
Java:
KL Group, JBCL, SWAT, SWT .
, .
,
AWT Swing
, , .
1. ?
2. ?
8.
3. ?
4. .
5. ?
6. ?
7. Swing AWT?
8. AWT Swing?
9. AWT?
225
, . . Component,
(graphics context).
. Color,
Font.
,
(0, 0) , Ox
, Oy . .
Graphics Graphics2D,
Java 2D. , .
Graphics Graphics2D.
Java ,
Graphics
getGraphics() Component paint() update().
,
Graphics.
Graphics
, ,
. setColor(Color newColor), newColor Color.
getColor(), Color.
, Java, , Color.
.
9.
227
,
Color(int red, int green, int blue);
- pureRed - pureGreen.
0.0 ( ) 1.0 ( ):
Color(float red, float green, float blue);
:
Color someColor = new Color(0.05f, 0.4f, 0.95f);
,
Color(int rgb);
. 1623 , 815 , 07
. :
Color c = new Color(0xFF8F48AF);
0x8F, 0x48,
0xAF.
:
Color(int red, int green, int blue, int alpha);
Color(float red, float green, float blue, float alpha);
Color(int rgb, boolean hasAlpha);
, , .
. 255 1.0, , , , . 0 0.0,
, . ,
.
-,
2431, hasAlpha true. hasAlpha false, 255, ,
rgb.
, ,
255 1.0.
228
III.
,
Color(ColorSpace cspace, float[] components, float alpha);
,
Color, Color. "Code Conventions" JDK : black, blue, cyan, darkGray, gray, green, lightGray, magenta, orange, pink, red,
white, yellow. JDK , : BLACK, BLUE, CYAN, DARK_GRAY, GRAY, GREEN, LIGHT_GRAY, MAGENTA, ORANGE, PINK, RED,
WHITE, YELLOW. .
SystemColor, Color, , , , , , .
.
Color : getRed(),
getGreen(), getBlue(), getAlpha(), getRGB(), getColorSpace(), getComponents().
brighter() darker()
. , , ,
.
, RGB
HSB :
float[] RGBtoHSB(int red, int green, int blue, float[] hsb);
int HSBtoRGB(int hue, int saturation, int brightness);
, .
1. .
,
drawLine(int x1, int y1, int x2, int y2);
(x1, y1)
(x2, y2).
, , (x, y) drawLine(x, y, x, y)
. , , .
9.
229
:
drawRect(int x, int y, int width, int height) ,
,
(x, y), width height ;
draw3DRect(int x, int y, int width, int height, boolean raised) -
, , raised
true, , raised false;
drawOval(int x, int y, int width, int height) , -
, . width == height, ;
drawArc(int x, int y, int width, int height, int startAngle, int arc) -
, , .
arc startAngle.
Ox. ,
;
drawRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight) -
.
, arcWidth arcHeight, ;
drawPolyline(int[] xPoints, int[] yPoints, int nPoints) -
;
drawPolygon(Polygon p) , -
p Polygon.
Polygon .
Polygon
, , .
:
Polygon() ;
Polygon(int[] xPoints, int[] yPoints, int nPoints)
contains() , , , :
230
boolean
boolean
boolean
boolean
boolean
boolean
III.
contains(int x, int y);
contains(double x, double y);
contains(Point p);
contains(Point2D p);
contains(double x, double y, double width, double height);
contains(Rectangle2D rectangle);
intersects() ,
, ,
, :
boolean intersects(double x, double y, double width, double height);
boolean intersects(Rectangle2D rectangle);
2. : ", , , ".
Graphics
Graphics. ,
: fillRect(), fill3DRect(), fillArc(), fillOval(), fillPolygon(),
fillRoundRect(). , , .
, ,
:
public void paint(Graphics g){
Color initColor = g.getColor();
// .
g.setColor(new Color(0, 0, 255));
// .
// .
g.fillRect(0, 0, getSize().width 1, getSize().height 1);
g.setColor(initColor);
// .
// ...
}
, Graphics .
, ( setBackground() Component). ,
Graphics2D, Java 2D. , setBackground(Color c).
Graphics2D, Graphics
.
9.
231
,
Graphics :
(x, y),
b, offset;
drawChars(char[] ch, int offset, int length, int x, int y) length -
ch, offset.
, ,
AttributedCharacterIterator. :
drawString(AttributedCharacterIterator iter, int x, int y);
(x, y)
(baseline) .
setFont(Font newFont) Graphics
.
getFont() .
Java, , Font. ,
.
Font (glyphs) , .
:
Font(Map attributes) attributes .
java.awt.font. Java 2D
;
TextAttribute
232
III.
style Font:
BOLD ;
ITALIC ;
PLAIN .
(bolditalic) ,
Font.BOLD|Font.ITALIC, 8.3.
(font face name) (font name).
, .
, "Serif" (family)
"Times New Roman",
"Times New Roman Bold", "Times New Roman Italic". ,
.
:
Font[] fonts = Toolkit.getGraphicsEnvironment.getAllFonts();
for (Font f: fonts)
System.out.println(f.getFontName());
fontconfig.2003.properties;
fontconfig.Me.properties;
fontconfig.RedHat.properties
fontconfig.2000.XP.properties;
. .
fontconfig.XP.properties;
JDK jdk1.7.0/jre/lib -
lib JDK ,
.
, src, ,
bfc.
Java . , fontconfig.properties, .
fontconfig.properties,
.
.
9.1 fontconfig.properties.src Java
SE 7 MS Windows.
9.
9.1. fontconfig.properties.src
#
# Copyright 2003, 2010, Oracle and/or
its affilates. All rights reserved.
#
# Version
version=1
# Component Font Mappings
allfonts.chinese-ms936=SimSun
allfonts.chinese-gb18030=SimSun-18030
allfonts.chinese-hkscs=MingLiU_HKSCS
allfonts.devanagari=Mangal
allfonts.dingbats=Wingdings
allfonts.lucida=Lucida Sans Regular
allfonts.symbol=Symbol
allfonts.thai=Lucida Sans Regular
serif.plain.alphabetic=Times New Roman
serif.plain.chinese-ms950=MingLiU
serif.plain.hebrew=David
serif.plain.japanese=MS Mincho
serif.plain.korean=Batang
serif.bold.alphabetic=Times New Roman Bold
#
serif.italic.alphabetic=Times New Roman Italic
#
serif.bolditalic.alphabetic=Times New Roman Bold Italic
#
sansserif.plain.alphabetic=Arial
#
monospaced.plain.alphabetic=Courier New
#
dialog.plain.alphabetic=Arial
#
dialoginput.plain.alphabetic=Courier New
#
# Search Sequences
sequence.allfonts=alphabetic/default,dingbats,symbol
#
# Exclusion Ranges
exclusion.alphabetic=0700-1e9f,1f00-20ab,20ad-f8ff
exclusion.chinese-gb18030=0390-03d6,2200-22ef,2701-27be
exclusion.hebrew=0041-005a,0060-007a,007f-00ff,20ac-20ac
# Monospaced to Proportional width variant mapping
# (Experimental private syntax)
proportional.MS_Gothic=MS PGothic
proportional.MS_Mincho=MS PMincho
proportional.MingLiU=PMingLiU
233
234
III.
.
, :
"dialog" "Arial";
"dialoginput" "Courier New";
"serif" "Times New Roman";
"sansserif" "Arial";
"monospaced" "Courier New".
, : dialog.italic, dialog.bold . .,
.
9.1, filename, , :
filename.Arial=ARIAL.TTF
, .
9.
235
9.1.
exclusion.alphabetic=0700-1e9f,1f00-20ab,20ad-f8ff
Wingdings.
, str drawString(),
Font,
, "Serif". Java
fontconfig.properties, , , Times New
Roman. Unicode-,
str Unicode . ASCII-, str , CharToByteCp1251.
Java SE docs/technotes/guides/intl/
fontconfig.html.
, ,
JDK 1.0 "Helvetica", "TimesRoman", "Courier", JDK 1.1 "SansSerif", "Serif", "Monospaced" .
: , . : . FontMetrics.
Java 2D FontMetrics TextLayout.
, ,
FontMetrics.
FontMetrics
FontMetrics , . FontMetrics, f, getFontMetrics(Font f)
Graphics Component.
[12].
FontMetrics ch
charWidth(ch),
getChars() getBytes(), str stringWidth(str).
.
236
III.
(leading) , , , , , , getLeading().
(ascent) getAscent(), getMaxAscent().
(descent)
getDescent(), getMaxDescent().
, (height) ascent + descent + leading getHeight().
.
. 9.1.
. 9.1.
LineMetrics java.awt.font.
getLineMetrics() FontMetrics.
9.2 , . 9.2
.
9.2.
import java.awt.*;
import javax.swing.*;
class GraphTest extends JFrame{
GraphTest(String s){
super(s);
setBounds(0, 0, 500, 300);
setVisible(true);
}
public void paint(Graphics g){
Dimension d = getSize();
int dx = d.width / 20, dy = d.height / 20;
g.drawRect(dx, dy + 20,
d.width 2 * dx, d.height 2 * dy 20);
g.drawRoundRect(2 * dx, 2 * dy + 20,
d.width 4 * dx, d.height 4 * dy 20, dx, dy);
9.
g.fillArc(d.width / 2 dx, d.height 2 * dy + 1,
2 * dx, dy 1, 0, 360);
g.drawArc(d.width / 2 3 * dx, d.height 3 * dy / 2 5,
dx, dy / 2, 0, 360);
g.drawArc(d.width / 2 + 2 * dx, d.height 3 * dy / 2 5,
dx, dy / 2, 0, 360);
Font f1 = new Font("Serif", Font.BOLD|Font.ITALIC, 2 * dy);
Font f2 = new Font("Serif", Font.BOLD, 5 * dy / 2);
FontMetrics fm1 = getFontMetrics(f1);
FontMetrics fm2 = getFontMetrics(f2);
String s1 = " ";
String s2 = " .";
String s3 = " ";
int firstLine = d.height / 3;
int nextLine = fm1.getHeight();
int secondLine = firstLine + nextLine / 2;
g.setFont(f2);
g.drawString(s3, (d.width-fm2.stringWidth(s3)) / 2, firstLine);
g.drawLine(d.width / 4, secondLine 2,
3 * d.width / 4, secondLine 2);
g.drawLine(d.width / 4, secondLine 1,
3 * d.width / 4, secondLine 1);
g.drawLine(d.width / 4, secondLine,
3 * d.width / 4, secondLine);
g.setFont(f1);
g.drawString(s1, (d.width fm1.stringWidth(s1)) / 2,
firstLine + 2 * nextLine);
g.drawString(s2, (d.width fm1.stringWidth(s2)) / 2,
firstLine + 3 * nextLine);
}
public static void main(String[] args){
GraphTest f = new GraphTest(" ");
f.setDefaultCloseOperation(EXIT_ON_CLOSE);
}
}
. 9.2. Graphics
237
238
III.
3. .
Java 2D
Java 2D, Graphics2D
java.awt, .
, Graphics -
(User Space),
(Device Space): , .
Graphics2D (transform)
.
"", , / /.
AffineTransform. setTransform(). " " transform() translate() concatenate().
, -
, .
9.
239
: , , .,
Shape java.awt.
draw(),
, Shape. fill(), , Shape.
(stroke) (pen). -
Stroke. BasicStroke .
:
(width) ( ) ;
(end cap)
CAP_ROUND, CAP_SQUARE ( ) CAP_BUTT;
(line joins)
JOIN_ROUND, JOIN_BEVEL JOIN_MITER ( );
(dash) ,
,
,
.
Paint. -
. Color (solid) ,
(gradient) , , TexturePaint (pattern fill).
MultipleGradientPaint ,
LinearGradientPaint ,
RadialGradientPaint .
GradientPaint
, . . , Shape,
draw()
. ,
.
, ,
, ,
. , .
, . TextAttribute.
(rendering) (hints),
RenderingHints.
Java 2D , . ,
.
240
III.
(transform) ,
. setTransform() ,
.
AffineTransform java.awt.geom, Color Font .
AffineTransform.
AffineTransform
AffineTransform:
AffineTransform(double a, double b, double c, double d, double e, double f);
AffineTransform(float a, float b, float c, float d, float e, float f);
(x, y)
(a * x + c * y + e, b * x + d * y + f) .
,
. , , ,
.
- {a, b, c, d, e, f} {a, b, c, d}, e = f = 0,
:
AffineTransform(double[] arr);
AffineTransform(float[] arr);
, , :
AffineTransform(AffineTransform at);
:
AffineTransform();
, . 57 (20, 40) , :
AffineTransform at =
new AffineTransform(-1.5, 4.45, -0.56, 34.7, 2.68, 0.01);
g.setTransform(at);
9.
241
, AffineTransform.
getRotateInstance(double angle) angle, -
, . ,
Ox Oy. , angle
.
getRotateInstance(double angle, double x, double y)
(x, y).
getRotateInstance(double vx, double vy) , -
Oy sy .
getShareInstance(double shx, double shy) (x, y)
(x + shx * y, shy * x + y).
createInverse() , .
:
setTransform(AffineTransform at);
setTransform(double a, double b, double c, double d, double e, double f);
setToIdentity();
setToRotation(double angle);
setToRotation(double angle, double x, double y);
setToRotation(double vx, double vy);
setToRotation(double vx, double vy, double x, double y);
setToQuadrantRotation(int n);
setToQuadrantRotation(int n, double x, double y);
setToScale(double sx, double sy);
setToShare(double shx, double shy);
setToTranslate(double tx, double ty);
, .
242
III.
, :
concatenate(AffineTransform at);
rotate(double angle);
rotate(double angle, double x, double y);
rotate(double vx, double vy);
rotate(double vx, double vy, double x, double y);
quadrantRotate(int n);
quadrantRotate(int n, double x, double y);
scale(double sx, double sy);
shear(double shx, double shy);
translate(double tx, double ty);
, .
, preConcatenate(AffineTransform at), , .
AffineTransform
.
. paint(), 9.2,
import java.awt.geom.*;
, 9.3.
9.3.
// 9.2...
public void paint(Graphics gr){
Graphics2D g = (Graphics2D)gr;
AffineTransform at =
AffineTransform.getRotateInstance(-Math.PI/4.0, 250.0, 150.0);
at.concatenate(
new AffineTransform(0.5, 0.0, 0.0, 0.5, 100.0, 60.0));
g.setTransform(at);
Dimension d = getSize();
// 9.2
9.
243
. 45
(250.0, 150.0).
. 9.3.
. 9.3.
4. 9.3 , .
Java 2D
Stroke. Java 2D
, , BasicStroke.
BasicStroke
BasicStroke . ,
BasicStroke(float width, int cap, int join, float miter,
float[] dash, float dashBegin);
:
width ;
cap; :
CAP_ROUND
CAP_SQUARE
CAP_BUTT
III.
244
join; :
JOIN_ROUND
;
JOIN_BEVEL , ;
JOIN_MITER ;
miter,
JOIN_MITER;
dash;
, ; ;
dashBegin, dash.
:
BasicStroke(float width, int cap, int join, float miter) ;
BasicStroke(float width, int cap, int join)
JOIN_MITER miter = 10.0f;
BasicStroke(float width) CAP_SQUARE JOIN_MITER miter = 10.0f;
JOIN_ROUND JOIN_BEVEL;
BasicStroke() 1.0f.
, . 9.4
, . 9.4 , .
9.4.
import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;
class StrokeTest extends JFrame{
StrokeTest(String s){
super(s);
setSize(500, 400);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void paint(Graphics gr){
Graphics2D g = (Graphics2D)gr;
g.setFont(new Font("Serif", Font.PLAIN, 15));
BasicStroke pen1 = new BasicStroke(20, BasicStroke.CAP_BUTT,
BasicStroke.JOIN_MITER,30);
BasicStroke pen2 = new BasicStroke(20, BasicStroke.CAP_ROUND,
BasicStroke.JOIN_ROUND);
BasicStroke pen3 = new BasicStroke(20, BasicStroke.CAP_SQUARE,
BasicStroke.JOIN_BEVEL);
float[] dash1 = {5, 20};
BasicStroke pen4 = new BasicStroke(10, BasicStroke.CAP_ROUND,
BasicStroke.JOIN_BEVEL, 10, dash1, 0);
9.
float[] dash2 = {10, 5, 5, 5};
BasicStroke pen5 = new BasicStroke(10, BasicStroke.CAP_BUTT,
BasicStroke.JOIN_BEVEL, 10, dash2, 0);
g.setStroke(pen1);
g.draw(new Rectangle2D.Double(50, 50, 50, 50));
g.draw(new Line2D.Double(50, 180, 150, 180));
g.setStroke(pen2);
g.draw(new Rectangle2D.Double(200, 50, 50, 50));
g.draw(new Line2D.Double(50, 230, 150, 230));
g.setStroke(pen3);
g.draw(new Rectangle2D.Double(350, 50, 50, 50));
g.draw(new Line2D.Double(50, 280, 150, 280));
g.drawString("JOIN_MITER", 40, 130);
g.drawString("JOIN_ROUND", 180, 130);
g.drawString("JOIN_BEVEL", 330, 130);
g.drawString("CAP_BUTT", 170, 190);
g.drawString("CAP_ROUND", 170, 240);
g.drawString("CAP_SQUARE", 170, 290);
g.setStroke(pen5);
g.draw(new Line2D.Double(50, 330, 250, 330));
g.setStroke(pen4);
g.draw(new Line2D.Double(50, 360, 250, 360));
g.drawString("{10, 5, 5, 5,...}", 260, 335);
g.drawString("{5, 10,...}", 260, 365);
}
public static void main(String[] args){
new StrokeTest(" ");
}
}
. 9.4.
245
246
III.
setStroke()
draw() fill().
, draw() Graphics2D,
Shape. , , , , Rectangle2D,
RoundRectangle2D, Line2D, Ellipse2D, Arc2D, Point2D java.awt.geom.
CubicCurve2D QuadCurve2D .
, Double
Float . 9.4 Rectangle2D.Double Line2d.Double
.
GeneralPath
java.awt.geom GeneralPath.
,
, .
, Shape,
GeneralPath.
GeneralPath .
GeneralPath GeneralPath() ,
, GeneralPath(Shape sh).
append(Shape sh, boolean connect);
connect true, .
. (0, 0), (x, y) moveTo(float x, float y).
(x, y) :
lineTo(float x, float y);
quadTo(float x1, float y1, float x, float y);
curveTo(float x1, float y1, float x2, float y2, float x,
float y).
(x, y).
closePath().
:
GeneralPath p = new
p.moveTo(x1, y1);
p.lineTo(x2, y2);
p.lineTo(x3, y3);
p.closePath();
GeneralPath();
// ,
// ,
// ,
// .
9.
247
Paint. Java 2D
Color, GradientPaint,
TexturePaint, MultipleGradientPaint LinearGradientPaint
RadialGradientPaint. Color , ,
GradientPaint TexturePaint.
GradientPaint TexturePaint
GradientPaint .
, M N, . (x1, y1) c1,
N(x2, y2) c2. c1 c2 , N, , MN.
GradientPaint(float x1, float y1, Color c1,
float x2, float y2, Color c2);
MN : c1,
N c2.
,
GradientPaint(float x1, float y1, Color c1,
float x2, float y2, Color c2, boolean cyclic);
cyclic == true MN
.
Point2D.
TexturePaint .
BufferedImage java.awt.image. .
20, ,
Graphics2D.
createGraphics() BufferedImage. , .
TexturePaint. , . :
TexturePaint(BufferedImage buffer, Rectangle2D anchor);
248
III.
import java.awt.image.*;
import javax.swing.*;
class PaintTest extends JFrame{
PaintTest(String s){
super(s);
setSize(300, 300);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void paint(Graphics gr){
Graphics2D g = (Graphics2D)gr;
BufferedImage bi =
new BufferedImage(20, 20, BufferedImage.TYPE_INT_RGB);
Graphics2D big = bi.createGraphics();
big.draw(new Line2D.Double(0.0, 0.0, 10.0, 10.0));
big.draw(new Line2D.Double(0.0, 10.0, 10.0, 0.0));
TexturePaint tp = new TexturePaint(bi,
new Rectangle2D.Double(0.0, 0.0, 10.0, 10.0));
g.setPaint(tp);
g.fill(new Rectangle2D.Double(50,50, 200, 200));
GradientPaint gp =
new GradientPaint(100, 100, Color.white,
150, 150, Color.black, true);
g.setPaint(gp);
g.fill(new Ellipse2D.Double(100, 100, 200, 200));
}
public static void main(String[] args){
new PaintTest(" ");
}
}
. 9.5.
9.
249
LinearGradientPaint RadialGradientPaint
LinearGradientPaint RadialGradientPaint , , .
MultipleGradientPaint.
, GradientPaint, MN, 0.0
1.0 . , :
float[] dist = {0.0f, 0.2f, 1.0f};
:
.
. :
Color[] color = {Color.RED, Color.WHITE, Color.BLUE};
.
,
.
LinearGradientPaint:
LinearGradientPaint(float x1, float y1, float x2, float y2,
float[] dist, Color[] color);
RadialGradientPaint.
RadialGradientPaint(float x, float y, float radius,
float[] dist, Color[] color);
, ;
REFLECT .
:
LinearGradientPaint(float x1, float y1, float x2, float y2,
float[] dist, Color[] color,
MultipleGradientPaint.CycleMethod method);
RadialGradientPaint(float x, float y, float radius,
float[] dist, Color[] color,
MultipleGradientPaint.CycleMethod method);
Point2D.
250
III.
RGB, .
LinearGradientPaint RadialGradientPaint
setPaint(Paint p)
fill(Shape sh).
Java 2D
Font , : , , , ,
, ,
.
TextAttribute.
. 9.1.
9.1.
BACKGROUND
. , Paint
FOREGROUND
. , Paint
BIDI_EMBEDDED
. 1 15
CHAR_REPLACEMENT
, . GraphicAttribute
FAMILY
. String
FONT
. Font
JUSTIFICATION
. Float
0.0 1.0. : JUSTIFICATION_FULL
JUSTIFICATION_NONE
KERLING
, "AWAY". KERLING_ON
LIGATURES
, "float".
LIGATURES_ON
POSTURE
. Float. :
POSTURE_OBLIQUE POSTURE_REGULAR
RUN_DIRECTION
: RUN_DIRECTION_LTR ,
RUN_DIRECTION_RTL
SIZE
. Float
STRIKETHROUGH
. STRIKETHROUGH_ON,
SUPERSCRIPT
. : SUPERSCRIPT_NONE,
SUPERSCRIPT_SUB, SUPERSCRIPT_SUPER
SWAP_COLORS
. SWAP_COLORS_ON,
9.
251
9.1 ()
TRAKING
.
TRAKING_TIGHT ,
TRAKING_LOOSE
TRANSFORM
. AffineTransform
UNDERLINE
. : UNDERLINE_ON,
UNDERLINE_LOW_DASHED, UNDERLINE_LOW_DOTTED, UNDERLINE_LOW_GRAY,
UNDERLINE_LOW_ONE_PIXEL, UNDERLINE_LOW_TWO_PIXEL
WEIGHT
. : WEIGHT_ULTRA_LIGHT,
WEIGHT__EXTRA_LIGHT, WEIGHT__LIGHT, WEIGHT__DEMILIGHT,
WEIGHT__REGULAR, WEIGHT__SEMIBOLD, WEIGHT__MEDIUM,
WEIGHT__DEMIBOLD, WEIGHT__BOLD, WEIGHT__HEAVY, WEIGHT__EXTRABOLD,
WEIGHT__ULTRABOLD
WIDTH
. : WIDTH_CONDENSED, WIDTH_SEMI_CONDENSED,
WIDTH_REGULAR, WIDTH_SEMI_EXTENDED, WIDTH_EXTENDED
, . getAvailableAttributes() Font. :
Font f = new Font("Times New Roman", Font.BOLD, 12);
AttributedCharacterIterator.Attribute[] a = f.getAvailableAttributes();
for (int i = 0; i < a.length; i++)
System.out.println(a[i]);
252
III.
TextLayout getXXX(), , ,
draw(Graphics2D g, float x, float y);
Shape.
- , 9.6.
9.6. Java 2D
import
import
import
import
java.awt.*;
java.awt.font.*;
java.awt.geom.*;
javax.swing.*;
9.
253
. 9.6 .
. 9.6. Java 2D
AttributedString java.text.
AttributedString(String text, Map attributes);
, . addAttibute().
, .
TextLayout LineBreakMeasurer, .
TextLayout , .
(caret) . TextHitInfo,
TextLayout ,
.
, .
GlyphVector createGlyphVector()
Font, setGlyphPosition(),
, , setGlyphTransform(), drawGlyphVector() Graphics2D.
9.7 . 9.7 9.7.
9.7.
import java.awt.*;
import java.awt.font.*;
254
III.
import java.awt.geom.*;
import javax.swing.*;
class GlyphTest extends JFrame{
GlyphTest(String s){
super(s);
setSize(400, 150);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void paint(Graphics gr){
int h = 5;
Graphics2D g = (Graphics2D)gr;
FontRenderContext frc = g.getFontRenderContext();
Font f = new Font("Serif", Font.BOLD, 30);
GlyphVector gv = f.createGlyphVector(frc, " ");
int len = gv.getNumGlyphs();
for (int i = 0; i < len; i++){
Point2D.Double p = new Point2D.Double(25 * i, h = -h);
gv.setGlyphPosition(i, p);
}
g.drawGlyphVector(gv, 10, 100);
}
public static void main(String[] args){
new GlyphTest(" ");
}
}
. 9.7.
(rendering) , (hint) Graphics2D:
setRenderingHints(RenderingHints.Key key, Object value);
setRenderingHints(Map hints);
RenderingHints, . 9.2.
9.
255
9.2.
KEY_ANTIALIASING
;
, : VALUE_ANTIALIAS_DEFAULT,
VALUE_ANTIALIAS_ON, VALUE_ANTIALIAS_OFF
KEY_TEXT_ANTIALIASING
. : VALUE_TEXT_ANTIALIASING_DEFAULT,
VALUE_TEXT_ANTIALIASING_ON, VALUE_TEXT_ANTIALIASING_OFF.
LCD- : VALUE_TEXT_ANTIALIAS_GASP,
VALUE_TEXT_ANTIALIAS_LCD_HRGB,
VALUE_TEXT_ANTIALIAS_LCD_HBGR,
VALUE_TEXT_ANTIALIAS_LCD_VRGB,
VALUE_TEXT_ANTIALIAS_LCD_VBGR
KEY_RENDERING
. : VALUE_RENDER_SPEED,
VALUE_RENDER_QUALITY, VALUE_RENDER_DEFAULT
KEY_COLOR_RENDERING
. : VALUE_COLOR_RENDER_SPEED,
VALUE_COLOR_RENDER_QUALITY, VALUE_COLOR_RENDER_DEFAULT
KEY_ALPHA_INTERPOLATION
. :
VALUE_ALPHA_INTERPOLATION_SPEED,
VALUE_ALPHA_INTERPOLATION_QUALITY,
VALUE_ALPHA_INTERPOLATION_DEFAULT
KEY_INTERPOLATION
. : VALUE_INTERPOLATION_BILINEAR,
VALUE_INTERPOLATION_BICUBIC,
VALUE_INTERPOLATION_NEAREST_NEIGHBOR
KEY_DITHERING
. : VALUE_DITHER_ENABLE,
VALUE_DITHER_DISABLE, VALUE_DITHER_DEFAULT
KEY_ALPHA_INTERPOLATION
-. :
VALUE_ALPHA_INTERPOLATION_DEFAULT,
VALUE_ALPHA_INTERPOLATION_QUALITY,
VALUE_ALPHA_INTERPOLATION_SPEED
KEY_STROKE_CONTROL
. : VALUE_STROKE_DEFAULT,
VALUE_STROKE_NORMALIZE, VALUE_STROKE_PURE
,
,
.
paint() :
public void paint(Graphics gr){
Graphics2D g = (Graphics2D)gr;
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g.setRenderingHint(RenderingHints.KEY_RENDERING,
RenderingHints.VALUE_RENDER_QUALITY);
//
}
256
III.
, "awt.font.desktophints", Map , . :
public void paint(Graphics gr){
Graphics2D g = (Graphics2D)gr;
Toolkit tk = Toolkit.getDefaultToolkit();
Map map = (Map)(tk.getDesktopProperty("awt.font.desktophints"));
if (map != null) g.addRenderingHints(map);
//
}
5. Java 2D.
, , Java 2D.
, , , . 20
Java 2D , 23 .
Java SE, docs/technotes/guides/2d/spec,
Programmer's Guide to the Java 2D API Java 2D. Java 2D. demo/jfc/Java2D/ ,
Java 2D.
1. AWT?
2. AWT?
3. ?
4. ?
5. ?
6. : , ?
7. ?
10
AWT
, AWT .
Swing, SWAT, SWT .
AWT, .
AWT .
. 8.2. Component Button, Canvas, Checkbox, Choice, Container, Label, List, Scrollbar, TextArea, TextField,
Panel, ScrollPane, Window, Dialog, FileDialog, Frame.
MenuItem, MenuBar,
Menu, PopupMenu, CheckboxMenuItem.
, , . 15.
. ,
, Component.
Component
Component AWT . ,
, :
BOTTOM_ALIGNMENT, CENTER_ALIGNMENT, LEFT_ALIGNMENT, RIGHT_ALIGNMENT, TOP_ALIGNMENT,
.
getXXX(), isXXX(), setXXX().
, , .
(protected),
Component , ,
.
, , ,
258
III.
. getSize(),
Dimension, getHeight() getWidth(), .
setSize(Dimension d) setSize(int width, int height),
, .
, . getPreferredSize()
Dimension, setPreferredSize(Dimension).
.
getMinimumSize() getMaximumSize() Dimension.
setMinimumSize(Dimension) setMaximumSize(Dimension).
. (0, 0) , Ox , Oy , .
. getLocation(), setLocation(), , .
,
getBounds(), Rectangle,
, setBounds(),
.
,
- . isEnabled(), setEnabled(boolean enable).
Graphics, paint(), ,
getGraphics().
Color.
getBackground(), setBackground(Color color).
getForeground(),
setForeground(Color color).
Font, getFont() setFont(Font font).
Locale. getLocale(), setLocale(Locale locale).
, ,
Cursor. getCursor(). "" setCursor(Cursor cursor).
Point.
getMousePosition(),
Cursor.
10. AWT
259
Cursor
, :
CROSSHAIR_CURSOR ,
- ;
DEFAULT_CURSOR ;
HAND_CURSOR " ", - -
;
MOVE_CURSOR , ;
TEXT_CURSOR , ;
WAIT_CURSOR , .
:
E_RESIZE_CURSOR ;
N_RESIZE_CURSOR ;
NE_RESIZE_CURSOR , ;
NW_RESIZE_CURSOR , ;
S_RESIZE_CURSOR ;
SE_RESIZE_CURSOR , ;
SW_RESIZE_CURSOR , ;
W_RESIZE_CURSOR .
type
Cursor(int type).
someComp .
. CUSTOM_CURSOR.
createCustomCursor(Image cursor, Point hotspot, String name);
Cursor .
cursor Image. , -
260
III.
32 someComp.
1. .
ComponentEvent , , .
10. AWT
261
FocusEvent .
KeyEvent , .
MouseEvent .
Container
Container.
Container Component, .
:
add(Component comp) comp ;
add(Component comp, int index) comp index
, index == -1, ;
add(Component comp, Object constraints)
constraints;
add(String name, Component comp) name.
:
remove(Component comp) comp;
remove(int index) index .
(input focus), .
<Tab> <Shift>+<Tab>. requestFocus()
transferFocus(). , ,
hasFocus(). Component.
(layout manager) , LayoutManager
LayoutManager2. -
: , , ,
. " " " index".
. ,
setLayout(LayoutManager manager);
.
,
setLayout(null).
262
III.
Label
. Label.
Label ,
.
setText(String text), .
:
Label() ;
Label(String text) text,
;
Label(String text, int alignment) text -
Button
Button.
Button
, "" , "".
, Button() Button(String label),
label .
getLabel() setLabel(String label)
.
, . 15.
10. AWT
263
Checkbox
Button Checkbox, .
Checkbox .
,
(state) on. off.
on "" . Checkbox on/off true/false .
, Checkbox(), Checkbox(String label), Checkbox(String label, boolean state),
, label off state .
getLabel(), setLabel(String label), getState(), setState(boolean state)
.
Checkbox ,
, . 10.1. , .
(radio buttons). , ,
"" .
CheckboxGroup
AWT . Checkbox
CheckboxGroup.
CheckboxGroup ,
Checkbox, . CheckboxGroup() :
getSelectedCheckbox(), Checkbox;
setSelectedCheckbox(Checkbox box), .
264
III.
,
CheckboxGroup,
Checkbox(String label, CheckboxGroup group, boolean state);
Checkbox(String label, boolean state, CheckboxGroup group);
,
.
state == true.
. 10.1 , Frame Label , Checkbox,
. Button.
. 10.1.
10.1.
import java.awt.*;
import java.awt.event.*;
class SimpleComp extends Frame{
SimpleComp(String s){
super(s);
setLayout(null);
Font f = new Font("Serif", Font.BOLD, 15);
setFont(f);
Label l1 = new Label(" :", Label.CENTER);
l1.setBounds(10, 50, 120, 30); add(l1);
Label l2 = new Label(" :");
l2.setBounds(160, 50, 200, 30); add(l2);
Checkbox ch1 = new Checkbox("");
ch1.setBounds(20, 90, 100, 30); add(ch1);
Checkbox ch2 = new Checkbox("");
ch2.setBounds(20, 120, 100, 30); add(ch2);
Checkbox ch3 = new Checkbox("");
ch3.setBounds(20, 150, 100, 30); add(ch3);
CheckboxGroup grp = new CheckboxGroup();
Checkbox chg1 = new Checkbox(" ", grp, true);
chg1.setBounds(170, 90, 200, 30); add(chg1);
Checkbox chg2 = new Checkbox(" ", grp, false);
chg2.setBounds(170, 120, 200, 30); add(chg2);
Button b1 = new Button("");
b1.setBounds( 30, 220, 100, 30); add(b1);
Button b2 = new Button("");
b2.setBounds(140, 220, 100, 30); add(b2);
Button b3 = new Button("");
b3.setBounds(250, 220, 100, 30); add(b3);
10. AWT
265
setSize(400, 300);
setVisible(true);
}
public static void main(String[] args){
Frame f = new SimpleComp(" ");
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent ev){
System.exit(0);
}
});
}
}
. 10.1.
, ,
Frame, add(). , setBounds().
.
Choice
, Choice.
Choice , , , (item) ,
.
Choice() .
add(String text) text.
add() .
insert(String text, int position).
select(String text)
select(int position).
266
III.
remove(String text)
remove(int position), removeAll().
getItemCount().
, pos, getItem(int pos), .
, getSelectedIndex(), , getSelectedItem(), .
List
, List.
List ,
. .
:
List() ;
List(int rows) rows ;
List(int rows, boolean multiple) , -
, multiple == true.
item:
add(String item) ;
add(String item, int position) position.
, .
remove(String item), remove(int position), removeAll().
replaceItem(String newItem, int pos)
pos.
getItemCount().
getSelectedItem(), getSelectedIndex().
,
String[] getSelectedItems(),
int[] getSelectedIndexes().
List , .
10. AWT
267
268
III.
. 10.2.
AWT :
TextField, , TextArea,
.
TextComponent, ,
, , .
TextComponent
TextComponent , .
getText() String , .
, .
isEditable(), setEditable(boolean editable).
, , String, ( 0). (caret) getCaretPosition(),
setCaretPosition(int ind) .
, , <Shift>, select(int begin, int end).
begin
end .
selectAll().
setSelectionStart(int ind);
setSelectionEnd(int ind);
10. AWT
269
- , .
getSelectedText(),
getSelectionStart() getSelectionEnd().
TextField
TextField . (column). ,
. <Enter> , . .
ActionEvent.
:
TextField() ;
TextField(int columns) columns;
TextField(String text) text;
TextField(String text, int columns) text
columns.
, TextComponent, getColumns()
setColumns(int col).
. - -, , - .
echo , .
, -, echoCharIsSet(); - getEchoChar().
setEchoChar(char echo).
,
setEchoChar(0).
TextArea
TextArea . <Enter> .
, .
270
III.
,
TextArea(String text, int rows, int columns, int scrollbars);
text, rows,
columns scrollbars :
SCROLLBARS_NONE, SCROLLBARS_HORIZONTAL_ONLY, SCROLLBARS_VERTICAL_ONLY, SCROLLBARS_BOTH.
:
TextArea(String text, int rows, int columns) ;
TextArea(int rows, int columns) ;
TextArea(String text) ;
TextArea() .
TextArea :
append(String text) text ;
insert(String text, int pos) pos;
replaceRange(String text, int begin, int end) ,
begin
end , text.
10. AWT
TextField tf2 = new TextField(30);
tf2.setBounds(100, 60, 160, 25); add(tf2);
tf2.setEchoChar('*');
TextField tf3 = new TextField(" ", 30);
tf3.setBounds(10, 100, 250, 30); add(tf3);
TextArea ta = new TextArea(" :", 5, 50,
TextArea.SCROLLBARS_NONE);
ta.setEditable(false);
ta.setBounds(10, 150, 250, 140); add(ta);
Button b1 = new Button("");
b1.setBounds(280, 180, 100, 30); add(b1);
Button b2 = new Button("");
b2.setBounds(280, 220, 100, 30); add(b2);
Button b3 = new Button("");
b3.setBounds(280, 260, 100, 30); add(b3);
setSize(400, 300);
setVisible(true);
}
public static void main(String[] args){
Frame f = new TextTest(" ");
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent ev){
System.exit(0);
}
});
}
}
. 10.3.
271
272
III.
Scrollbar
Scrollbar , AWT Scrollbar
(slider). , .
.
.
(unit)
. (bubble, thumb)
. (block)
.
"" "" , . , .
Adjustable, Scrollbar.
Scrollbar :
Scrollbar() 0100, -
0 10 ;
Scrollbar(int orientation) orientation -
: HORIZONTAL VERTICAL;
Scrollbar(int orientation, int value, int visible, int min, int max) ,
, value, visible,
minmax.
visible . ,
0,1 .
getValue()
.
, 15.6.
10. AWT
. 10.4.
15.6 "" .
10.4.
import java.awt.*;
import java.awt.event.*;
class ScrollTest extends Frame{
Scrollbar sbRed = new Scrollbar(Scrollbar.VERTICAL, 127, 10, 0, 255);
Scrollbar sbGreen = new Scrollbar(Scrollbar.VERTICAL, 127, 10, 0, 255);
Scrollbar sbBlue = new Scrollbar(Scrollbar.VERTICAL, 127, 10, 0, 255);
Color mixedColor = new Color(127, 127, 127);
Label lm = new Label();
Button b1 = new Button("");
Button b2 = new Button("");
ScrollTest(String s){
super(s);
setLayout(null);
setFont(new Font("Serif", Font.BOLD, 15));
Panel p = new Panel();
p.setLayout(null);
p.setBounds(10,50, 150, 260); add(p);
Label lc = new Label(" ");
lc.setBounds(20, 0, 120, 30); p.add(lc);
Label lmin = new Label("0", Label.RIGHT);
lmin.setBounds(0, 30, 30, 30); p.add(lmin);
Label lmiddle = new Label("127", Label.RIGHT);
lmiddle.setBounds(0, 120, 30, 30); p.add(lmiddle);
Label lmax = new Label("255", Label.RIGHT);
lmax.setBounds(0, 200, 30, 30); p.add(lmax);
273
274
III.
sbRed.setBackground(Color.red);
sbRed.setBounds(40, 30, 20, 200); p.add(sbRed);
sbGreen.setBackground(Color.green);
sbGreen.setBounds(70, 30, 20, 200); p.add(sbGreen);
sbBlue.setBackground(Color.blue);
sbBlue.setBounds(100, 30, 20, 200); p.add(sbBlue);
Label lp = new Label(":");
lp.setBounds(250, 50, 120, 30); add(lp);
lm.setBackground(new Color(127, 127, 127));
lm.setBounds(220, 80, 120, 80); add(lm);
b1.setBounds(240, 200, 100, 30); add(b1);
b2.setBounds(240, 240, 100, 30); add(b2);
setSize(400, 300);
setVisible(true);
}
public static void main(String[] args){
Frame f = new ScrollTest(" ");
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent ev){
System.exit(0);
}
});
}
}
Panel
10.4 Panel. .
Panel ,
Panel.
Panel , . :
Panel() FlowLayout;
Panel(LayoutManager layout) -
layout.
add():
Panel p = new Panel();
p.add(comp1);
p.add(comp2);
. . , .
10. AWT
275
Panel . .
10.4 0, 127 255 . , , . , . p
. setBounds() p,
Frame. , .
,
,
.
ScrollPane
ScrollPane , , .
. , SCROLLBARS_ALWAYS, ,
( )
SCROLLBARS_AS_NEEDED.
, SCROLLBARS_NEVER,
setScrollPosition().
:
ScrollPane() , -
;
ScrollPane(int scrollbars) , -
.
100 100 ,
setSize(int width, int height).
, , ScrollPane , . Panel, .
,
ScrollPane:
getHAdjustable() getVAdjustable()
Adjustable;
getScrollPosition() Point (x, y)
, ScrollPane;
setScrollPosition(Point p) setScrollPosition(int x, int y)
(x, y).
276
III.
Window
Window , : , , , . .
Window , , add().
. , ,
. - , (owner) (parent) Window. , .
:
Window(Frame f) , f;
Window(Window owner) ,
Window.
.
setVisible(true).
setVisible(false), , ,
isShowing().
setIconImage(Image icon);
setIconImages(List<? extends Image> icons);
,
List<Image> getIconImages();
Window , , . Dialog,
PopupMenu.
toFront() , ,
toBack(). setAlwaysOnTop(true)
. , isAlwaysOnTopSupported(). isAlwaysOnTop().
, , dispose().
BorderLayout.
Toolkit,
getToolkit().
10. AWT
277
Frame
Frame , ,
. setTitle(String title). . setMenuBar(MenuBar mb). .
Java.
setIconImage(Image icon), icon
Image. , 20.
Frame . Frame
, , (task bar) , ""
.
Frame :
Frame() ;
Frame(String title) title ;
Frame(GraphicsConfiguration gc) gc.
Frame(String title, GraphicsConfiguration gc) title
gc.
Frame , ,
Frame Component, Container Window.
, BorderLayout.
278
III.
Fr2 f2 = new Fr2(" ");
}
}
class Fr1 extends Frame{
Fr1(String s){
super(s);
setLayout(null);
Font f = new Font("Serif", Font.BOLD, 15);
setFont(f);
Label l = new Label(" ", Label.CENTER);
l.setBounds(10, 30, 180, 30);
add(l);
setSize(200, 100);
setVisible(true);
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent ev){
System.exit(0);
}
});
}
}
class Fr2 extends Frame{
Fr2(String s){
super(s);
setLayout(null);
Font f = new Font("Serif", Font.BOLD, 15);
setFont(f);
Label l = new Label(" ", Label.CENTER);
l.setBounds(10, 30, 180, 30);
add(l);
setBounds(50, 50, 200, 100);
setVisible(true);
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent ev){
dispose();
}
});
}
}
. 10.5 .
, .
. 10.5.
10. AWT
279
Dialog
Dialog ,
. , , , . Dialog, Window, owner, .
Dialog (modal), , .
, , ,
(scope of blocking).
.
, (modality type).
Dialog.ModalityType:
MODELESS ;
DOCUMENT_MODAL , , -
(document root);
APPLICATION_MODAL , -
;
TOOLKIT_MODAL ,
Toolkit.
The
AWT Modality, docs/api/java/awt/doc-files/Modality.html.
Dialog DEFAULT_MODALITY_TYPE, APPLICATION_MODAL
Java SE 6. setModal(true).
, , , Toolkit
isModalityTypeSupported(Dialog.ModalityType modalityType),
modalityType.
. Window
setModalExclusionType(Dialog.ModalExclusionType excType), Dialog.ModalExclusionType:
NO_EXCLUDE ;
APPLICATION_EXCLUDE , APPLICATION_MODAL,
;
TOOLKIT_EXCLUDE , TOOLKIT_MODAL, -
.
- , ,
, Toolkit
isModalExclusionTypeSupported(Dialog.ModalExclusionType excType).
III.
280
Dialog . :
Dialog(Dialog owner) MODELESS
title;
, gc.
, , Frame:
Dialog(Frame
Dialog(Frame
Dialog(Frame
Dialog(Frame
Dialog(Frame
owner);
owner, String title);
owner, boolean modal);
owner, String title, boolean modal);
owner, String title, boolean modal, GraphicsConfiguration gc);
, , Window,
Frame.
Dialog , :
Dialog.ModalityType getModalityType();
,
setModalityType(Dialog.ModalityType type);
. type
, MODELESS.
, .
Java SE isModal(),
, setModal(boolean modal), .
, JDK .
10. AWT
class LoginWin extends Dialog{
LoginWin(Frame f, String s){
super(f, s, true);
setLayout(null);
setFont(new Font("Serif", Font.PLAIN, 14));
Label l1 = new Label(" :", Label.RIGHT);
l1.setBounds(20, 30, 70, 25); add(l1);
Label l2 = new Label(":", Label.RIGHT);
l2.setBounds(20, 60, 70, 25); add(l2);
TextField tf1 = new TextField(30);
tf1.setBounds(100, 30, 160, 25); add(tf1);
TextField tf2 = new TextField(30);
tf2.setBounds(100, 60, 160, 25); add(tf2);
tf2.setEchoChar('*');
Button b1 = new Button("");
b1.setBounds(50, 100, 100, 30); add(b1);
Button b2 = new Button("");
b2.setBounds(160, 100, 100, 30); add(b2);
setBounds(50, 50, 300, 150);
}
}
class DialogTest extends Frame{
DialogTest(String s){
super(s);
setLayout(null);
setSize(200, 100);
setVisible(true);
Dialog d = new LoginWin(this, " ");
d.setVisible(true);
}
public static void main(String[] args){
Frame f = new DialogTest(" -");
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent ev){
System.exit(0);
}
});
}
}
281
282
III.
. 10.6.
FileDialog
FileDialog Frame, ( LOAD) (
SAVE). FileDialog
.
:
FileDialog(Frame owner) ;
FileDialog(Frame owner, String title)
title;
; mode :
FileDialog.LOAD FileDialog.SAVE.
,
Dialog, Frame.
getDirectory() getFile()
String.
/, 23.
FileDialog.
setDirectory(String dir) setFile(String fileName).
fileName , *.java
( ), ,
java.
setFilenameFilter(FilenameFilter filter) filter
. , . Sun JDK MS Windows.
10. AWT
283
,
AWT, Button, TextField -.
, , , Panel, .
, AWT : "" "" . "" AWT Canvas ,
peer- .
Canvas
Canvas . Canvas
Canvas() paint(Graphics g).
"" , Canvas, ,
paint().
, , Button
. .
"" .
10.7 FlowerButton.
paint(). paint(), ,
, , "" .
"".
"" .
, FlowerButton . 15, ,
isDown repaint().
mousePressed() mouseReleased().
Button . 10.7 .
drawFlower(),
10.7.
import java.awt.*;
import java.awt.event.*;
class FlowerButton extends Canvas implements MouseListener{
private boolean isDown=false;
public FlowerButton(){
super();
setBackground(Color.lightGray);
284
III.
addMouseListener(this);
}
public void drawFlower(Graphics g, int x, int y, int w, int h){
g.drawOval(x + 2*w/5 6, y, w/5, w/5);
g.drawLine(x + w/2 6, y + w/5, x + w/2 6, y + h 4);
g.drawOval(x + 3*w/10 6, y + h/3 4, w/5, w/5);
g.drawOval(x + w/2 6, y + h/3 4, w/5, w/5);
}
public void paint(Graphics g){
int w = getSize().width, h = getSize().height;
if (isDown){
g.drawLine(0, 0, w 1, 0);
g.drawLine(1, 1, w 1, 1);
g.drawLine(0, 0, 0, h 1);
g.drawLine(1, 1, 1, h 1);
drawFlower(g, 8, 10, w, h);
}else{
g.drawLine(0, h 2, w 2, h 2);
g.drawLine(1, h 1, w 1, h 1);
g.drawLine(w 2, h 2, w 2, 0);
g.drawLine(w 1, h 1, w 1, 1);
drawFlower(g, 6, 8, w, h);
}
}
public void mousePressed(MouseEvent e){
isDown=true;
repaint();
}
public void mouseReleased(MouseEvent e){
isDown=false;
repaint();
}
public void mouseEntered(MouseEvent e){}
public void mouseExited(MouseEvent e) {}
public void mouseClicked(MouseEvent e){}
}
class DrawButton extends Frame{
DrawButton(String s){
super(s);
setLayout(null);
Button b = new Button("OK");
b.setBounds(200, 50, 100, 60); add(b);
FlowerButton d = new FlowerButton();
d.setBounds(50, 50, 100, 60); add(d);
setSize(400, 150);
setVisible(true);
}
10. AWT
285
. 10.7.
""
"" , peer- , Component Container.
, "" peer-.
, 10.7 FlowerButton
class FlowerButton extends Component implements MouseListener{
, "" ,
, , setBackground(Color.lightGray)
.
,
peer- , "" ,
, Frame. ,
setBackground(), , paint().
setBackground()
paint(), 10.8.
"" "" , paint() "" paint()
:
super.paint(g);
"" -.
"" , "" .
paint() "" paint() .
III.
286
"" peer-,
"" , getPreferredSize(),
, FlowLayout(),
, .
getPreferredSize().
"" , .
. 10.8 , paint() 10.7 , . 10.8 .
10.8.
public void paint(Graphics g){
int w = getSize().width, h = getSize().height;
int d = Math.min(w, h);
//
Color c = g.getColor();
//
g.setColor(Color.lightGray);
//
g.fillArc(0, 0, d, d, 0, 360); //
g.setColor(c);
//
if (isDown){
g.drawArc(0, 0, d, d, 43, 180);
g.drawArc(1, 1, d 2, d 2, 43, 180);
drawFlower(g, 8, 10, d, d);
}else{
g.drawArc(0, 0, d, d, 229, 162);
g.drawArc(1, 1, d 2, d 2, 225, 170);
drawFlower(g, 6, 8, d, d);
}
}
public Dimension getPreferredSize(){
return new Dimension(30,30);
}
public Dimension getMinimumSize(){
return getPreferredSize();
}
public Dimension getMaximumSize(){
return getPreferredSize();
}
. 10.8.
10. AWT
287
, "" . 15.
2. .
Frame
(menu bar), , . 10.9. MenuBar.
. 10.9.
, Frame,
MenuBar setMenuBar():
Frame f = new Frame(" ");
MenuBar mb = new MenuBar();
f.setMenuBar(mb);
mb , :
f.setMenuBar(new MenuBar());
, .
(drop-down menu )
Menu.
,
:
Menu mFile = new Menu("");
mb.add(mFile);
288
III.
. . add(),
. 10.9. (Help)
.
setHelpMenu(),
.
, . MenuItem.
, :
MenuItem create = new MenuItem("");
mFile.add(create);
MenuItem open = new MenuItem("...");
mFile.add(open);
. .
add().
. . . 10.9 . addSeparator() Menu
:
mFile.add(new MenuItem("-"));
, Menu MenuItem, . ,
, :
Menu send = new Menu("");
mFile.add(send);
. .
, , . 10.9.
10. AWT
289
, MS Windows, (tear-off) , .
Menu(String label, boolean tearOff);
tearOff == true ,
. .
, . MenuItem ActionEvent, , -
create.addActionListener(new SomeActionEventHandler());
open.addActionListener(new AnotherActionEventHandler());
CheckboxMenuItem ItemEvent, - :
disk.addItemListener(new SomeItemEventHandler());
, ,
, "" - (shortcut),
<Ctrl>. , "" , Ctrl+N, Ctrl+O. ""
MenuShortcut KeyEvent, :
MenuShortcut keyCreate = new MenuShortcut(KeyEvent.VK_N);
<Ctrl>+<N> . ,
, , :
MenuItem open = new MenuItem("...", new MenuShortcut(KeyEvent.VK_O));
<Shift>. <Shift>+<Ctrl>+<X>, :
MenuShortcut(int key, boolean useShift);
useShift == true.
10.9 . 15. . 10.10.
10.9.
import java.awt.*;
import java.awt.event.*;
public class MenuScribble extends Frame{
public MenuScribble(String s){
super(s);
290
III.
10. AWT
MenuItem blue = new MenuItem("");
MenuItem black = new MenuItem("");
c.add(red); c.add(green); c.add(blue); c.add(black);
red.addActionListener(scr);
green.addActionListener(scr);
blue.addActionListener(scr);
black.addActionListener(scr);
clear.addActionListener(scr);
addWindowListener(new WinClose());
pack();
setVisible(true);
}
class WinClose extends WindowAdapter{
public void windowClosing(WindowEvent e){
System.exit(0);
}
}
public static void main(String[] args){
new MenuScribble(" \"\" ");
}
}
class Scribble extends Component implements
ActionListener, MouseListener, MouseMotionListener{
protected int lastX, lastY, w, h;
protected Color currColor = Color.black;
protected Frame f;
public Scribble(Frame frame, int width, int height){
f = frame; w = width; h = height;
enableEvents(AWTEvent.MOUSE_EVENT_MASK |
AWTEvent.MOUSE_MOTION_EVENT_MASK);
addMouseListener(this);
addMouseMotionListener(this);
}
public Dimension getPreferredSize(){
return new Dimension(w, h);
}
public void actionPerformed(ActionEvent event){
String s = event.getActionCommand();
if (s.equals("")) repaint();
else if (s.equals("")) currColor = Color.red;
else if (s.equals("")) currColor = Color.green;
else if (s.equals(""))
currColor = Color.blue;
else if (s.equals("")) currColor = Color.black;
}
public void mousePressed(MouseEvent e){
if ((e.getModifiers() & MouseEvent.BUTTON1_MASK) == 0) return;
lastX = e.getX(); lastY = e.getY();
}
291
292
III.
. 10.10.
(popup menu) (context) .
, . Java PopupMenu. Menu, , MenuItem.
MenuBar Menu , . Component
add(PopupMenu menu).
, TextField TextArea, . .
. , ,
getComponent() MouseEvent, 10.10.
10. AWT
293
, PopupMenu
,
(x, y) comp. , ,
getComponent(). comp ,
, .
show(Component comp, int x, int y),
MS Windows ,
Motif ,
. , MouseEvent
isPopupTrigger(), ,
. ,
, , . .
show().
- . isPopupTrigger()
processMouseEvent().
10.9, Scribble
. , . 10.10, . 10.11 MS Windows.
10.10.
import java.awt.*;
import java.awt.event.*;
public class PopupMenuScribble extends Frame{
public PopupMenuScribble(String s){
super(s);
ScrollPane pane = new ScrollPane();
pane.setSize(300, 300);
add(pane, BorderLayout.CENTER);
Scribble scr = new Scribble(this, 500, 500);
pane.add(scr);
addWindowListener(new WinClose());
pack();
setVisible(true);
}
class WinClose extends WindowAdapter{
public void windowClosing(WindowEvent e){
System.exit(0);
}
}
public static void main(String[] args){
new PopupMenuScribble(" \"\" ");
}
}
294
III.
10. AWT
295
g.setColor(currColor);
g.drawLine(lastX, lastY, e.getX(), e.getY());
lastX = e.getX(); lastY = e.getY();
}
else super.processMouseMotionEvent(e);
}
}
. 10.11.
1. Container Component, ?
2. ?
3. Component ?
4. Label, ?
5. ?
6. TextField TextArea?
7. Frame, Window?
8. "" "" ?
11
Swing
Java Platform, Standard Edition (Java SE), ,
GUI (Graphical User Interface). JFC (Java Foundation Classes). JFC :
AWT (Abstract Window Toolkit) "" (heavyweight) ,
java.awt . ;
Swing "" (lightweight) ,
AWT.
javax.swing;
Java 2D AWT, , , , . 9;
DnD (Drag and Drop) ,
(clipboard).
java.awt.datatransfer java.awt.dnd;
Input Method Framework /.
java.awt.im java.awt.im.spi;
Accessibility /: , .
javax.accessibility.
Java Swing. ,
Java Runtime Environment (JRE). , JRE, Oracle Java Plug-in,
http://www.oracle.com/technetwork/java/index-jsp-141438.html/ ,
Swing. Java Plug-in JRE
, , JRE.
, <OBJECT> <EMBED>,
.
11. Swing
297
Java SE
SwingSet2, $JAVA_HOME/demo/jfc/SwingSet2/. Swing.
. Swing,
SwingSet2.html. Swing
, Java Plug-in
SwingSet2Plugin.html.
Swing
Swing . ,
.
.
, Swing, , "" , .
, javax.swing. .
11.1 , Swing.
11.1. , Swing
import java.awt.*;
import javax.swing.*;
// AWT.
// Swing.
298
III.
( JColorChooser),
javax.swing.colorchooser.
( )
JFileChooser, javax.swing.filechooser.
JTable
javax.swing.table.
, JTree,
javax.swing.tree.
javax.swing.text. ,
, ,
.
(undo/redo) javax.swing.undo.
javax.swing.text.html javax.swing.text.rtf
HTML RTF,
javax.swing.text.html.parser HTML-.
, , javax.swing.border.
, javax.swing.plaf.*
(Look and Feel, L&F) .
.
. , , , : MS Windows, CDE/Motif, Macintosh,
""
. , (Pluggable Look and Feel, PL&F, PLAF plaf)
.
javax.swing.plaf.multi.
Java , "Java Look and Feel",
"Metal". ""
, , ,
. "" Java L&F
javax.swing.plaf.metal Java.
http://java.sun.com/products/jlf/ Java L&F "Java Look and Feel Design
11. Swing
299
Guidelines". , Swing, ,
, . Swing ,
"The Java Tutorial. A practical
guide for programmers", http://download.oracle.com/javase/
tutorial/.
Swing.
Swing
Swing :
, , , , , , , . javax.swing. .
JComponent.
JComponent
Swing
JComponent. JComponent Container, AWT. JComponent . Container, ,
Component, .
Container JComponent, . Swing
JComponent, .
JComponent , .
, "" , , .
, , .
JComponent Swing.
.
JComponent
setBorder(Border).
setOpaque(boolean).
setBackground(Color).
setFont(Font)
setForeground(Color).
Graphics,
,
paint(Graphics).
300
III.
setCursor(Cursor).
, .
, -
, . setToolTipText(String).
, -
setMinimumSize(Dimension), setMaximumSize(Dimension)
,
setPreferredSize(Dimension)
setLocale(Locale).
KeyEvent MouseEvent,
MouseWheelEvent,
ComponentEvent
FocusEvent,
ContainerEvent.
Swing MVC.
MVC Swing
-- (MVC, Model-View-Controller) 3. .
, Model, ,
, ,
, . setXXX()
.
, View. , ,
, : , , . , - . getXxx() isXxx() .
, Controller, . , setXxx()
, . .
. , ,
setXxx() , . ,
, , .
"-"
(subscribe-publish). , fireXxx(), , getXxx() isXxx() .
Swing , . , Swing . -
11. Swing
301
, .
, , . 11.1.
11.1. ,
BoundedRangeModel
DefaultBoundedRangeModel
ButtonModel
DefaultButtonModel
JToggleButton.ToggleButtonModel
ComboBoxModel
DefaultComboBoxModel
MutableComboBoxModel
ListModel
AbstractListModel
DefaultListModel
ListSelectionModel
DefaultListSelectionModel
SingleSelectionModel
DefaultSingleSelectionModel
ColorSelectionModel
DefaultColorSelectionModel
SpinnerModel
AbstractSpinnerModel
SpinnerDateModel
SpinnerListModel
SpinnerNumberModel
TableColumnModel
DefaultTableColumnModel
TableModel
DefaultTableModel
TreeModel
DefaultTreeModel
TreeSelectionModel
DefaultTreeSelectionModel
JTree.EmptySelectionModel
. , ,
, , .
MVC Swing (delegation)
, (delegate) xxxModel. , , model -,
getModel(), model.
, JTable -:
protected TableColumnModel columnModel;
protected TableModel dataModel;
protected ListSelectionModel selectionModel;
302
III.
, , :
TableColumnModel getColumnModel();
TableModel getModel();
ListSelectionModel getSelectionModel();
.
. , , - , , xxxModel. setModel(xxxModel). , .
JLabel
JLabel. .
JLabel()
,
setText(String) setIcon(Icon).
JLabel(String) JLabel(Icon) -
String,
, Icon, ImageIcon.
, .
JLabel(String, int) JLabel(Icon, int)
11. Swing
303
, .
setHorizontalTextPosition(int)
setVerticalTextPosition(int) . 4 .
setIconTextGap(int).
, :
JLabel l = new JLabel("- ", JLabel.RIGHT);
l.setVerticalAlignment(JLabel.TOP);
JLabel ,
, 10 ,
:
JLabel l = new JLabel("",
new ImageIcon("myimage.gif"), JLabel.CENTER);
l.setHorizontalTextPosition(JLabel.LEFT);
l.setIconTextGap(10);
!
<html> , , .
, . , ,
<br> <p>.
. JLabel
setLabelFor(Component). - , ,
setDisplayedMnemonic('A');
setDisplayedMnemonic(KeyEvent.VK_A);
java.awt.event. A
. <Alt>+<A>
304
III.
( JLabel ). HTML , ,
, <u>.
, . setDisplayedMnemonicIndex(int)
. .
JLabel setEnabled(false)
. ,
, setDisabledIcon(Icon).
JLabel
, , JComponent, Container Component. setForeground(Color), setFont(Font),
setBackground(Color). , JLabel ,
,
setOpaque(true). setBorder(Border).
setToolTipText(String).
, .
Swing , . 11.1.
JMenuItem, JCheckBox,
JRadioButton.
. 11.1.
AbstractButton, ,
. , .
AbstractButton ActionEvent,
, ChangeEvent javax.swing.event, : ,
, . ., ItemEvent,
.
setText(String) setIcon(Icon).
11. Swing
305
JLabel, setDisabledIcon(Icon) , , . . ,
setEnabled(false).
setDisabledSelectedIcon(Icon).
, setRolloverIcon(Icon),
setRolloverEnabled(true). .
setSelectedIcon(Icon),
setRolloverSelectedIcon(Icon), setPressedIcon(Icon). .
, , , ,
,
. , .
setMnemonic(int)
java.awt.event.KeyEvent .
, .
JLabel, ,
setDisplayedMnemonicIndex(int) .
setToolTipText(String).
AbstractButton DefaultButtonModel,
ButtonModel. .
"" (rollover),
. setRollover(boolean) , isRollover().
"" (armed) . setArmed(boolean), isArmed().
"" (pressed) ""
. setPressed(boolean)
isPressed().
"" (selected),
setSelected(boolean) isSelected().
, "" (enabled) "" (disabled)
setEnabled(boolean) isEnabled().
AbstractButton setEnabled(boolean) isEnabled(), DefaultButtonModel, getModel().
, , AbstractButton,
, . , AbstractButton, JButton.
306
III.
JButton
JButton ,
Jlabel, / .
,
setHorizontalAlignment(int);
setVerticalAlignment(int);
setHorisontalTextPosition(int);
setVerticalTextPosition(int);
setIconTextGap(int);
, Jlabel, . , , .
JButton : JButton(), JButton(String)
Jbutton(Icon), JButton(String, Icon). , JButton(Action), , Action.
AbstractButton, JButton
. :
ImageIcon def = new ImageIcon("default.gif");
JButton b = new JButton("<html><u></u>", def);
b.setBackground(new Color(183, 220, 65));
b.setFont(new Font("Lucida", Font.ITALIC, 12));
b.setPreferredSize(new Dimension(100, 30));
b.setMnemonic(KeyEvent.VK_L);
b.setToolTipText(" ");
b.setRolloverEnabled(true);
b.setRolloverIcon(new ImageIcon("rollover.gif"));
b.setSelectedIcon(new ImageIcon("select.gif"));
b.setRolloverSelectedIcon(new ImageIcon("rollselect.gif"));
b.setPressedIcon(new ImageIcon("press.gif"));
b.setDisabledIcon(new ImageIcon("disable.gif"));
b.setDisabledSelectedIcon(new ImageIcon("disselect.gif"));
b.setActionCommand("next");
b.addActionListener(this);
b.addChangeListener(this);
b.addItemListener(this);
JButton ActionEvent,
, ChangeEvent,
, ItemEvent. ,
ComponentEvent ContainerEvent, .
JToggleButton
JToggleButton ,
, true/false,
11. Swing
307
"" . L&F ,
""
. isSelected(),
setSelected(boolean).
JToggleButton .
JToggleButton(String, Icon, boolean);
, true false.
- , false.
HTML. JToggleButton(Action)
, Action.
11.2 .
11.2.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class DummyToggleButton extends JFrame{
private JToggleButton tb;
public DummyToggleButton(){
tb = new JToggleButton("<html><u></u>?<p>?");
tb.setMnemonic(KeyEvent.VK_L);
tb.setToolTipText(" ");
add(tb);
// JDK 5.0
// getContentPane().add(tb);
setSize(300,300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args){
new DummyToggleButton();
}
}
JToggleButton
.
JCheckBox JRadioButton.
308
III.
JCheckBox
JCheckBox
, : true false.
L&F.
JCheckBox .
JCheckBox(String, Icon, boolean), , JToggleButton.
JCheckBox
, JToggleButton.
JRadioButton
,
JRadioButton(String, Icon, boolean), ,
JToggleButton.
JRadioButton
, JToggleButton.
,
. ButtonGroup,
add(AbstractButton).
, . , ,
, . 11.3 . . . 11.2 .
11.3.
import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;
class RadioButtonTest extends JFrame{
public RadioButtonTest(){
setBackground(Color.white);
setLayout(new FlowLayout());
JPanel p = new JPanel();
p.setLayout(new BoxLayout(p, BoxLayout.X_AXIS));
p.setBorder(BorderFactory.createEtchedBorder());
JRadioButton rb1 =
new JRadioButton("<html><u></u><p>");
rb1.setMnemonic(KeyEvent.VK_R);
rb1.setToolTipText("<html> <p> ");
11. Swing
309
rb1.addActionListener(this);
rb1.setActionCommand("red");
JRadioButton rb2 =
new JRadioButton("<html><u></u><p>");
rb2.setMnemonic(KeyEvent.VK_P);
rb2.setToolTipText("<html> <p> ");
rb2.addActionListener(this);
rb2.setActionCommand("green");
JRadioButton rb3 =
new JRadioButton("<html><u></u><p>");
rb3.setMnemonic(KeyEvent.VK_C);
rb3.setToolTipText("<html> <p> ");
rb3.addActionListener(this);
rb3.setActionCommand("blue");
ButtonGroup bg = new ButtonGroup();
bg.add(rb1); bg.add(rb2); bg.add(rb3);
p.add(rb1); p.add(rb2); p.add(rb3);
add(p);
setSize(300, 150);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args){
new RadioButtonTest();
}
}
. 11.2.
JRadioButton,
. ,
.
Swing : JList
JComboBox.
1. 10.1 Swing.
310
III.
JComboBox
JComboBox. , , . JPopupMenu.
JComboBox(), addItem(Object)
insertItemAt(Object, int).
JComboBox(Object[]) JComboBox(Vector),
, . :
String[] data = {"", "", ""};
JComboBox cb = new JComboBox(data);
, , , ,
JComboBox(ComboBoxModel) , .
, :
Object[] data = {new ImageIcon("apple.gif"),
new ImageIcon("grape.gif"),
new ImageIcon("pear.gif")};
JComboBox fruits = new JComboBox(data);
. . " " .
. - , setSelectedItem(Object)
setSelectedIndex(int). null 1 , . ,
.
setEditable(true). ,
ComboBoxEditor.
BasicComboBoxEditor,
JTextField.
, , getSelectedItem().
HTML ,
BasicComboBoxEditor
"" ASCII- getSelectedItem().
.
,
setMaximumRowCount(int);
11. Swing
311
, , .
( <Enter>)
ActionEvent ItemEvent,
PopupMenuEvent.
getSelectedItem(), getSelectedIndex().
JComboBox DefaultComboBoxModel,
: ListModel, ComboBoxModel MutableComboBoxModel,
AbstractListModel.
, JComboBox,
. DefaultComboBoxModel ListDataEvent, JComboBox. ActionEvent ItemEvent.
, JComboBox - ActionListener,
EventListener, ListDataListener, .
. JComboBox Item, getItemAt(int).
DefaultComboBoxModel getElementAt(int).
.
, JComboBox
. . "
" .
JList
JList. , ,
. JList(),
,
JList(Object[]), JList(Vector) JList(ListModel). ,
JComboBox.
JList .
, JScrollPane.
setVisibleRowCount(int). C :
JFrame f = new JFrame();
String[] data = {"", "<html><font color=red>", ""};
JList list = new JList(data);
list.setVisibleRowCount(2);
list.addListSelectionListener(this);
JScrollPane sp = new JScrollPane(list);
f.getContentPane().add(sp);
312
III.
, JComboBox, JList
, .
,
<Ctrl> .
setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
.
SINGLE_INTERVAL_SELECTION.
ListSelectionModel DefaultListSelectionModel.
JList . -
, ListSelectionModel
setSelectionModel(ListSelectionModel).
() getSelectedValue(),
Object[] getSelectedValues(). getSelectedIndex(), getSelectedIndices().
ListSelectionModel JList . ListModel
AbstractListModel. JList DefaultListModel. DefaultListModel
delegate Vector
Vector, -, :
public Object getElementAt(int index){
return delegate.elementAt(index);
}
JList ListSelectionEvent, . , ,
ListDataEvent, .
JList JComboBox ,
String Icon.
. , -.
, . , design pattern, Flyweight.
-, , . -
ListCellRenderer,
public Component getListCellRendererComponent(
JList list,
// ,
11. Swing
Object value,
int index,
boolean isSelected,
boolean cellHasFocus
);
//
//
//
//
313
,
?
?
value, index.
, , isSelected (
) cellHasFocus
( ).
paint().
Swing ListCellRenderer BasicComboBoxRenderer
DefaultListCellRenderer, JLabel. ,
JLabel,
. ,
JComboBox , . BasicComboBoxRenderer
. JList, , . ListCellRenderer. :
public class DefaultListCellRenderer extends JLabel
implements ListCellRenderer, Serializable{
public Component getListCellRendererComponent(
JList list, Object value, int index,
boolean isSelected, boolean cellHasFocus){
setComponentOrientation(list.getComponentOrientation());
if (isSelected){
setBackground(list.getSelectionBackground());
setForeground(list.getSelectionForeground());
}else{
setBackground(list.getBackground());
setForeground(list.getForeground());
}
if (value instanceof Icon){
setIcon((Icon)value);
setText("");
}else{
setIcon(null);
setText((value == null) ? "" : value.toString());
}
setEnabled(list.isEnabled());
setFont(list.getFont());
setBorder((cellHasFocus) ?
UIManager.getBorder("List.focusCellHighlightBorder") :
noFocusBorder);
314
III.
return this;
}
. . . . .
}
,
JList Icon,
String. toString(),
JLabel. , if(value
instanceof Icon)
JLabel
setText(((JLabel)value).getText());
setIcon(((JLabel)value).getIcon());
JLabel.
. getSelectedValue() - , JLabel.toString(), . ,
JLabel, toString().
, , ,
String Icon, ,
. ,
getXxx()/setXxx(), toString(), paint().
JList(Object[])
getListCellRendererComponent() value.
ListCellRenderer.
JLabel JPanel.
2. 10.2 Swing.
JSpinner
,
.
JSpinner().
0, 1, 1,
.
JSpinner(SpinnerModel)
. SpinnerModel,
AbstractSpinnerModel
. SpinnerDateModel , ,
SpinnerListModel , List, , Object[]. SpinnerNumberModel Number.
11. Swing
315
, :
JSpinner sp = new JSpinner(new SpinnerNumberModel(50, 0, 100, 5));
50, 0 100
5. ,
47, 42, 52.
SpinnerNumberModel
SpinnerNumberModel(double current, double min, double max, double step);
SpinnerNumberModel(Number current, Comparable min, Comparable max, Number step);
, SpinnerDateModel,
. SpinnerDateModel()
, ,
, .
316
III.
JScrollBar
Swing.
JScrollPane,
11.3, .
-, . minimum, maximum,
value extent.
, ,
. BoundedRangeModel.
ChangeEvent. JScrollBar
DefaultBoundedRangeModel .
JScrollBar(int orientation, int value, int extent, int min, int max);
JSlider
, value minmax. , .
JSlider DefaultBoundedRangeModel
, , . ,
11. Swing
317
, JSlider(BoundedRangeModel)
setModel(BoundedRangeModel).
:
JSlider(int orientation, int min, int max, int value);
,
min = 0, max = 100, value = (min + max)/2.
,
, setMajorTickSpacing(int).
.
setPaintTicks(true).
setPaintLabels(true).
setMinorTickSpacing(int). setSnapToTicks(true),
.
setPaintTrack(false), .
.
createStandardLabels(int incr, int start) ,
incr start.
setLabelTable(Dictionary). ,
:
JSlider sl = new JSlider();
sl.setMajorTickSpacing(10);
sl.setMinorTickSpacing(5);
sl.setPaintTicks(true);
sl.setPaintLabels(true);
sl.setLabelTable(sl.createStandardLabels(20, 28));
. 11.3. JSlider
setLabelTable(Dictionary) , , -
Dictionary.
SliderUI. BasicSliderUI MultiSliderUI. . 11.3 BasicSliderUI MetalSliderUI.
-,
setUI(SliderUI).
318
III.
ChangeEvent. getValue().
3. 10.4, Swing.
JProgressBar
, "", , . - .
JProgressBar(int orientation, int min, int max);
min max . .
, min = 0, max = 100.
setValue(int). . setStringPainted(true) .
, , ,
(indeterminate mode). setIndeterminate(true). , ,
. , setMaximum(int),
setValue(int) setIndeterminate(false).
ProgressBarUI.
BasicProgressBarUI MultiProgressBarUI. Java
L&F MetalProgressBarUI.
setUI(ProgressBarUI).
,
ProgressMonitor.
JTree
JTree .
, . 0 (root) , 1, 2 . . (child) (node) ,
(parent). (leaf). , .
,
JTree. TreeNode MutableTreeNode. ,
11. Swing
319
, .
DefaultMutableTreeNode javax.swing.tree.
JTree DefaultMutableTreeNode(Object),
.
DefaultMutableTreeNode ,
getParent(). null, ,
, isRoot().
Vector, getXxx(). getLevel() , getDepth() , . insert(MutableTreeNode, int) ,
. setUserObject(Object) ,
.
setEditable(true). TreeCellEditor. DefaultTreeCellEditor, JTreeField.
JTree . JTree(TreeNode), ,
.
:
DefaultMutableTreeNode root = new DefaultMutableTreeNode("");
JTree tr = new JTree(root);
DefaultMutableTreeNode subtree1 = new DefaultMutableTreeNode(" 1");
root.add(subtree1);
subtree1.add(new DefaultMutableTreeNode(" 2a"));
DefaultMutableTreeNode subtree2 = new DefaultMutableTreeNode(" 2");
subtree1.add(subtree2);
subtree2.add(new DefaultMutableTreeNode(" 3a"));
subtree2.add(new DefaultMutableTreeNode(" 3b"));
subtree2.add(new DefaultMutableTreeNode(" 3c"));
subtree1.add(new DefaultMutableTreeNode(" 2b"));
root.add(new DefaultMutableTreeNode(" 1"));
// . ....
String.
. 11.4.
,
toString().
JTree(Vector). .
:
320
III.
. 11.4. JTree
root.add(" 1");
JTree tr = new JTree(root);
, , ,
. , ,
.
JTree(Hashtable),
-.
:
Hashtable root = new Hashtable();
Hashtable subtree1 = new Hashtable();
root.put(" 1", subtree1);
Hashtable subtree2
subtree1.put("
subtree1.put("
subtree2.put("
subtree2.put("
subtree2.put("
subtree1.put("
= new Hashtable();
2a", new Integer(21));
2", subtree2);
3a", new Integer(31));
3b", new Integer(32));
3c", new Integer(33));
2b", new Integer(22));
" ", -,
. . ,
, -, . . ""
.
JScrollPane
, , setVisibleRowCount(int), :
JTree tr = new JTree(root);
JScrollPane sp = new JScrollPane(tr);
tr.setVisibleRowCount(8);
11. Swing
321
.
, , 0. getSelectionRows()
int[] . ,
RowMapper. javax.swing.tree AbstractLayoutCache, , :
FixedHeightLayoutCache VariableHeightLayoutCache.
,
, .
TreePath. getSelectionPath() ,
getSelectionPaths() .
TreePath .
TreePath, Object[] , , getPath().
, . TreePath .
, TreeSelectionModel DefaultTreeSelectionModel.
TreePath[] . :
SINGLE_TREE_SELECTION, CONTIGUOUS_TREE_SELECTION DISCONTIGUOUS_TREE_SELECTION.
. tr :
tr.getSelectionModel().setSelectionMode(
TreeSelectionModel.SINGLE_TREE_SELECTION);
TreeSelectionEvent, . ,
TreeSelectionEvent , getPaths() TreePath[].
,
TreeModel. . . DefaultTreeModel, JTree , , TreeNode.
TreeModelEvent, .
, , getTreePath() TreePath
, , .
JList JTree , TreeCellRenderer.
:
Component getTreeCellRendererComponent(JTree tree, Object value,
boolean selected, boolean expanded, boolean leaf,
int row, boolean hasFocus);
III.
322
Swing
, Swing: , ,
, , MenuElement.
- , , getSubElements()
.
JFrame, JApplet, JDialog setJMenuBar(JMenuBar). .
JMenuBar
JMenuBar().
, add(JMenu) .
add(JMenu). (Help) . , JMenuBar
setHelpMenu(JMenu). ,
JDK.
:
JFrame f = new JFrame(" ");
JMenuBar mb = new JMenuBar());
f.setJMenuBar(mb);
JMenu
JMenu
JMenu
JMenu
file
edit
view
help
=
=
=
=
new
new
new
new
JMenu("<html><u></u>"));
JMenu("<html><u></u>"));
JMenu("<html><u></u>"));
JMenu("<html><u></u>"));
mb.add(file); mb.add(edit);
mb.add(view); mb.add(help);
11. Swing
323
JMenu
: ""
JPopupMenu,
"". . 11.1, JMenu ,
AbstractButton. , JMenu
JMenuItem. , JMenu -
, .
JMenu(String). JMenu(String,
boolean) (tear-off) , true. .
.
add(JMenuItem) add(String). ,
JMenuItem, . , add(Component), .
, ,
MenuElement. ,
JComboBox.
JMenuItem:
JMenu, JCheckBoxMenuItem
JRadioButtonMenuItem.
addSeparator().
, , ,
. insert(JMenuItem, int), insert(String, int) add(Component, int)
,
insertSeparator(int) .
remove(Component), remove(int), remove(JMenuItem) removeAll()
. add() insert() .
, ,
setMnemonic(int). - :
file.setMnemonic(KeyEvent.VK_A);
edit.setMnemonic(KeyEvent.VK_G);
view.setMnemonic(KeyEvent.VK_D);
help.setMnemonic(KeyEvent.VK_C);
MenuEvent, ,
.
JMenuItem
JMenuItem AbstractButton
.
324
III.
JMenuItem(String), JMenuItem(Icon)
JMenuItem(String, Icon). -
, .
.
, .
15.
JMenu nw = new JMenu("");
file.add(nw);
//
nw.add("");
//
nw.add("");
nw.add("");
JMenuItem open = file.add("...");
JMenuItem close = file.add("");
file.addSeparator();
// :
JMenuItem exit = new JMenuItem("");
file.add(exit);
// :
open.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
JFileChooser fch = new JFileChooser();
fch.showOpenDialog(null);
}
});
exit.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
System.exit(0);
}
});
, ,
-, JMenuItem(String, int).
, setMnemonic(int) JMenuItem,
, , . setAccelerator(KeyStroke),
, Ctrl+O.
:
open.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, Event.CTRL_MASK));
11. Swing
325
JCheckBoxMenuItem
Swing JCheckBoxMenuItem.
JMenuItem getState(), . ,
isSelected().
:
JCheckBoxMenuItem cbm1 = new JCheckBoxMenuItem("");
JCheckBoxMenuItem cbm2 = new JCheckBoxMenuItem("");
JCheckBoxMenuItem cbm3 = new JCheckBoxMenuItem("");
view.add(cbm1); view.add(cbm2); view.add(cbm3);
view.addSeparator();
cbm1.addItemListener(new ItemListener(){
public void itemStateChanged(ItemEvent e){
if (e.getStateChange() == ItemEvent.SELECTED)
ch.setText(txt);
else ch.setText("");
}
});
JRadioButtonMenuItem
JRadioButtonMenuItem. JMenuItem
, .
:
JRadioButtonMenuItem rbm1 =
new JRadioButtonMenuItem("");
JRadioButtonMenuItem rbm2 =
new JRadioButtonMenuItem("");
JRadioButtonMenuItem rbm3 =
new JRadioButtonMenuItem("");
view.add(rbm1);view.add(rbm2); view.add(rbm3);
ButtonGroup bg = new ButtonGroup();
bg.add(rbm1); bg.add(rbm2); bg.add(rbm3);
JPopupMenu
(pop-up menu) .
MS Windows Java L&F .
326
III.
. , , ,
. , .
MouseEvent.
,
, MouseEvent
isPopupTrigger(). .
isPopupTrigger() true, ,
, show(Component, int, int).
, , .
, popup JPopupMenu:
public void processMouseEvent(MouseEvent e){
if (e.isPopupTrigger())
popup.show(e.getComponent(), e.getX(), e.getY());
else super.processMouseEvent(e);
}
, ,
processMouseEvent(),
, . . addMouseListener() enableEvents(AWTEvent.MOUSE_EVENT_MASK).
. JPopupMenu() JPopupMenu(String). , , ,
. setLabel(String). add(Action),
add(JMenuItem) add(String) . insert() remove()
.
, PopupMenuEvent.
JColorChooser
, , , . Swing
JColorChooser, RGB HSB.
.
,
showDialog(Component, String, Color). , . null , Frame, . ,
, null . :
Color c = JColorChooser.showDialog(null, "", null);
11. Swing
327
, ,
, OK, Cancel Reset. showDialog()
OK null, Cancel. , .
Reset.
Reset , .
createDialog(Component, String, boolean, JColorChooser, ActionListener,
ActionListener). , , . JColorChooser,
.
OK Cancel .
getColor(). :
JDialog d = JColorChooser.createDialog(
new JFrame(), " ", false,
cc = new JColorChooser(),
new OkColor(), new CancelColor());
d.setVisible(true);
class OkColor implements ActionListener{
public void actionPerformed(ActionEvent e){
comp.setColor(cc.getColor());
}
}
class CancelColor implements ActionListener{
public void actionPerformed(ActionEvent e){
comp.setColor(defColor);
}
}
,
, JColorChooser(Color), ,
JColorChooser(), .
.
JColorChooser PropertyChangeEvent
Java Bean, ,
JComponent
addPropertyChangeListener(PropertyChangeListener);
, , javax.swing.colorchooser.
,
ColorSelectionModel. JColorChooser -
328
III.
DefaultColorSelectionModel.
getSelectionModel(). ChangeEvent.
ColorSelectionModel
JColorChooser(ColorSelectionModel).
JFileChooser
.
Swing JFileChooser,
.
. JFileChooser(File) JFileChooser(String) ,
. JFileChooser() . JFileChooser(null). FileSystemView,
.
( FILES_ONLY).
DIRECTORIES_ONLY
FILES_AND_DIRECTORIES.
setFileSelectionMode(int).
(hidden) . ,
setFileHidingEnabled(false).
.
setMultiSelectionEnabled(true).
FileFilter
. ,
. FileFilter javax.swing.filechooser ( FileFilter java.io)
addChoosableFileFilter(FileFilter).
, .
FileFilter .
accept(File) true, .
getDescription() , (Files of type) .
, java. . 11.5.
11. Swing
329
. 11.5.
showOpenDialog(Component),
showSaveDialog(Component)
showDialog(Component, String). (Open) (Save as).
, . Frame,
null.
, :
JFileChooser fch = new JFileChooser();
fch.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
fch.setFileHidingEnabled(false);
330
III.
fch.setMultiSelectionEnabled(true);
fch.addChoosableFileFilter(new JavaFileFilter());
fch.addChoosableFileFilter(new AnotherFileFilter());
switch (fch.showDialog(null, "")){
case JFileChooser.APPROVE_OPTION:
File selectedFile = fch.getSelectedFile();
File directory = fch.getCurrentDirectory();
break;
case JFileChooser.CANCEL_OPTION:
break;
case JFileChooser.ERROR_OPTION:
System.err.println("Error"); break;
}
, showXxxDialog()
,
(Open) (Save) APPROVE_OPTION,
(Cancel) CANCEL_OPTION ERROR_OPTION.
,
getSelectedFile() File, . , FILES_AND_DIRECTORIES,
null. DIRECTORIES_ONLY, . ,
File[] getSelectedFiles(). ,
, File
getCurrentDirectory(), .
, :
JFileChooser fch = new JFileChooser();
int state = fch.showOpenDialog(null);
File f = fch.getSelectedFile();
if (f != null && state == JFileChooser.APPROVE_OPTION)
JOptionPane.showMessageDialog(null, f.getPath());
else if (state == JFileChooser.CANCEL_OPTION)
JOptionPane.showMessageDialog(null, "Canceled");
, ,
.
, setAccessory(JComponent).
, , -
11. Swing
331
. , , , :
class ImagePreviewer extends Jlabel implements PropertyChangeListener{
public ImagePreviewer(JFileChooser fch){
if (fch == null)
throw new IllegalArgumentException("fileChooser must be non-null");
fch.addPropertyChangeListener(this);
}
public void loadImageFromFile(File f){
Icon icon = null;
if (f != null){
ImageIcon im = new ImageIcon(f.getPath());
Dimension size = getSize();
if (im.getIconWidth() != size.width)
icon = new ImageIcon(im.getImage().getScaledInstance(
size.width, size.height, Image.SCALE_DEFAULT));
else icon = im;
}
setIcon(icon);
}
public void propertyChange(PropertyChangeEvent e){
String prop = e.getPropertyName();
if (prop.equals(JFileChooser.SELECTED_FILE_CHANGED_PROPERTY)){
File f = (File)e.getNewValue();
if (isShowing()){
loadImageFromFile(f);
repaint();
}
}
}
}
JFileChooser, , :
JFileChooser fch = new JFileChooser();
ImagePreviewer ip = new ImagePreviewer(fch);
ip.setPreferredSize(new Dimension(200, 200));
fch.setAccessory(ip);
. 11.5.
.
- . FileView, , -
332
III.
setFileView(FileView). ,
Java :
class JavaFileView extends FileView{
public String getName(File f){
return null;
//
}
public String getDescription(File f){
String ext = getExtension(f);
if (ext != null && ext.equals("java"))
return " Java";
else return null;
}
public String getTypeDescription(File f){
return getDescription(f);
}
Icon icon = new ImageIcon("javacup.gif");
public Icon getIcon(File f){
String ext = getExtension(f);
if (ext != null && ext.equals("java"))
return icon;
return null;
}
public Boolean isTraversable(File f){
return null;
//
}
protected String getExtension(File f){
if (f != null){
String name = f.getName();
int i = name.lastIndexOf('.');
if (i > 0 && i < name.length() 1)
return name.substring(i + 1).toLowerCase();
}
return null;
}
}
fch JFileChooser
fch.setFileView(new JavaFileView());
11. Swing
333
, Swing, .
setControlButtonsAreShown(boolean).
Swing
, Swing , 5. , . 11.6. (properties), , , - .
swing_ru.jar, , , http://lib.juga.ru/article/articleprint/125/-1/53/. swing_ru.jar, , $JAVA_HOME/lib/ext/, -, . 11.6.
. 11.6.
1. Swing AWT?
2. Swing?
3. ?
4. ?
5. Swing ?
6. Swing ?
7. Swing ?
8. Swing ?
12
. , .
, , . Swing ,
javax.swing.text, javax.swing.text.html,
javax.swing.text.html.parser javax.swing.text.rtf.
JTextComponent JComponent. , . : JTextField, JTextArea ,
JEditorPane, JTextPane, - .
JTextField JPasswordField, ,
,
JFormattedTextField, Date, , .
.
JTextComponent
JTextComponent
.
"Model-View-Controller",
JTextComponent. .
.
MVC Document
. , "", ,
12.
335
Segment
Segment , .
Segment ,
current(). getIndex(), setIndex(int). Segment previous() next(), , first() last(),
. :
!
, Segment
(public) array char[], offset, count . ,
,
Segment . getBeginIndex() array, . . offset, getEndIndex() , .
Segment, , getText(int, int, Segment) Segment setPartialReturn(boolean).
true, getText() Segment , , . false. ,
Segment :
336
III.
, .
void insertString(int offset, String text, AttributeSet attr);
text offset, .
insertString(), , : , , . ,
null.
" " , AttributeSet. ,
.
MutableAttributeSet. Swing
SimpleAttributeSet. " ",
StyleConstants
, : CharacterConstants, ColorConstants,
FontConstants ParagraphConstants.
, AttributeSet, , "" . ,
ResolveAttribute. ,
. - " "
getAttribute(Object), , getResolveParent(), .
MutableAttributeSet Style. getName(),
(style),
ChangeEvent
void addChangeListener(ChangeListener chl);
,
.
StyleContext.
:
StyleContext stc = StyleContext.getDefaultStyleContext();
stc
addAttribute(), removeAttribute(), .
12.
337
remove(int offset, int length);
length , , offset.
insertString()
, , . , Document, insertString() remove(). , .
remove()
DocumentFilter, .
:
DocumentFilter
FilterBypass, .
DocumentFilter, ,
void setDocumentFilter(DocumentFilter filter);
, , , . Element.
- , getStartOffset(), getEndOffset(). , getParentElement(). ,
,
. ,
. getElement(int).
getElementCount(),
getElementIndex(int). ,
getName().
338
III.
addAttribute(Object name, Object value) addAttributes(AttributeSet).
. getRootElements(),
Element[]. getDefaultRootElement(),
, Element.
, , getElement(int) Element
children(), .
,
DocumentEvent. getDocument(), ,
, getOffset() getLength(),
. ElementChange
getElement(), , , , .
DocumentEvent DefaultDocumentEvent,
AbstractDocument, undo(), , redo(), ,
.
(undo/redo),
UndoableEditEvent.
Document AbstractDocument.
. -"" -"".
readLock() writeLock().
readUnlock() writeUnlock().
12.
339
AbstractDocument ,
PlainDocument DefaultStyledDocument.
PlainDocument "" ,
JTextField, JPasswordField, JTextArea.
: . getDefaultRootElement(). getParagraphElement(int
offset) Element, offset. , , . .
DefaultStyledDocument, JTextPane. , .
, DefaultStyledDocument HTMLDocument. HTML. (style sheets).
, setDocument(Document) JTextComponent.
MVC ,
, , .
View. , .
, getElement(). , , getDocument(). , getParent() setParent(), . getViewCount(),
getView(int).
create(Element), ViewFactory. , , getViewFactory().
.
, , ,
.
Shape modelToView(int startPos, Position.Bias b0,
int endPos, Position.Bias b1, Shape fig);
340
III.
, :
Position.Bias.Backward Position.Bias.Forward, fig.
int viewToModel(float x, float y, Shape fig, Position.Bias[] b);
, (x, y) fig.
, b,
.
Graphics.
paint(Graphics) . paint(Graphics), , getGraphics().
setSize(float width, float height),
, .
View Component. ,
, Component ,
, View -, . . 12.1.
. 12.1. -
. 12.1, .
HTML, ImageView
<IMG>, FormView <FORM> <INPUT>, <SELECT>, <TEXTAREA>,
ObjectView <OBJECT>.
PlainView
JTextArea, FieldView
JTextField, PasswordView JPasswordView.
BoxView .
,
.
12.
341
MVC
. EditorKit,
, , ,
void read(InputStream in, Document doc, int pos);
void read(Reader in, Document doc, int pos);
void write(OutputStream out, Document doc, int pos, int length);
void write(Writer out, Document doc, int pos, int length);
Document createDefaultDocument();
""
ViewFactory getViewFactory();
,
Caret createCaret();
Caret DefaultCaret , .
(dot). (mark). , . moveDot(int)
.
setDot(int) .
. setSelectionVisible(boolean),
isSelectionVisible().
getDot() getMark(), MVC.
Point getMagicCaretPosition();
void setMagicCaretPosition(Point);
null.
paint(Graphics). DefaultCaret
Rectangle, ,
.
342
III.
setBlinkRate(int), .
setVisible(true),
isVisible().
ChangeEvent,
. ,
, paint(Graphics) .
, Swing .
, DocumentFilter , NavigationFilter
, , -
.
, NavigationFilter,
:
void setDot(NavigationFilter.FilterBypass fb, int dot, Position.Bias bias) -
dot ;
void moveDot(NavigationFilter.FilterBypass fb, int dot, Position.Bias bias) -
dot, ;
int getNextVisualPositionFrom(JTextComponent tc, int pos, Position.Bias bias, int
direction, Position.Bias[] biasRet)
pos direction. View .
NavigationFilter, ,
setNavigationFilter(NavigationFilter) JTextComponent.
,
.
class CursorFilter extends NavigationFilter{
public void setDot(NavigationFilter.FilterBypass fb,
int dot, Position.Bias bias){
super.setDot(fb, (dot < 30)? dot:30, bias);
}
public void moveDot(NavigationFilter.FilterBypass fb,
int dot, Position.Bias bias){
super.moveDot(fb, (dot < 30)? dot:30, bias);
}
}
, :
JTextArea ta = new JTextArea(5, 60);
ta.setNavigationFilter(new CursorFilter());
12.
343
EditorKit DefaultEditorKit
, . JTextComponent.
DefaultEditorKit StyledEditorKit. , : , , ,
. JTextPane.
StyledEditorKit : HTMLEditorKit RTFEditorKit, HTML RTF.
, HTMLEditorKit : javax.swing.text.html
javax.swing.text.html.parser. HTML, DTD
CSS, (parser) HTML.
, MVC JTextComponent . . , . insertString(), -
. .
Swing, JTextComponent
MVC.
, .
, JtextComponent, .
KeyStroke. -
<Shift>, <Alt>, <Ctrl> <Meta>.
KeyStroke ""
:
KeyStroke getKeyStroke(char keyChar) keyChar, -
;
KeyStroke getKeyStroke(int keyCode, int modifiers) keyCode
Character;
KeyStroke getKeyStroke(int keyCode, int modifiers, boolean onRelease)
, (false) (true);
344
III.
KeyStroke
, Keymap. , Action,
" " "KeyStroke Action". Action
14.
.
" "
void addActionForKeyStroke(KeyStroke key, Action a);
Action[]
getBoundActions(), KeyStroke[] getBoundKeyStrokes(). Action getAction(KeyStroke).
Keymap ,
setResolveParent(Keymap). "
"
, .
print() JTextComponent
, . false,
, Cancel , true .
print() .
print(MessageFormat header, MessageFormat footer)
header footer ,
MessageFormat java.text.
, ,
.
JTextField
,
.
12.
345
:
JTextField(int columns) ,
columns . ,
;
JTextField(String text) text;
JTextField(String text, int columns) text -
columns ;
JTextField(Document doc, String text, int columns) doc.
setDocument(Document).
, setFont(Font).
, JTextComponent, setText(String), getText(),
getText(int offset, int length)
getSelectedText().
content
replaceSelection(String content).
.
setHorizontalAlignment(int), : LEFT, CENTER, RIGHT, LEADING,
TRAILING JTextField.
, setEditable(false).
setCaret(Caret).
setCaretColor(Color). getCaretPosition(),
setCaretPosition(int). , , moveCaretPosition(int).
getSelectionStart() getSelectionEnd(),
setSelectionStart(int) setSelectionEnd(int).
setSelectedTextColor(Color),
setSelectionColor(Color).
(clipboard) cut(), copy(),
, paste(),
.
,
, .
getDocument().
12.1 .
12.1.
import java.awt.*;
import javax.swing.*;
import javax.swing.text.*;
III.
346
12.
347
JPasswordField
JPasswordField JTextField, , . ,
, .
setEchoChar(char).
, getText()
getPassword(),
char[], .
JFormattedTextField
JTextField JFormattedTextField
, , Date, Number. , JFormattedTextField(Object) setValue(Object) , .
:
JFormattedTextField ftf = new JFormattedTextField(new Date());
ftf.addActionListener(this);
// . . . . . . . .
// ... <Enter>
// . . . . . . . .
public void actionPerformed(ActionEvent e){
newDate = (Date)ftf.getValue();
}
getValue() Object,
.
JFormattedTextField AbstractFormatter.
valueToString(Object) stringToValue(String). . "" install(JFormattedTextField) AbstractFormatter
JFormattedTextField(JFormattedTextField.AbstractFormatter);
setFormatter(AbstractFormatter) JFormattedTextField.
, AbstractFormatter
DocumentFilter NavigationFilter,
getDocumentFilter() getNavigationFilter().
, .
Swing AbstractFormatter
DefaultFormatter. valueToString(Object)
III.
348
DefaultFormatter : toString()
. stringToValue(String) String. , .
DefaultFormatter , . Swing.
DefaultFormatter . MaskFormatter
, Format
java.text. ,
MaskFormatter mf = new MaskFormatter("###.##");
.
InternationalFormatter Format ,
InternationalFormatter(Format);
: NumberFormatter DecimalFormat
, DateFormatter DateFormat .
-,
AbstractFormatterFactory, DefaultFormatterFactory.
getXxxFormatter(), -.
JFormattedTextField
JTextArea
JTextArea "" , .
JTextEditor JTextPane.
JTextArea .
, JScrollPane:
JTextArea ta = new JTextArea(5, 50);
JScrollPane sp = new JScrollPane(ta);
container.add(sp);
, JScrollPane.
, , .
setWrapStyleWord(true).
, ,
. JScrollPane,
.
, setLineWrap(true).
12.
349
setText(String),
append(String) insert(String, int).
setTabSize(int).
JTextField.
JEditorPane
JEditorPane MIME- : text/plain, text/html text/rtf, DefaultEditorKit,
HTMLEditorKit RTFEditorKit . MIME- ,
JEditorPane(String type, String text);
setContentType(type), MIME- ,
setText(text). :
JEditorPane ep= new JEditorPane("text/html;Content-Type=windows-1251",
"<html> HTML");
JScrollPane sp = new JScrollPane(ep);
container.add(sp);
setText(String) . MIME- . ,
setEditor(EditorKit). ,
!
MIME-
setEditorKitForContentType(String type, EditorKit editor);
, .
,
URL. URL :
JEditorPane(URL url);
JEditorPane(String url);
URL
setPage(URL) setPage(String url). , MIME- . HTML, HTMLDocument HTMLEditorKit.
read(InputStream in, Object obj). HTMLEditorKit obj
HTMLDocument, HTML .
"" .
, HTML- <IMG>.
JTextPane.
350
III.
JTextPane
JTextPane JEditorPane
.
,
DefaultStyledDocument .
addStyle(String name, Style parent);
, ,
setCharacterAttributes(AttributeSet attr, boolean replace);
, ,
setParagraphAttributes(AttributeSet attr, boolean replace);
true, .
setStyledDocument(StyledDocument);
insertIcon(Icon). ,
.
,
insertComponent(Component). .
1. MVC ?
2. Swing AWT?
3. Swing ?
4. Swing ?
5. Swing?
6. Swing Swing?
7. Swing ?
13
. ,
.
.
.
, , , .
Swing JTable,
JTableHeader, TableColumn ,
javax.swing.table. , , , , . .
JTable
JTable . . -. JTable
DefaultTableModel , JTableHeader , TableCellEditor ,
TableCellRenderer , TableColumn .
.
"Model-View-Controller". : ,
TableModel, ,
TableColumnModel, ,
ListSelectionModel ( 11).
.
JTable()
352
III.
data. colNames .
data ,
colNames. 13.1.
JTable(Vector data, Vector colNames) ,
. 13.3.
, ,
JScrollPane. , A, B, C . ., .
.
JTable(TableModel) -
. .
JTable(TableModel, TableColumnModel) -
.
JTable(TableModel, TableColumnModel, ListSelectionModel)
.
13.1
, .
13.1.
import java.awt.*;
import javax.swing.*;
public class SimpTable extends JFrame{
SimpTable(){
super(" My Table");
setLayout(new FlowLayout());
String[][] data = {{"-27", "32"}, {"-45", "55"}};
String[] colNames = {"", ""};
JTable t1 = new JTable(data, colNames);
add(new JScrollPane(t1));
setSize(400, 400);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
13.
353
setValueAt(Object data, int row, int column);
JTable . , TableModel TableColumnModel,
, ListSelectionModel JList.
11.
TableModel, AbstractTableModel DefaultTableModel.
,
.
, .
ind getColumnClass(int ind). getRowCount(),
getColumnCount(). ,
getColumnName(int), String.
Object getValueAt(int rowInd, int colInd), ,
, setValueAt(Object data, int rowInd, int colInd).
, ,
isCellEditable(int rowInd, int colInd).
, AbstractTableModel.
:
int getRowCount();
int getColumnCount();
Object getValueAt(int, int);
354
III.
.
, ,
isEditable() AbstractTableModel false, setValueAt() .
, .
13.2 AbstractTableModel
, .
13.2.
import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;
public class SimpTable extends JFrame{
SimpTable(){
super(" ");
setLayout(new FlowLayout());
JTable t1 = new JTable(new FirstColumnTableModel());
add(new JScrollPane(t1));
setSize(400, 400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args){
new SimpTable();
}
}
class FirstColumnTableModel extends AbstractTableModel{
protected Object[][] data = {
{"", Color.black, new Boolean(true)},
{"", new Color(130, 56, 187), new Boolean(true)},
{"", new Color(200, 45, 125), new Boolean(false)},
};
protected String[] colNames = {"", "", ""};
public FirstColumnTableModel(){ super(); }
//
public int getRowCount(){ return data.length; }
public int getColumnCount(){ return data[0].length; }
public Object getValueAt(int row, int col){ return data[row][col]; }
//
public void setValueAt(Object value, int row, int col){
if (col != 0) data[row][col] = value;
}
13.
355
// ,
public boolean isCellEditable(int row, int col){
return col != 0;
}
//
//
public Class getColumnClass(int col){
return data[0][col].getClass();
}
//
public String getColumnName(int col){
return colNames[col];
}
}
. 13.1.
DefaultTableModel TableModel . .
Vector, - . (protected) dataVector.
DefaultTableModel()
.
DefaultTableModel(int rowCount, int colCount) . null.
III.
356
DefaultTableModel(Vector colNames, int rowCount);
DefaultTableModel(Object[] colNames, int rowNames);
.
DefaultTableModel, ,
addRow() addColumn(),
insertRow(). Object
Vector.
setValueAt(Object value, int row, int column);
getXxx() .
moveRow(int start, int end, int to);
javax.swing.*;
javax.swing.table.*;
java.io.*;
java.util.*;
13.
357
new FileTable(dir);
}
}
class FileTableModel extends DefaultTableModel{
protected File dir;
protected String[] fName;
protected String[] colName = new String[]{
"", "", " ",
"", " ", " "
};
protected Class[] colClass = new Class[]{
String.class, Long.class, Date.class,
Boolean.class, Boolean.class, Boolean.class
};
public FileTableModel(File dir){
super(dir.list().length, 6);
this.dir = dir;
fName = dir.list();
}
public String getColumnName(int col){ return colName[col]; }
public Class getColumnClass(int col){ return colClass[col]; }
public Object getValueAt(int row, int col){
File f = new File(dir, fName[row]);
switch(col){
case 0: return fName[row];
case 1: return new Long(f.length());
case 2: return new Date(f.lastModified());
case 3: return f.isDirectory() ?
Boolean.TRUE : Boolean.FALSE;
case 4: return f.canRead() ?
Boolean.TRUE : Boolean.FALSE;
case 5: return f.canWrite() ?
Boolean.TRUE : Boolean.FALSE;
default: return null;
}
}
}
TableModelEvent. : INSERT, DELETE UPDATE
getType(). ,
, , . getFirstRow(), getLastRow() getColumn().
ALL_COLUMNS, , . -
III.
358
addTableModelListener(TableModelEvent).
TableColumn
TableColumn : , , , ,
, TableCellEditor
TableCellRenderer.
getXxx()/setXxx().
setMinWidth(int), setMaxWidth(int)
setPreferredWidth(int), ,
, .
TableColumnModel,
DefaultTableColumnModel.
TableColumn. , . ListSelectionModel,
.
. moveColumn(int oldInd, int
newInd), .
, , TableColumnModelEvent,
addColumnModelListener(ColumnModelListener);
JTableHeader
.
.
,
JScrollPane, . -
13.
359
A, B, C . .,
DefaultTableModel.
JTableHeader javax.swing.table.
TableColumnModel.
JTableHeader(). , JTableHeader(TableColumnModel),
.
setTable(JTable).
getTableHeader() JTable.
, . , 13.4 "",
"" BorderLayout.
, "" . BorderLayout .
13.4.
import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;
public class HeadTable extends JFrame{
HeadTable(){
super(" ");
Vector data = new Vector();
Vector row = new Vector();
row.addElement("");
row.addElement(new Integer(1970));
row.addElement(new Boolean(false));
data.addElement(r);
row = new Vector();
row.addElement("");
row.addElement(new Integer(1980));
row.addElement(new Boolean(true));
data.addElement(r);
Vector col = new Vector();
col.addElement("");
col.addElement(" ");
col.addElement(" ");
JTable t2 = new JTable(data, col);
JTableHeader th = t2.getTableHeader();
add(th, BorderLayout.NORTH);
add(t2, BorderLayout.CENTER);
360
III.
setSize(400, 400);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args){
new HeadTable();
}
}
. 13.2.
. .
setAutoResizeMode(int) JTable. :
AUTO_RESIZE_OFF ;
AUTO_RESIZE_NEXT_COLUMN ;
AUTO_RESIZE_SUBSEQUENT_COLUMNS
( );
AUTO_RESIZE_LAST_COLUMN ;
AUTO_RESIZE_ALL_COLUMNS .
ListSelectionModel.
JTable DefaultListSelectionModel
. 11 JList.
: SINGLE_SELECTION, SINGLE_INTERVAL_SELECTION,
MULTIPLE_INTERVAL_SELECTION.
setSelectionMode(int) JTable, .
. setSelectionModel(ListSelectionModel) JTable.
13.
361
, TableColumnModel, . :
table.getColumnModel().setSelectionModel(new SomeSelectionModel());
setSelectionForeground(Color) setSelectionBackground(Color).
,
getSelectionModel() JTable.
JTable, TableCellRenderer.
TableCellRenderer :
Component getTableCellRendererComponent(
JTable table, Object value,
boolean isSelected, boolean hasFocus,
int row, int col);
, (row, col)
. value , , isSelected,
hasFocus, , table .
, value, .
, , . . this. paint(). - , paint().
JList, 11.
Swing
TableCellRenderer
JLabel. DefaultTableCellRenderer
JLabel, Icon. setText(String) JLabel :
DefaultTableCellRenderer,
, , , , toString() .
, , , setValue(Object)
DefaultTableCellRenderer. , 13.2 Color
, . 13.1. ,
DefaultTableCellRenderer, setValue():
class ColorRenderer extends DefaultTableCellRenderer{
public void setValue(Object value){
III.
362
setBackground((Color)value);
}
}
Color,
setDefaultRenderer(Class, TableCellRenderer) JTable.
13.2 SimpTable
t1.setDefaultRenderer(Color.class, new ColorRenderer());
,
- . ,
, , :
class IconRenderer extends DefaultTableCellRenderer{
public void setValue(Object value){ setIcon((Icon)value); }
}
t1.setDefaultRenderer(Icon.class, new IconRenderer());
JLabel,
DefaultTableCellRenderer, .
TableCellRenderer. 13.5
, , JTextArea, 12.
13.5.
import
import
import
import
import
java.awt.*;
javax.swing.*;
javax.swing.table.*;
javax.swing.border.*;
java.util.*;
13.
{"\n","\n","\n"}
},
new Object[]{"","1","2"}
);
//
JTable t = new JTable(tm);
// ,
//
t.setRowHeight( t.getRowHeight() * lineCount);
// -
t.setDefaultRenderer(String.class, new MultiLineCellRenderer());
add(new JScrollPane(t));
setSize(400, 400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args){
new MultiLineTable(2);
}
}
// -
class MultiLineCellRenderer extends JTextArea
implements TableCellRenderer{
public MultiLineCellRenderer(){
setLineWrap(true);
setWrapStyleWord(true);
setOpaque(true);
}
public Component getTableCellRendererComponent(
JTable table, Object value,
boolean isSelected, boolean hasFocus,
int row, int col){
if (isSelected){
setForeground(table.getSelectionForeground());
setBackground(table.getSelectionBackground());
}else{
setForeground(table.getForeground());
setBackground(table.getBackground());
}
if (hasFocus){
setBorder(UIManager.getBorder("Table.focusCellHighlightBorder"));
if (table.isCellEditable(row, col)){
setForeground(UIManager.getColor("Table.focusCellForeground"));
363
364
III.
setBackground( UIManager.getColor("Table.focusCellBackground"));
}
}else setBorder(new EmptyBorder(1, 2, 1, 2));
setFont(table.getFont());
setText((value == null) ? "" : value.toString());
return this;
}
}
.
13.5,
getTableCellRendererComponent() :
public Component getTableCellRendererComponent(
JTable table, Object value,
boolean isSelected, boolean hasFocus,
int row, int col){
if (table != null){
JTableHeader header = table.getTableHeader();
if (header != null){
setForeground(header.getForeground());
setBackground(header.getBackground());
setFont(header.getFont());
}
}
setText((value == null) ? "" : value.toString());
setBorder(UIManager.getBorder("TableHeader.cellBorder"));
return this;
}
( MultiLineHeader)
, :
MultiLineHeader mlh = new MultiLineHeader();
Enumeration e = t.getColumnModel().getColumns();
while (e.hasMoreElements())
((TableColumn)e.nextElement()).setHeaderRenderer(mlh);
. , .
-. , TableCellEditor.
TableCellEditor CellEditor
public Component getTableCellEditorComponent(JTable table,
Object value, boolean isSelected, int row, int column);
13.
365
.
, , JTextField,
(row, column) value. table, . isSelected, , .
CellEditor , . stopCellEditing() true,
. false, . . cancelCellEditing() .
ChangeEvent,
,
addCellEditorListener(CellEditorListener).
TableCellEditor DefaultCellEditor.
JCheckBox, JComboBox
JTextField.
JTextField.
,
, toString() .
JCheckBox boolean, . 13.1. .
JomboBox ,
.
13.6 , .
JComboBox.
. 13.3.
13.6.
import
import
import
import
import
import
java.util.*;
java.awt.*;
java.awt.event.*;
javax.swing.*;
javax.swing.table.*;
javax.swing.event.*;
366
III.
{"", ""},
{"", ""}},
new Object[]{"", ""});
JTable table = new JTable(dm);
JComboBox cb = new JComboBox();
cb.addItem("");
cb.addItem("");
RowEditor rowEd = new RowEditor(table);
rowEd.setEditorAt(2, new DefaultCellEditor(cb));
table.getColumn("").setCellEditor(rowEd);
add(new JScrollPane(table));
setSize(400, 100);
setVisible(true);
}
public static void main(String[] args){
new RowEd();
}
}
class RowEditor implements TableCellEditor{
protected Hashtable editors;
protected TableCellEditor editor, defEditor;
JTable table;
public RowEditor(JTable table){
this.table = table;
editors = new Hashtable();
defEditor = new DefaultCellEditor(new JTextField());
}
public void setEditorAt(int row, TableCellEditor editor){
editors.put(new Integer(row), editor);
}
public Component getTableCellEditorComponent(JTable table,
Object value, boolean isSelected, int row, int column){
return editor.getTableCellEditorComponent(table,
value, isSelected, row, column);
}
public Object getCellEditorValue(){
return editor.getCellEditorValue();
}
public boolean stopCellEditing(){
return editor.stopCellEditing();
}
13.
367
. 13.3. JComboBox
, , , MS Excel, - ,
. .
JTable.
setAutoCreateRowSorter(true):
JTable table = new JTable();
table.setAutoCreateRowSorter(true);
368
III.
!
, .
RowSorter<M>.
, , MVC
(. 3), .
View, Model .
RowSorter<M> DefaultRowSorter<M, I>,
, .
TableRowSorter<M extends
TableModel>. View Model ,
:
FileTableModel model = new FileTableModel();
JTable table = new JTable(model);
table.setRowSorter(new TableRowSorter(model));
, , ,
, Comparator (. 6).
isSortable(int column) DefaultRowSorter.
,
setComparator(int column, Comparator comparator);
. , , toString().
, ,
. List, RowSorter.SortKey. . ,
, ASCENDING DESCENDING SortOrder.
.
:
List<RowSorter.SortKey> keys = new ArrayList<RowSorter.SortKey>();
keys.add(new RowSorter.SortKey(1, SortOrder.ASCENDING));
keys.add(new RowSorter.SortKey(0, SortOrder.ASCENDING));
TableRowSorter sorter = new TableRowSorter(model));
sorter.setSortKeys(keys);
,
Model , , View.
int modelRowIndex = table.convertRowIndexToModel(viewRowIndex);
int viewRowIndex = table.convertRowIndexToView(modelRowIndex);
viewRowIndex View
modelRowIndex Model.
13.
369
, RowSorter Model - View. , RowFilter<M, I >, setRowFilter() DefaultRowSorter.
:
TableRowSorter sorter = new TableRowSorter(model));
RowFilter filter = RowFilter.regexFilter("java", 0);
sorter.setRowFilter(filter);
,
, "java".
RowFilter .
public static <M, I > RowFilter<M, I > regexFilter(String regex, int... indices);
regex, :
public static <M, I > RowFilter<M, I >
numberFilter(RowFilter.ComparisionType type, Number number, int... indices);
public static <M, I > RowFilter<M, I >
dateFilter(RowFilter.ComparisionType type, Date date, int... indices);
, notFilter(), ,
, . ,
andFilter(), , ,
filters. , orFilter(), , filters.
RowFilter.
public boolean include(RowFilter.Entry<? extends M, ? extends I > row);
370
III.
;
Object getValue(int index) index
;
int getValueCount() .
include(),
. ,
,
class SumRowFilter extends RowFilter{
private String text;
private int limit;
public SumRowFilter(String text, int limit){
this.text = text;
this.limit = limit;
}
public boolean include(Entry entry){
int sum = 0;
if (entry.getStringValue(0).equals(text)){
for (int i = 1; i < entry.getValueCount() 1; i++){
sum += ((Number)entry.getValue(i)).intValue();
}
if ( sum > limit) return true;
}
return false;
}
}
print() , .
false, ,
Cancel , true .
print(JTable.PrintMode mode) .
, -
13.
371
JTable.PrintMode.FIT_WIDTH.
print(JTable.PrintMode mode, MessageFormat header, MessageFormat footer)
header footer ,
MessageFormat java.text.
, ,
.
Java SE
$JAVA_HOME/demo/jfc/TableExample/.
1. MVC ?
2. JTable ?
3. ?
4. -?
5. ?
6. JTable, ?
7. JTable?
8. JTable?
14
Swing
"",
. setBounds().
, .
. ,
, , .
,
, , :
int w = getSize().width;
int h = getSize().height;
Button b = new Button("OK");
b.setBounds(9*w/20, 4*h/5, w/10, h/10);
//
// .
// .
.
, AWT : LayoutManager LayoutManager2,
: BorlerLayout, CardLayout, FlowLayout,
GridLayout GridBagLayout. (layout
manager) .
. Swing , Swing.
,
LayoutManager LayoutManager2.
, .
FlowLayout
FlowLayout. ,
. "" ,
14. Swing
373
. 14.1. ,
add().
,
align FlowLayout.LEFT, ,
FlowLayout.RIGHT, , FlowLayout.CENTER.
(gap) hgap vgap. :
FlowLayout(int align, int hgap, int vgap);
5 :
FlowLayout(int align);
5 :
FlowLayout();
:
setHgap(int hgap);
setVgap(int vgap);
setAlignment(int align);
374
III.
. 14.1. FlowLayout
BorderLayout
BorderLayout , , . 14.2. NORTH, SOUTH, WEST, EAST CENTER.
add() BorderLayout : comp region,
: add(Component comp, String region).
add(Component comp)
CENTER.
, ,
getLayoutComponent(Object region);
.
:
BorderLayout() ;
BorderLayout(int hgap int vgap) hgap
vgap , .
, , . 14.3.
CENTER, .
14.2 , . setLayout()
BorderLayout JFrame . . 14.2.
14.2. BorderLayout
import java.awt.*;
import javax.swing.*;
14. Swing
375
. 14.2. BorderLayout
. 14.3. FlowLayout
BorderLayout
BorderLayout :
, , .
, , , , 14.3 . 14.3. , Panel JPanel
FlowLayout.
14.3.
import java.awt.*;
import javax.swing.*;
class BorderPanelTest extends JFrame{
BorderPanelTest(String s){
super(s);
// p2
JPanel p2 = new JPanel();
376
III.
p2.add(new JButton(""));
p2.add(new JButton(""));
p2.add(new JButton(""));
JPanel p1 = new JPanel();
p1.setLayout(new BorderLayout());
// p2 "" p1
p1.add(p2, BorderLayout.SOUTH);
// ""
p1.add(new JTextField(" ", 20), BorderLayout.NORTH);
//
JScrollPane sp = new JscrollPane(
new JTextArea(" ", 5, 20));
// p1
p1.add(sp), BorderLayout.CENTER);
// p1 ""
add(p1, BorderLayout.CENTER);
setSize(300, 200);
setVisible(true);
}
public static void main(String[] args){
JFrame f= new BorderPanelTest(" ");
f.setDefaultCloseOperation(EXIT_ON_CLOSE);
}
}
GridLayout
GridLayout
rows columns:
GridLayout(int rows, int columns);
.
.
hgap vgap:
GridLayout(int rows, int columns, int hgap, int vgap);
GridLayout() 0 0
. .
GridLayout
, add().
,
.
14.4 , . 14.4 ,
.
14. Swing
377
14.4. GridLayout
import java.awt.*;
import javax.swing.*;
import java.util.*;
class GridTest extends JFrame{
GridTest(String s){
super(s);
setLayout(new GridLayout(4, 4, 5, 5));
StringTokenizer st = new StringTokenizer("7 8 9 / 4 5 6 * 1 2 3 0 . = +");
while(st.hasMoreTokens())
add(new JButton(st.nextToken()));
setSize(200, 200);
setVisible(true);
}
public static void main(String[] args){
JFrame f= new GridTest(" GridLayout");
f.setDefaultCloseOperation(EXIT_ON_CLOSE);
}
}
. 14.4. GridLayout
CardLayout
CardLayout
, (first), . . , add().
next(Container c), previous(Container c),
last(Container c), first(Container c).
, , this.
:
CardLayout() ;
CardLayout(int hgap, int vgap) hgap vgap
378
III.
CardLayout .
add() CardLayout :
add(Component comp, Object constraints);
constraints String .
name
show(Container parent, String name);
14.5 cl p, ""
JFrame. p parent next() show().
"" JFrame p2
ch. 14.5 .
14.5. CardLayout
import java.awt.*;
import javax.swing.*;
class CardTest extends JFrame{
CardTest(String s){
super(s);
JPanel p = new JPanel();
CardLayout cl = new CardLayout();
p.setLayout(cl);
p.add(new JButton(" "),"page1");
p.add(new JButton("English page"),
"page2");
p.add(new JButton("Deutsche Seite"), "page3");
add(p);
cl.next(p);
cl.show(p, "page1");
JPanel p2 = new JPanel();
p2.add(new JLabel(" :"));
JComboBox ch = new JComboBox();
ch.addItem("");
ch.addItem("");
ch.addItem("");
p2.add(ch);
add(p2, BorderLayout.NORTH);
setSize(400, 300);
setVisible(true);
}
public static void main(String[] args){
JFrame f= new CardTest(" CardLayout");
f.setDefaultCloseOperation(EXIT_ON_CLOSE);
}
}
14. Swing
379
. 14.5. CardLayout
GridBagLayout
GridBagLayout ,
.
GridBagLayout , ,
. GridBagLayout, , . . ,
. , GridBagConstraints.
. ,
, , .
GridBagConstraints , , ,
. . 14.1.
, . ,
.
14.1. GridBagConstraints
anchor
. :
CENTER, NORTH, EAST, NORTHEAST, SOUTHEAST, SOUTH, SOUTHWEST, WEST, NORTHWEST; PAGE_START, PAGE_END, LINE_START, LINE_END, FIRST_LINE_START,
FIRST_LINE_END, LAST_LINE_START, LAST_LINE_END,
BASELINE, BASELINE_LEADING, BASELINE_TRAILING, ABOVE_BASELINE,
ABOVE_BASELINE_LEADING, ABOVE_BASELINE_TRAILING, BELOW_BASELINE,
BELOW_BASELINE_LEADING, BELOW_BASELINE_TRAILING; CENTER
fill
. : NONE, HORIZONTAL,
VERTICAL, BOTH; NONE
gridheight
, . int, 1. REMAINDER , ,
RELATIVE
380
III.
14.1 ()
gridwidth
, . int, 1. REMAINDER , ,
RELATIVE
gridx
. 0. RELATIVE, :
gridy
. 0.
RELATIVE, :
insets
. Insets;
ipadx,
ipady
; 0, 0
weightx,
weighty
;
0, 0
, GridBagConstraints ,
, :
GridBagConstraints gbc = new GridBagConstraints();
gbc.weightx = 1.0;
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbc.gridheight = 2;
, GridBagLayout :
GridBagLayout gbl = new GridBagLayout(); // .
setLayout(gbl);
// .
//
GridBagConstraints c = new GridBagConstraints();
JButton b1 = new JButton();
// .
c.gridwidth = 2;
// .
add(b1, c);
// b1
// .
JButton b2 = new JButton();
// .
c.gridwidth = 1;
// .
add(b2, c);
// .
. .
GridBagLayout
.
14. Swing
381
Swing
JComponent Swing AWT
Container, Swing JComponent, . ,
. Swing , . . . , Swing ,
.
JPanel
JPanel .
Panel AWT.
JPanel() FlowLayout. , ,
add(), ,
getPreferredSize() .
, .
getPreferredSize() , . setPreferredSize(Dimension)
.
JPanel(LayoutManager) .
setLayout(LayoutManager),
Container.
JPanel (double buffering) . 20. ,
JPanel(false).
, , JPanel(LayoutManager, boolean), .
, Container :
add(Component comp) comp , -
;
add(Component comp, Object constraints) comp
, ,
;
constraints,
;
add(Component comp, Object constraints, int ind) .
382
III.
JScrollPane
JScrollPane ,
.
JTextArea, JTable, , , .
, , , Scrollable,
.
setViewportView(Component). , . :
JScrollPane(Component)
void setVerticalScrollBarPolicy(int);
void setHorizontalScrollBarPolicy(int);
JScrollPane:
VERTICAL_SCROLLBAR_ALWAYS;
VERTICAL_SCROLLBAR_AS_NEEDED;
VERTICAL_SCROLLBAR_NEVER,
:
HORIZONTAL_SCROLLBAR_ALWAYS;
HORIZONTAL_SCROLLBAR_AS_NEEDED;
HORIZONTAL_SCROLLBAR_NEVER.
, ScrollPaneConstants, JScrollPane.
.
: , setColumnHeaderView(Component), , setRowHeaderView(Component), ,
setCorner(String, Component), 14.6.
. 14.6, 14.6. ScrollPaneLayout.
. , , setLayout(LayoutManager),
ScrollPaneLayout.
14.6.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
14. Swing
public class ScrollComps extends JFrame{
ScrollComps(){
super(" ");
setLayout(new FlowLayout());
JScrollPane sp = new JScrollPane(new JTextArea(5,30));
sp.setPreferredSize(new Dimension(200, 200));
sp.setCorner(JScrollPane.LOWER_LEFT_CORNER, new JLabel(" LL"));
sp.setCorner(JScrollPane.LOWER_RIGHT_CORNER, new JLabel("LR"));
sp.setCorner(JScrollPane.UPPER_LEFT_CORNER, new JLabel(" UL"));
sp.setCorner(JScrollPane.UPPER_RIGHT_CORNER, new JLabel("UR"));
JLabel lh = new JLabel(" Header");
lh.setBorder(BorderFactory.createEtchedBorder());
sp.setColumnHeaderView(lh);
JLabel lr = new JLabel("Row");
lr.setBorder(BorderFactory.createEtchedBorder());
sp.setRowHeaderView(lr);
sp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
sp.setViewportBorder(BorderFactory.createEtchedBorder());
add(sp);
setSize(400, 400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args){
new ScrollComps();
}
}
. 14.6.
383
384
III.
, ,
JViewport. " " (viewport),
.
JViewport , ViewportLayout.
"" .
,
.
,
setWheelScrollingEnabled(false);
, ,
public boolean isWheelScrollingEnabled();
JSplitPane
JSplitPane , , ,
. , HORIZONTAL_SPLIT JSplitPane, VERTICAL_SPLIT. JSplitPane(int orientation). JSplitPane() .
JSplitPane . JSplitPane(int
orientation, boolean continuous).
.
JButton , UIManager.getString("SplitPane.leftButtonText")
UIManager.getString("SplitPane.rightButtonText"). "left button" "right
button", . 14.7.
, JSplitPane(int orientation, Component left, Component right),
orientation ,
() left, , () right.
. 14.7.
14. Swing
385
, ,
JScrollPane, , , .
, :
JSplitPane(int orientation, boolean continuous, Component left, Component right).
()
. getDividerLocation(), setDividerLocation(int). .
setDividerLocation(double),
() 0.0 1.0.
.
getLastDividerLocation(),
setLastDividerLocation(int).
setDividerSize(int), . Java L&F 8 .
,
, getMinimumSize(). getMinimumDividerLocation() getMaximumDividerLocation().
setOneTouchExpandable(true). . 14.7.
, .
setLeftComponent(Component), setRightComponent(Component),
setTopComponent(Component), setBottomComponent(Component),
.
JTabbedPane
JTabbedPane . ,
(tabs). .
JTabbedPane() . JTabbedPane(int pos) . pos JtabbedPane: TOP, BOTTOM, LEFT, RIGHT. ,
(TOP), , , ,
.
,
, , . 14.8. WRAP_TAB_LAYOUT, SCROLL_TAB_LAYOUT
JTabbedPane. , JTabbedPane(int pos, int tab),
.
386
III.
. 14.8.
, . JTabbedPane
:
Component add(Component)
, ;
void add(Component, Object) ,
. Icon;
Component add(Component, int) ;
void add(Component, Object, int) ;
void addTab(String, Icon, Component) / -
tip .
void insertTab(String title, Icon image, Component comp, String tip. int ind);
.
setXxx()
. , setBackgroundAt(Color), . 14.8 14.7. ,
.
14.7.
import java.awt.*;
import javax.swing.*;
public class Tabbed extends JFrame{
Tabbed(){
super(" ");
setLayout(new FlowLayout());
String[] day = {"", "", "",
"", "", "", ""};
14. Swing
387
Box
Box ,
.
JToolBar,
. Box(int), BoxLayout: X_AXIS
, Y_AXIS .
createVerticalBox().
.
createHorizontalBox()
BoxLayout
BoxLayout BoxLayout(Container, int). ,
. X_AXIS ,
Y_AXIS , LINE_AXIS PAGE_AXIS . :
JPanel p = new JPanel();
p.setLayout(new BoxLayout(p, BoxLayout.X_AXIS));
p.add(new JLabel(" : ", JLabel.RIGHT));
p.add(new JTextField(30));
388
III.
,
, .
. , ,
,
. , , getAlignmentX() getAlignmentY() .
0.0f (), 1.0f () .
-
, Box , ,
- .
(rigid area),
.
static Component Box.createRigidArea(Dimension);
,
.
"" (strut) . ,
static Component Box.createHorizontalStrut(int width);
. , .
,
static Component Box.createVerticalStrut(int height);
. .
" " (glue), "", ,
, . :
static Component Box.createGlue() "" ;
static Component Box.createHorizontalGlue() "" ;
static Component Box.createVerticalGlue() "" .
- , .
Filler, Box,
Box.Filler(Dimension min, Dimension pref, Dimension max);
,
void changeShape(Dimension min, Dimension pref, Dimension max);
14. Swing
389
, Box, , . ,
, Box .
Box , .
SpringLayout
Box, BoxLayout,
,
390
III.
Box .
-.
.
,
AWT Swing .
, (x, y), width height
.
setBounds(int x, int y, int width, int height);
setLocation(int x, int y);
setSize(int width, int height);
,
.
, :
JPanel p = new JPanel();
p.setLayout(null);
int w = p.getSize().width, h = p.getSize().height;
JButton b = new JButton("");
b.setBounds(w/10, h/10, w/5, h/8);
p.add(b);
.
FlowLayout, , GridLayout, .
Java SE, JDK 1.4,
SpringLayout, .
(x, y) width, height, , Spring. .
Spring
Spring , . , .
.
Spring , ,
public static Spring constant(int min, int pref, int max);
14. Swing
391
, Spring
(min, pref, max).
, value, setValue(int value). value
. value
.
, getMinimumValue(),
getMaximumValue(), getPreferredValue(), getValue().
SpringLayout Spring.
, , . , , .
Spring :
public static Spring max(Spring s1, Spring s2) ,
s1 s2;
public static Spring minus(Spring s) ,
s ;
public static Spring sum(Spring s1, Spring s2) ,
s1 s2.
s1 s2 ,
:
Spring sp = Spring.minus(Spring.max(Spring.minus(s1), Spring.minus(s2)));
Constraints
Spring . ,
SpringLayout.Constraints.
Constraints, , (x, y), width height, , Spring. x y , . , , , SpringLayout.
x y .
WEST NORTH SpringLayout.
width height , , , SpringLayout.
. x + width y + height
EAST SOUTH .
Constraints "" "": setX(Spring), getX(), setY(Spring), getY(), setWidth(Spring),
392
III.
SpringLayout .
, comp[0], comp[1], comp[2]
. .
6 . , 10
. 14.9 , ,
. 14.9 .
14.9. SpringLayout
import java.awt.*;
import javax.swing.*;
public class SpringWin extends JFrame{
JComponent[] comp = {
new JButton(" "),
new JButton("<html> <p> "),
new JButton("OK")
};
public SpringWin(){
super(" SpringLayout");
SpringLayout sl = new SpringLayout();
setLayout(sl);
//
Spring xPad = Spring.constant(6);
//
Spring yPad = Spring.constant(10);
//
Spring currX = yPad;
// , 0
Spring maxHeight = Spring.constant(0);
for (int i = 0; i < comp.length; i++){
add(comp[i]);
// i-
SpringLayout.Constraints cons = sl.getConstraints(comp[i]);
// i-
cons.setX(currX);
cons.setY(yPad);
//
currX = Spring.sum(xPad, cons.getConstraint("East"));
14. Swing
393
//
maxHeight = Spring.max(maxHeight, cons.getConstraint("South"));
}
//
SpringLayout.Constraints pCons = sl.getConstraints(c);
//
pCons.setConstraint(SpringLayout.EAST, Spring.sum(currX, yPad));
pCons.setConstraint(SpringLayout.SOUTH, Spring.sum(maxHeight, yPad));
pack();
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String args[]){
new SpringWin();
}
}
. 14.9. SpringLayout
JToolBar
JToolBar . . .
JToolBar().
JToolBar(int) :
HORIZONTAL, VERTICAL.
JToolBar(String) .
, JToolBar(String, int) .
Java SE , , BorderLayout . "". () "".
. 14.10. , . "", "" "", ,
. "" ,
JFrame. ,
394
III.
. "" ,
.
.
setFloatable(false). "" , .
, 2 . 14.10, setRollover(true)
.
. 14.10.
JToolBar
DefaultToolBarLayout, BoxLayout, ,
. 14.10 .
14.10.
import java.awt.*;
import javax.swing.*;
public class MyTool extends JFrame{
MyTool(){
super(" ");
JToolBar tb1 = new JToolBar(" 1"),
tb2 = new JToolBar(" 2");
tb1.setRollover(true);
tb1.add(new JButton(new ImageIcon("Add24.gif")));
tb1.add(new JButton(new ImageIcon("AlignTop24.gif")));
tb1.add(new JButton(new ImageIcon("About24.gif")));
tb2.add(new JButton(""));
tb2.add(new JButton(""));
tb2.add(new JButton(""));
add(tb1, BorderLayout.NORTH);
add(tb2, BorderLayout.WEST);
setSize(400, 400);
setDefaultCloseOperation(EXIT_ON_CLOSE);
14. Swing
395
setVisible(true);
}
public static void main(String[] args){
new MyTool();
}
}
Java SE $JAVA_HOME/demo/jfc/Notepad/
JToolBar. ,
java jar Notepad.jar
add(Component), ,
, . , , .
, Swing Action.
Action
Action , ,
- : , -, -,
, .
ActionListener,
String putValue(String
key, Object value), getValue(String key).
actionPerformed(ActionEvent)
:
ACCELERATOR_KEY -, KeyStroke;
ACTION_COMMAND_KEY KeyMap;
DEFAULT ;
DISPLAYED_MNEMONIC_INDEX_KEY , ;
LARGE_ICON_KEY ;
LONG_DESCRIPTION ;
MNEMONIC_KEY int;
NAME , ;
SELECTED_KEY ;
SHORT_DESCRIPTION ;
SMALL_ICON .
, , :
act.putValue(Action.SMALL_ICON, new ImageIcon("save.gif"));
:
ImageIcon ic = (ImageIcon)act.getValue(Action.SMALL_ICON);
396
III.
, Action, (enabled)
(disabled). setEnabled(boolean). , , ,
.
Action AbstractAction,
actionPerformed(ActionEvent).
AbstractAction, , .
, JMenu, JPopupMenu JToolBar, , Action.
add(Action act) , , act.
, tb.add(act) tb JToolBar JButton , , ,
act. m.add(act) m JMenu act
JMenuItem , , , act.
ActionEvent, actionPerformed(ActionEvent). ,
Action
.
, Action, , . , ,
. Action, add(Action).
JLayeredPane
(layered pane) JLayeredPane.
, . , , ,
. , Integer. , , . z .
add(Component comp, Object constraints) Container
JLayeredPane , , .
, comp 50 add(comp, new
Integer(50)).
Integer. Swing.
FRAME_CONTENT_LAYER Integer(30000). , .
JRootPane .
14. Swing
397
DEFAULT_LAYER Integer(0).
.
PALETTE_LAYER Integer(100). -
.
MODAL_LAYER Integer(200). -
.
POPUP_LAYER Integer(300). ,
.
DRAG_LAYER Integer(400).
.
.
,
setBounds(int x, int y, int width, int height);
setLocation(int x, int y);
setSize(int width, int height);
, :
setLayer(Component comp, int layer) comp layer
1 ;
setLayer(Component comp, int layer, int pos) comp layer
pos .
add().
.
JRootPane .
JRootPane
JRootPane (root pane),
JWindow, JDialog, JFrame, JInternalFrame, JApplet, , RootPaneContainer.
398
III.
,
. . , .
(content pane),
getContentPane(). Container, . BorderLayout. , :
getContentPane().setLayout(new FlowLayout());
, :
Container c = getContentPane();
c.add(new JLabel(" ", JLabel.CENTER), BorderLayout.NORTH);
c.add(new JTextArea(5, 50));
Java SE, .
c,
add(new JLabel(" ", JLabel.CENTER), BorderLayout.NORTH);
add(new JTextArea(5, 50));
FRAME_CONTENT_LAYER
JLayeredPane. , ,
JMenuBar.
, JRootPane .
JLayeredPane,
.
,
:
getLayeredPane().add(toolBar, JLayeredPane.PALETTE_LAYER);
, , "
" (glass pane). , Component, , . , , .
, ,
, , MouseEvent, .
, , . , ,
:
getGlassPane().addMouseInputListener(this);
, . ,
, , .
. , ,
, setVisible(true).
14. Swing
399
. , .
, setContentPane(Container), setLayeredPane(JLayeredPane)
setGlassPane(Component) .
,
AWT, Container. , :
JFrame fr = new JFrame(" ");
JPanel c = new JPanel();
c.add(new JTextField(50));
c.add(new JButton("OK"));
fr.setContentPane(c);
, , .
setWindowDecorationStyle(int) . NONE ( ), FRAME, PLAIN_DIALOG,
INFORMATION_DIALOG, ERROR_DIALOG, COLOR_CHOOSER_DIALOG, FILE_CHOOSER_DIALOG, QUESTION_DIALOG,
WARNING_DIALOG. Look and Feel 17.
JWindow
JWindow , . JWindow Window,
AWT. "" Swing.
JWindow . , . , , . JWindow (splash window), .
JWindow , "" (parent) .
JWindow(Frame), JWindow(Window)
JWindow(Window, GraphicsConfiguration). ,
, , ,
. .
JWindow() JWindow(GraphicsConfiguration),
. , ,
. .
JWindow
JRootPane. ,
.
getRootPane(), JWindow
getContentPane(), getLayeredPane() getGlassPane().
, .
, , :
400
III.
, , setLayout(LayoutManager), .
setLayout() , rootPaneCheckingEnabled false,
. true,
setRootPaneCheckingEnabled(boolean). (protected),
JWindow.
add(), addImpl() JWindow,
JRootPane.
setRootPane(JRootPane)
setContentPane(Container), setLayeredPane(JLayeredPane)
setGlassPane(Component).
Window dispose() , .
JDialog
JDialog Dialog AWT (. 10) "" . (modal) .
,
.
Window, Dialog
Frame. JDialog()
.
JDialog(Frame), JDialog(Frame, String), JDialog(Dialog), JDialog(Dialog, String)
JDialog(Window), JDialog(Window, String) .
JDialog(Frame, boolean), JDialog(Frame, String, boolean), JDialog(Dialog,
boolean), JDialog(Dialog, String, boolean) DEFAULT_MODALITY_TYPE, true,
.
JDialog(Window,
Dialog.ModalityType),
JDialog(Window, String,
Dialog.ModalityType) .
setModalityType(Dialog.ModalityType) setTitle(String).
, JWindow, JRootPane
getContentPane(), getLayeredPane(), getGlassPane()
getRootPane().
14. Swing
401
, .
, JWindow.
JWindow, JDialog setRootPane(JRootPane),
setContentPane(Container), setLayeredPane(JLayeredPane) setGlassPane(Component).
, ,
. , , <Alt>+<F4>,
setDefaultCloseOperation(int);
:
DO_NOTHING_ON_CLOSE ;
HIDE_ON_CLOSE ( );
DISPOSE_ON_CLOSE , .
- , , :
setDefaultCloseOperation(JDialog.DO_NOTHUNG_ON_CLOSE);
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
ta.setText(tf.getText()); dispose();
}
});
,
setResizable(boolean).
, , .
setUndecorated(true), .
Look and Feel
setWindowDecorationStyle(int) JRootPane. Look and Feel
17.
, ,
- . Swing JOptionPane
. .
JFrame
JFrame Frame AWT.
,
, , .
402
III.
JFrame(), JFrame(String)
. ,
setVisible(true).
JFrame
JRootPane. , , .
setDefaultCloseOperation(int), , : EXIT_ON_CLOSE System.exit(0). .
, JFrame Frame setIconImage(Image).
, ,
,
setUndecorated(true), Look and Feel
getRootPane().setWindowDecorationStyle(JRootPane.FRAME);
17.
JInternalFrame
JInternalFrame , JFrame, , JDesktopPane. , , , , .
, Java, Java L&F.
JFrame JInternalFrame:
, , .
. ,
JInternalFrame(), , , ,
, . , .
setClosable(boolean), setTitle(String), setIconifiable(boolean), setMaximizable(boolean),
setResizable(boolean), setVisible(boolean).
:
JInternalFrame(String title, boolean resizable, boolean closable,
boolean maximizable, boolean iconifiable)
, false. . 14.11 ,
. ,
14. Swing
403
. 14.11 ,
.
14.11.
import java.awt.*;
import javax.swing.*;
public class IntFrame extends JFrame{
IntFrame(){
super(" ");
setLayout(new FlowLayout());
JInternalFrame ifr1 =
new JInternalFrame(" ", true, true, true, true);
ifr1.getContentPane().add(new JLabel(" "));
ifr1.setPreferredSize(new Dimension(200, 200));
ifr1.setVisible(true);
add(ifr1);
JInternalFrame ifr2 = new JInternalFrame(" ");
ifr2.getContentPane().add(new JButton(" "));
ifr2.setPreferredSize(new Dimension(200, 200));
ifr2.setVisible(true);
add(ifr2);
setSize(400, 400);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args){
new IntFrame();
}
}
. 14.11.
III.
404
JDesktopPane
, " " JDesktopPane.
,
.
JDesktopPane JLayeredPane, , , ,
.
setBounds(), 14.12. . 14.12
14.12.
14.12.
import java.awt.*;
import javax.swing.*;
public class Desk extends JFrame{
Desk(){
super(" ");
JDesktopPane dp = new JDesktopPane();
setContentPane(dp);
JInternalFrame ifr1 =
new JInternalFrame(" ", true, true, true, true);
ifr1.getContentPane().add(new JLabel(" "));
ifr1.setBounds(10,10, 200,200);
ifr1.setVisible(true);
dp.add(ifr1);
JInternalFrame ifr2 = new JInternalFrame(" ");
ifr2.getContentPane().add(new JButton(" "));
ifr2.setBounds(150, 200, 200, 100);
ifr2.setVisible(true);
dp.add(ifr2);
setSize(400, 400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
14. Swing
405
. 14.12.
setDragMode(JDesktopPane.OUTLINE_DRAG_MODE);
JOptionPane
JDialog , (message), - (confirm) (input).
JOptionPane . showMessageDialog() ,
, showConfirmDialog(),
, showInputDialog(), , ,
showOptionDialog().
JDialog.
showInternalXxxDialog()
JInternalFrame.
, , , :
INFORMATION_MESSAGE , Java L&F "i"
, . 14.20 ( );
406
III.
WARNING_MESSAGE ,
, . 14.15;
ERROR_MESSAGE , "" -
, . 14.13;
QUESTION_MESSAGE , ,
. 14.14;
PLAIN_MESSAGE .
Icon,
. 14.16.
parent,
title, message, type , , icon.
, message Object.
Component,
Icon. toString(), JLabel, . message Object[]. .
. 14.13 ,
JOptionPane.showMessageDialog(this,
" \"\" .",
" ", JOptionPane.ERROR_MESSAGE);
. 14.13. ""
. 14.14. ""
: Yes (),
No (), Cancel (). YES_NO_OPTION
YES_NO_CANCEL_OPTION optType showConfirmDialog().
:
static int showConfirmDialog(Component parent, Object message,
String title, int optType, int messType, Icon icon);
14. Swing
407
int n = JOptionPane.showConfirmDialog(this,
" / (Yes/No)?",
" ", JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.QUESTION_MESSAGE);
switch(n){
case JOptionPane.YES_OPTION: saveDoc(); break;
case JOptionPane.NO_OPTION: restore(); saveDoc(); break;
case JOptionPane.CANCEL_OPTION:
case JOptionPane.CLOSED_OPTION: break;
default:
}
. 14.15.
""
. 14.16.
. 14.16 ,
String[] vars = {"", "", ""};
String s = (String)JOptionPane.showInputDialog(this,
" :", " ",
JOptionPane.QUESTION_MESSAGE, new ImageIcon("bird.gif"),
vars, "");
, ,
,
static int showOptionDialog(Component parent, Object message,
String title, int optType, int messType, Icon icon,
Object[] options, Object init);
options
, . init
.
408
III.
, , . 14.14, ,
String[] vars = {"", "", " "};
int n = JOptionPane.showOptionDialog(this,
" ?",
" ", JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.QUESTION_MESSAGE, null, vars, "");
. 14.17.
. 14.17.
. 14.18.
, : L&F , , ,
, . ,
JDialog,
JOptionPane. .
JOptionPane() OK
. . 14.18.
JOptionPane op = new JOptionPane();
JDialog d = op.createDialog(this, " ");
d.setVisible(true);
:
JOptionPane(Object message, int messType, int optType,
Icon icon, Object[] options, Object init);
.
. 14.19 ,
String[] opts = {"", "", "", ""};
JOptionPane op = new JOptionPane(
"<html><font size=+2 > ?",
JOptionPane.QUESTION_MESSAGE,
JOptionPane.YES_NO_CANCEL_OPTION,
null, opts, opts[2]);
JDialog d = op.createDialog(this, " ");
d.setVisible(true);
14. Swing
409
. 14.19.
ProgressMonitor
, , ProgressMonitor.
, -"" JProgressBar OK
Cancel.
ProgressMonitor(Component parent, Object message, String note, int min, int max);
III.
410
if (mon.isCanceled()){
mon.setProgress(100);
break;
}
Thread.sleep(100);
}catch(InterruptedException e){}
}
mon.close();
}
};
Thread thread = new Thread(runnable);
thread.start();
setSize(400, 400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args){
new Progress();
}
}
. 14.20.
14. Swing
1. ?
2. ?
3. ?
4. ?
5. BorderLayout ?
6. JFrame?
7. JPanel?
8. JScrollPane?
9. JWindow?
10. JDialog?
11. ?
411
15
,
, , , , . . ,
. , "" , .
, .
- , , . . .
(event) AWT , , , .
, , (source) .
AWT .
Java .
, .
- EventObject java.util Object. AWTEvent
java.awt , AWT.
- AWT . 15.1. ,
, AWTEvent, java.awt.event.
ComponentEvent, FocusEvent, KeyEvent, MouseEvent -
.
ContainerEvent Container, ,
Swing.
WindowEvent Window .
TextEvent TextComponent, TextArea,
TextField.
AbstractButton .
AbstractButton .
15.
413
, AdjustmentEvent
Scrollbar JScrollBar.
, , getSource()
Object.
EventObject.
- paramString(), String. ,
, . ,
getID() (identifier) ,
. - .
Swing -,
javax.swing.event.
EventObject.
.
, Java .
- (listener).
. 15.1 , InputEvent ( ),
. "Listener",
: ActionListener, MouseListener. "",
. , -
, .
. 15.1. , AWT
, . , , -
(handlers) (listeners): "",
, .
, -
eventHandler -
addXxxListener(XxxEvent eventHandler), Xxx .
, " " ,
(callback). , , , : " - ".
, removeXxxListener().
414
III.
, -, ,
. -,
, (delegate) .
(delegation). ,
- - . , -
.
, . ,
. , , : , , , . ,
, .
, - , . -
, . . , ,
addXxxListener(). - "", , .
, , , . ""
, .
. JFrame tf
JTextField, ta JTextArea b JButton.
tf , <Enter>
b ta.
tf . .
<Enter>,
ActionEvent, -:
tf b.
tf (, tf.getText()) ta (,
ta.append()). , ActionEvent,
, ActionListener.
actionPerformed(), .
, :
class TextMove implements ActionListener{
private JTextField tf;
private JTextArea ta;
TextMove(JTextField tf, JTextArea ta){
this.tf = tf; this.ta = ta;
}
public void actionPerformed(ActionEvent ae){
ta.append(tf.getText()+"\n");
}
}
. ActionEvent
- TextMove,
15.
415
-, actionPerformed(), , .
-, tf b
ActionEvent, TextMove,
addActionListener(), 15.1.
15.1. ActionEvent
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class MyNotebook extends JFrame{
MyNotebook(String title){
super(title);
JTextField tf = new JTextField(" ", 50);
add(tf, BorderLayout.NORTH);
JTextArea ta = new JTextArea();
ta.setEditable(false);
add(ta);
JPanel p = new JPanel();
add(p, BorderLayout.SOUTH);
JButton b = new JButton("");
p.add(b);
tf.addActionListener(new TextMove(tf, ta));
b.addActionListener(new TextMove(tf, ta));
setSize(300, 200);
setVisible(true);
}
public static void main(String[] args){
JFrame f = new MyNotebook(" ActionEvent");
f.setDefaultCloseOperation(EXIT_ON_CLOSE);
}
}
// TextMove
// ...
. 15.2 .
15.1 addActionListener()
tf b.
TextMove, :
TextMove
416
III.
, , ,
, . ,
.
. 15.2. ActionEvent
, , .
, , ,
.
-, 15.2.
15.2. ActionEvent
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class MyNotebook extends JFrame implements ActionListener{
private JTextField tf;
private JTextArea ta;
MyNotebook(String title){
super(title);
tf = new JTextField(" ", 50);
add(tf, BorderLayout.NORTH);
ta = new JTextArea();
ta.setEditable(false);
add(ta);
15.
417
tf ta , ,
, actionPerformed().
MyNotebook. MyNotebook - ActionEvent ActionListener. addActionListener()
this .
, , , . , ta
, MyNotebook.
.
- TextMove,
15.3.
15.3.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class MyNotebook extends JFrame{
private JTextField tf;
private JTextArea ta;
MyNotebook(String title){
super(title);
tf = new JTextField(" ", 50);
418
III.
add(tf, BorderLayout.NORTH);
ta = new JTextArea();
ta.setEditable(false);
add(ta);
JPanel p = new JPanel();
add(p, BorderLayout.SOUTH);
JButton b = new JButton("");
p.add(b);
tf.addActionListener(new TextMove());
b.addActionListener(new TextMove());
setSize(300, 200);
setVisible(true);
}
public static void main(String[] args){
JFrame f = new MyNotebook(" ActionEvent");
f.setDefaultCloseOperation(EXIT_ON_CLOSE);
}
//
class TextMove implements ActionListener{
public void actionPerformed(ActionEvent ae){
ta.append(tf.getText()+"\n");
}
}
}
, , , <Alt>+<F4>
AWT.
WindowEvent, windowClosing(),
System.exit(0).
, WindowAdapter.
-, .
.
1. .
ActionEvent
, - . , : , - .
ActionEvent :
getActionCommand() String JButton,
15.
419
, , <Alt>
Open:
public void actionPerformed(ActionEvent ae){
if (ae.getActionCommand() == "Open" &&
(ae.getModifiers() | ActionEvent.ALT_MASK) != 0){
// -
}
}
MouseEvent :
MOUSE_PRESSED;
MOUSE_RELEASED;
MOUSE_CLICKED (
);
MOUSE_MOVED;
MOUSE_DRAGGED;
MOUSE_ENTERED;
MOUSE_EXITED.
:
public interface MouseListener extends EventListener{
public void mouseClicked(MouseEvent e);
public void mousePressed(MouseEvent e);
public void mouseReleased(MouseEvent e);
public void mouseEntered(MouseEvent e);
public void mouseExited(MouseEvent e);
}
public interface MouseMotionListener extends EventListener{
public void mouseDragged(MouseEvent e);
public void mouseMoved(MouseEvent e);
}
420
III.
Point. , GraphicsConfiguration,
e.getXOnScreen(), e.getYOnScreen() e.getLocationOnScreen().
e.getClickCount(), . 0.
, , e.getModifiers()
InputEvent InputEvent:
BUTTON1_MASK , ;
BUTTON2_MASK , ,
;
BUTTON3_MASK , .
p.add(b1);
p.add(b2);
p.add(b3);
p.add(b4);
p.add(b5);
setDefaultCloseOperation(EXIT_ON_CLOSE);
pack();
15.
421
setVisible(true);
}
public static void main(String[] args){
new ScribbleTest(" \"\"");
}}
class Scribble extends JPanel implements
ActionListener, MouseListener, MouseMotionListener{
protected int lastX, lastY, w, h;
protected Color currColor = Color.black;
protected JFrame f;
public Scribble(JFrame frame, int width, int height){
f = frame; w = width; h = height;
enableEvents(AWTEvent.MOUSE_EVENT_MASK |
AWTEvent.MOUSE_MOTION_EVENT_MASK);
addMouseListener(this);
addMouseMotionListener(this);
}
public Dimension getPreferredSize(){
return new Dimension(w, h);
}
public void actionPerformed(ActionEvent event){
String s = event.getActionCommand();
if (s.equals("")) repaint();
else if (s.equals("")) currColor = Color.red;
else if (s.equals("")) currColor = Color.green;
else if (s.equals(""))
currColor = Color.blue;
else if (s.equals("")) currColor = Color.black;
}
public void mousePressed(MouseEvent e){
if ((e.getModifiers() & MouseEvent.BUTTON1_MASK) == 0) return;
lastX = e.getX(); lastY = e.getY();
}
public void mouseDragged(MouseEvent e){
if ((e.getModifiers() & MouseEvent.BUTTON1_MASK) == 0) return;
Graphics g = getGraphics();
g.setColor(currColor);
g.drawLine(lastX, lastY, e.getX(), e.getY());
lastX = e.getX(); lastY = e.getY();
}
public void mouseReleased(MouseEvent e){}
public void mouseClicked(MouseEvent e){}
public void mouseEntered(MouseEvent e){}
public void mouseExited(MouseEvent e){}
public void mouseMoved(MouseEvent e){}
}
- Scribble MouseListener
MouseMotionListener , -
422
III.
,
mousePressed() mouseDragged(). .
, , -.
. 15.3.
2. - .
-
- -,
.
"Adapter". , -.
:
public abstract
public void
public void
public void
public void
public void
public void
public void
public void
}
public abstract
public void
public void
}
15.
423
, .
, ,
. - WindowAdapter.
- . ,
ComponentAdapter, ContainerAdapter, FocusAdapter KeyAdapter.
, , . Java SE, JDK 1.4, , ,
JScrollPane. , , MouseWheelEvent.
MouseWheelEvent MouseEvent, ,
. : , WHEEL_BLOCK_SCROLL,
WHEEL_UNIT_SCROLL. , "" ""
getScrollType(). , , .
WHEEL_UNIT_SCROLL, getUnitsToScroll() : , . getScrollAmount()
. .
"",
getWheelRotation() "",
.
, ,
.
MouseWheelListener
public void mouseWheelMoved(MouseWheelEvent e);
-,
. 15.5 .
15.5.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class WheelEv extends JFrame
implements MouseWheelListener{
JTextArea ta = new JTextArea(5, 30);
WheelEv(){
super(" ");
getContentPane().add(ta);
424
III.
ta.addMouseWheelListener(this);
setSize(400, 400);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
public void mouseWheelMoved(MouseWheelEvent e){
if (e.getScrollType() == MouseWheelEvent.WHEEL_UNIT_SCROLL)
ta.append(" = " + e.getUnitsToScroll() +
" = "+ e.getScrollAmount() +
" = " + e.getWheelRotation() + "\n");
}
public static void main(String[] args){
new WheelEv();
}
}
. 15.4. ,
KeyEvent :
KEY_PRESSED;
KEY_RELEASED;
KEY_TYPED.
- ,
,
<Shift>+<>. <Alt>- MS Windows.
, <F1>, KEY_TYPED.
, :
public interface KeyListener extends EventListener{
public void keyTyped(KeyEvent e);
15.
425
e .
e.getKeyChar() Unicode char, .
, CHAR_UNDEFINED.
int.
,
(virtual key codes), : VK_F1, VK_SHIFT, VK_A, VK_B, VK_PLUS. KeyEvent.
. , ,
getKeyCode() .
, KEY_TYPED,
VK_UNDEFINED.
e.getKeyCode()
KeyEvent
, - <Alt>, <Ctrl>,
<Meta>, <Shift>, InputEvent
getModifiers() ALT_MASK, CTRL_MASK, META_MASK,
SHIFT_MASK. isAltDown(), isControlDown(),
isMetaDown(), isShiftDown().
15.3 tf
<Esc>. - TextMove:
class TextMove implements ActionListener, KeyListener{
public void actionPerformed(ActionEvent ae){
ta.append(tf.getText()+"\n");
}
public void keyPressed(KeyEvent ke){
if (ke.getKeyCode() == KeyEvent.VK_ESCAPE) tf.setText("");
}
public void keyReleased(KeyEvent ke){}
public void keyTyped(KeyEvent ke){}
}
3. .
TextEvent
TextEvent
TEXT_VALUE_CHANGED.
:
public interface TextListener extends EventListener{
public void textValueChanged(TextEvent e);
}
426
III.
e -
getSource(), EventObject, , :
JTextComponent tc = (JTextComponent)e.getSource();
String s = tc.getText();
//
ChangeEvent
ChangeEvent
Swing: Swing , , "", .
,
, JColorChooser JSlider .
hangeEvent ,
, getSource().
ChangeListener :
public void stateChanged(ChangeEvent);
, :
import javax.swing.event.*;
class SliderHandler implements ChangeListener{
private int threshold;
private JLabel l;
public SliderHandler(int threshold, JLabel l){
this.threshold = threshold; this.l = l;
}
public void stateChanged(ChangeEvent e){
JSlider sl = (JSlider)e.getSource();
if (!sl.getValueIsAdjusting())
if (threshold <= (int)sl.getValue())
l.setText(" ");
}
}
WindowEvent :
WINDOW_OPENED;
WINDOW_CLOSED;
WINDOW_CLOSING;
15.
427
WINDOW_ACTIVATED;
WINDOW_GAINED_FOCUS;
WINDOW_DEACTIVATED;
WINDOW_LOST_FOCUS;
WINDOW_ICONIFIED;
WINDOW_DEICONIFIED;
WINDOW_STATE_CHANGED;
WINDOW_FIRST;
WINDOW_LAST.
:
public interface WindowListener extends EventListener {
public void windowOpened(WindowEvent e);
public void windowClosing(WindowEvent e);
public void windowClosed(WindowEvent e);
public void windowIconified(WindowEvent e);
public void windowDeiconified(WindowEvent e);
public void windowActivated(WindowEvent e);
public void windowDeactivated(WindowEvent e);
}
e Window -
e.getWindow().
repaint() .
ComponentEvent
:
COMPONENT_MOVED;
COMPONENT_RESIZED;
COMPONENT_HIDDEN;
COMPONENT_SHOWN.
:
public interface ComponentListener extends EventListener{
public void componentMoved(ComponentEvent e);
public void componentResized(ComponentEvent e);
public void componentHidden(ComponentEvent e);
public void componentShown(ComponentEvent e);
}
e -
e.getComponent().
428
III.
ContainerEvent
:
COMPONENT_ADDED;
COMPONENT_REMOVED.
:
public interface ContainerListener extends EventListener{
public void componentAdded(ContainerEvent e);
public void componentRemoved(ContainerEvent e);
}
e , , e.getChild() e.getContainer().
.
C FocusEvent
,
FOCUS_GAINED FOCUS_LOST.
:
public interface FocusListener extends EventListener{
public void focusGained(FocusEvent e);
public void focusLost(FocusEvent e);
}
,
brighter() Color, ,
darker().
.
ItemEvent
List,
Choice, JComboBox, Checkbox, Swing,
AbstractButton, ITEM_STATE_CHANGED.
:
public interface ItemListener extends EventListener{
void itemStateChanged(ItemEvent e);
}
e e.getItemSelectable(),
e.getItem() Object.
15.
429
AdjustmentEvent
Scrollbar JScrollBar ADJUSTMENT_VALUE_CHANGED.
:
public interface AdjustmentListener extends EventListener{
public void adjustmentValueChanged(AdjustmentEvent e);
}
e
e.getAdjustable(),
e.getValue() e.getAdjustmentType(), :
UNIT_INCREMENT ;
UNIT_DECREMENT ;
BLOCK_INCREMENT ;
BLOCK_DECREMENT ;
TRACK .
430
III.
setLayout(null);
setFont(new Font("Serif", Font.BOLD, 15));
Panel p = new Panel();
p.setLayout(null);
p.setBounds(10,50, 150, 260); add(p);
Label lc = new Label(" ");
lc.setBounds(20, 0, 120, 30); p.add(lc);
Label lmin = new Label("0", Label.RIGHT);
lmin.setBounds(0, 30, 30, 30); p.add(lmin);
Label lmiddle = new Label("127", Label.RIGHT);
lmiddle.setBounds(0, 120, 30, 30); p.add(lmiddle);
Label lmax = new Label("255", Label.RIGHT);
lmax.setBounds(0, 200, 30, 30); p.add(lmax);
sbRed.setBackground(Color.red);
sbRed.setBounds(40, 30, 20, 200); p.add(sbRed);
sbRed.addAdjustmentListener(new ChColor());
sbGreen.setBackground(Color.green);
sbGreen.setBounds(70, 30, 20, 200); p.add(sbGreen);
sbGreen.addAdjustmentListener(new ChColor());
sbBlue.setBackground(Color.blue);
sbBlue.setBounds(100, 30, 20, 200); p.add(sbBlue);
sbBlue.addAdjustmentListener(new ChColor());
Label lp = new Label(":");
lp.setBounds(250, 50, 120, 30); add(lp);
lm.setBackground(new Color(127, 127, 127));
lm.setBounds(220, 80, 120, 80); add(lm);
b1.setBounds(240, 200, 100, 30); add(b1);
b1.addActionListener(new ApplyColor());
b2.setBounds(240, 240, 100, 30); add(b2);
b2.addActionListener(new CancelColor());
setSize(400, 300);
setVisible(true);
}
class ChColor implements AdjustmentListener{
public void adjustmentValueChanged(AdjustmentEvent e){
int red = c.getRed(), green = c.getGreen(), blue = c.getBlue();
if (e.getAdjustable() == sbRed)
red = e.getValue();
else if (e.getAdjustable() == sbGreen) green = e.getValue();
else if (e.getAdjustable() == sbBlue) blue = e.getValue();
c = new Color(red, green, blue);
lm.setBackground(c);
}
}
15.
431
, 15.115.3, TextMove, : tf JTextField b JButton.
. b
"",
"". Button peer-.
FlowerButton 10.7 paint()
.
design pattern Observer.
. -
,
addXxxListener().
,
, .
addXxxListener() -, Vector, java.awt
432
III.
AWTEventMulticaster.
XxxListener, , . add(), ,
:
add(ActionListener a, ActionListener b);
: ,
ActionListener, a b, .
a += b.
Button, , addActionListener()
:
public synchronized void addActionListener(ActionListener l){
if (l == null){ return; }
actionListener = AWTEventMulticaster.add(actionListener, l);
newEventsOnly = true;
}
actionListener l.
InputEvent, KeyEvent MouseEvent, consume(). -, peer-, . ,
, "" .
, , , -,
- .
, , . , ,
.
AWT,
:
enableEvents().
AWTEvent, , , :
enableEvents(AWTEvent.MOUSE_MOTION_EVENT_MASK |
AWTEvent.MOUSE_EVENT_MASK | AWTEvent.KEY_EVENT_MASK)
XxxEvent.
dispatchEvent() ,
, - processEvent() .
15.
433
processEvent()
processXxxEvent(). :
protected void processEvent(AWTEvent e){
if (e instanceof FocusEvent){
processFocusEvent((FocusEvent)e);
}else if (e instanceof MouseEvent){
switch(e.getID()){
case MouseEvent.MOUSE_PRESSED:
case MouseEvent.MOUSE_RELEASED:
case MouseEvent.MOUSE_CLICKED:
case MouseEvent.MOUSE_ENTERED:
case MouseEvent.MOUSE_EXITED:
processMouseEvent((MouseEvent)e);
break;
case MouseEvent.MOUSE_MOVED:
case MouseEvent.MOUSE_DRAGGED:
processMouseMotionEvent((MouseEvent)e);
break;
}
}else if (e instanceof KeyEvent){
processKeyEvent((KeyEvent)e);
}
// ...
, processKeyEvent(). -
- . :
protected void processKeyEvent(KeyEvent e){
KeyListener listener = keyListener;
if (listener != null){
int id = e.getID();
switch(id){
case KeyEvent.KEY_TYPED: listener.keyTyped(e);
break;
case KeyEvent.KEY_PRESSED: listener.keyPressed(e);
break;
case KeyEvent.KEY_RELEASED: listener.keyReleased(e);
break;
}
}
}
, AWTEvent,
processEvent(), ,
,
processKeyEvent(). ,
, :
super.processKeyEvent(e);
434
III.
processXxxEvent() .
10 10.10
.
.
15.7 MyEvent,
.
MyEvent (START)
(STOP).
15.7.
// 1. :
public class MyEvent extends java.util.EventObject{
protected int id;
public static final int START = 0, STOP = 1;
public MyEvent(Object source, int id){
super(source);
this.id = id;
}
public int getID(){ return id; }
}
// 2. Listener:
public interface MyListener extends java.util.EventListener{
public void start(MyEvent e);
public void stop(MyEvent e);
}
// 3. fireEvent():
protected Vector listeners = new Vector();
public void fireEvent( MyEvent e){
Vector list = (Vector) listeners.clone();
for(int i = 0; i < list.size(); i++){
MyListener listener = (MyListener)list.elementAt(i);
switch(e.getID()){
case MyEvent.START: listener.start(e); break;
case MyEvent.STOP: listener.stop(e); break;
}
}
}
,
fireEvent(this, MyEvent.START);
15.
fireEvent(this, MyEvent.STOP);
1. AWT?
2. Swing?
3. ?
4. ?
5. ?
6. ?
7. ?
8. ?
9. AWT ?
435
16
, .
- . , JButton ,
.
, "".
, JLabel, .
Swing
, , ,
.
Border
javax.swing.border.
public void paintBorder(Component c, Graphics g,
int x, int y, int width, int height);
c, , g Graphics,
, , , .
.
isBorderOpaque().
, getBorderInsets(Component c), ,
c, Insets. ,
Insets top, left,
right bottom. Insets
, :
int d = b.getBorderInsets(this).top;
Border AbstractBorder,
paintBorder(), isBorderOpaque()
false, getBorderInsets() .
public static Rectangle getInteriorRectangle(Component c, Border b,
int x, int y, int width, int height);
16.
437
AbstractBorder , . javax.swing
BorderFactory, createXxxBorder() . ,
setBorder(Border) JComponent. , . 16.1
:
JLabel l2 = new JLabel(" LineBorder(Color.blue, 3) ");
l2.setBorder(BorderFactory.createLineBorder(Color.blue, 3));
.
. 16.1, 16.1.
16.1.
import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;
public class SimpBorders extends JFrame{
SimpBorders(){
super(" ");
setLayout(new FlowLayout());
JButton l1 = new JButton(" EmptyBorder() ");
l1.setBackground(Color.white);
l1.setBorder(BorderFactory.createEmptyBorder());
JLabel l2 = new JLabel(" LineBorder(Color.blue, 3) ");
l2.setBorder(BorderFactory.createLineBorder(Color.blue, 3));
JLabel l3 = new JLabel(" BevelBorder(BevelBorder.RAISED) ");
l3.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
JLabel l4 = new JLabel(" BevelBorder(BevelBorder.LOWERED) ");
l4.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
JLabel l5 = new JLabel(" ");
l5.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED,
Color.black, Color.white, Color.black, Color.white));
JLabel l6 = new JLabel(" EtchedBorder() ");
l6.setBorder(BorderFactory.createEtchedBorder());
add(l1); add(l2); add(l3);
add(l4); add(l5); add(l6);
setSize(400, 400);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
438
III.
. 16.1.
EmptyBorder
EmptyBorder . , , . 16.1, .
EmptyBorder(Insets);
EmptyBorder(int top, int left, int bottom, int right);
.
createEmptyBorder() BorderFactory ,
createEmptyBorder(int top, int left, int bottom, int right);
.
isBorderOpaque() false, paintBorder() . getBorderInsets()
Insets.
EmptyBorder setBorder(Border) JComponent.
LineBorder
LineBorder ,
. . 16.1, .
LineBorder(Color).
LineBorder(Color, int) .
LineBorder(Color, int, boolean), true, .
, createBlackLineBorder() createGrayLineBorder(),
.
16.
439
BorderFactory ,
LineBorder: createLineBorder(Color) createLineBorder(Color, int).
BevelBorder
BevelBorder : .
, ,
. RAISED,
. 16.1 . ,
. LOWERED,
. 16.1 . JButton.
BevelBorder(int type) type .
createBevelBorder(int type);
createRaisedBevelBorder();
createLoweredBevelBorder();
BorderFactory.
createBevelBorder(int type, Color highlight, Color shadow);
createBevelBorder(int type, Color highlightOuter, Color highlightInner,
Color shadowOuter, Color shadowInner);
. highlightInner
shadowInner, highlightOuter shadowOuter.
SoftBevelBorder
SoftBevelBorder BevelBorder, , . , BevelBorder:
SoftBevelBorder(int type);
SoftBevelBorder(int type, Color highlight, Color shadow);
SoftBevelBorder(int type, Color highlightOuter, Color highlightInner,
Color shadowOuter, Color shadowInner);
440
III.
EtchedBorder
EtchedBorder , ,
, - ,
RAISED, - , LOWERED.
. 16.1 . "" Java L&F, "Metal".
EtchedBorder()
createEtchedBorder() BorderFactory.
RAISED LOWERED EtchedBorder(int)
createEtchedBorder(int).
EtchedBorder(Color highlight, Color shadow);
createEtchedBorder(Color highlight, Color shadow);
, ,
EtchedBorder(int type, Color highlight, Color shadow);
createEtchedBorder(int type, Color highlight, Color shadow);
MatteBorder
MatteBorder ,
. 16.2, , , , .
MatteBorder(Icon).
.
c
MatteBorder(Insets, Icon);
MatteBorder(Insets, Color);
MatteBorder(int top, int left, int bottom, int right, Icon);
MatteBorder(int top, int left, int bottom, int right, Color);
createMatteBorder(int top, int left, int bottom, int right, Icon);
createMatteBorder(int top, int left, int bottom, int right, Color);
BorderFactory.
, ,
. 16.2 , . 16.2.
16.
441
. 16.2.
16.2.
import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;
public class MatBorders extends JFrame{
MatBorders(){
super(" ");
setLayout(new FlowLayout());
JLabel l1 = new JLabel(" MatteBorder(Icon) ");
l1.setBorder(new MatteBorder(new ImageIcon("about16.gif")));
JLabel l2 = new JLabel(" MatteBorder(3,6,3,6, Color.red) ");
l2.setBorder(BorderFactory.createMatteBorder(3,6,3,6, Color.red));
add(l1);
add(l2);
setSize(400, 400);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args){
new MatBorders();
}
}
TitledBorder
TitledBorder . TitledBorder(String) createTitledBorder(String)
BorderFactory ,
. . 16.3, .
.
TitledBorder(Border, String);
442
III.
createTitledBorder(Border, String);
. 16.3 EtchedBorder.
, TOP, , ABOVE_TOP, , BELOW_TOP. :
BOTTOM, ABOVE_BOTTOM, BELOW_BOTTOM. pos , .
, LEFT, ,
CENTER, , RIGHT. just ,
.
, , 16.5.
TitledBorder(Border, String, int just, int pos);
createTitledBorder(Border, String, int just, int pos);
. 16.3.
,
TitledBorder(Border, String, int just, int pos, Font);
createTitledBorder(Border, String, int just, int pos, Font);
,
TitledBorder(Border, String, int just, int pos, Font, Color);
BorderFactory
createTitledBorder(Border, String, int just, int pos, Font, Color);
. 16.3.
16.
443
16.3 , . 16.3. .
16.3.
import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;
public class TitBorders extends JFrame{
TitBorders(){
super(" ");
setLayout(new FlowLayout());
JLabel l1 = new JLabel(" TitledBorder(String) ");
l1.setBorder(new TitledBorder(""));
JLabel l2 = new JLabel(
" TitledBorder(new EtchedBorder(),\"\") ");
l2.setBorder(BorderFactory.createTitledBorder(
BorderFactory.createEtchedBorder(), ""));
JLabel l3 = new JLabel(
"<html> CENTER," +
" ABOVE_TOP<p> ITALIC, 18 ");
l3.setBorder(BorderFactory.createTitledBorder(
BorderFactory.createEtchedBorder(), "",
TitledBorder.CENTER, TitledBorder.ABOVE_TOP,
new Font("Times New Roman", Font.ITALIC, 18)));
JLabel l4 =
new JLabel(" RIGHT, BELOW_TOP ");
l4.setBorder(BorderFactory.createTitledBorder(
BorderFactory.createEtchedBorder(), "",
TitledBorder.RIGHT, TitledBorder.BELOW_TOP,
new Font("Times New Roman", Font.ITALIC, 18),
Color.red ));
JLabel l5 =
new JLabel(" CENTER, BOTTOM ");
l5.setBorder(BorderFactory.createTitledBorder(
BorderFactory.createEtchedBorder(), "",
TitledBorder.CENTER, TitledBorder.BOTTOM,
new Font("Times New Roman", Font.ITALIC, 18),
Color.red ));
add(l1); add(l2); add(l3); add(l4); add(l5);
setSize(400, 400);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
444
III.
CompoundBorder
CompoundBorder , .
CompoundBorder(Border out, Border in)
createCompoundBorder(Border out, Border in) BorderFactory.
. 16.4.
. . 16.4 , 16.4 , .
16.4.
import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;
public class CompBorders extends JFrame{
CompBorders(){
super(" ");
setLayout(new FlowLayout());
JLabel l1 = new JLabel(
" CompoundBorder(TitledBorder, TitledBorder) ");
l1.setBorder(new CompoundBorder(
BorderFactory.createTitledBorder(
BorderFactory.createEtchedBorder(), "",
TitledBorder.CENTER, TitledBorder.ABOVE_TOP,
new Font("Times New Roman", Font.ITALIC|Font.BOLD, 20)),
BorderFactory.createTitledBorder(
BorderFactory.createEtchedBorder(), "",
TitledBorder.RIGHT, TitledBorder.BOTTOM,
16.
445
Swing
BorderFactory , .
AbstractBorder,
paintBorder() getBorderInsets().
, isBorderOpaque() ,
true.
, - . 16.5 , TitledBorder, , JComponent.
TitledBorder , PlaceBorder
.
PlaceBorder
PlaceBorderPane, JPanel. , PlaceBorder. 16.5
. 16.5.
III.
446
16.5. ,
import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;
interface BorderConstants{
static public final int DEFAULT_POSITION
static public final int ABOVE_TOP
static public final int TOP
static public final int BELOW_TOP
static public final int ABOVE_BOTTOM
static public final int BOTTOM
static public final int BELOW_BOTTOM
static
static
static
static
static
static
public
public
public
public
public
public
final
final
final
final
final
final
int
int
int
int
int
int
=
=
=
=
=
=
=
0;
1;
2;
3;
4;
5;
6;
DEFAULT_JUSTIFICATION = 0;
LEFT
= 1;
CENTER
= 2;
RIGHT
= 3;
LEADING = 4;
TRAILING = 5;
16.
public PlaceBorderPane(){
this(new JLabel(""));
}
public PlaceBorderPane(JComponent c){
this(null, c, LEFT, TOP);
}
public PlaceBorderPane(Border b, JComponent c, int just, int pos){
super(); comp = c;
border = new PlaceBorder(b, c, just, pos);
setBorder(border);
setLayout(null);
add(comp);
p = new JPanel();
add(p);
}
public JPanel getContentPane(){
return p;
}
public void doLayout(){
Insets insets = getInsets();
Rectangle r = getBounds();
r.x = 0; r.y = 0;
comp.setBounds(border.getComponentRect(r,insets));
r.x += insets.left;
r.y += insets.top;
r.width -= insets.left + insets.right;
r.height -= insets.top + insets.bottom;
p.setBounds(r);
}
class PlaceBorder extends TitledBorder{
public PlaceBorder(JComponent c){
this(null, c, LEFT, TOP);
}
public PlaceBorder(Border b){
this(b, null, LEFT, TOP);
}
public PlaceBorder(Border b, JComponent c){
this(b, c, LEFT, TOP);
}
public PlaceBorder(Border b, JComponent c, int just, int pos){
super(b, null, just, pos, null, null);
if (b == null)
border = super.getBorder();
}
447
448
III.
16.
insets.bottom = EDGE_SPACING + TEXT_SPACING + bIns.bottom;
insets.left
= EDGE_SPACING + TEXT_SPACING + bIns.left;
if (c == null || comp == null) return insets;
int h = (comp != null) ? comp.getPreferredSize().height : 0;
switch (titlePosition){
case ABOVE_TOP:
insets.top += h + TEXT_SPACING;
break;
case TOP:
case DEFAULT_POSITION:
insets.top += Math.max(h, bIns.top) bIns.top;
break;
case BELOW_TOP:
insets.top += h + TEXT_SPACING;
break;
case ABOVE_BOTTOM:
insets.bottom += h + TEXT_SPACING;
break;
case BOTTOM:
insets.bottom += Math.max(h, bIns.bottom) bIns.bottom;
break;
case BELOW_BOTTOM:
insets.bottom += h + TEXT_SPACING;
}
return insets;
}
public Rectangle getComponentRect(Rectangle rect, Insets bIns){
Dimension d = comp.getPreferredSize();
Rectangle r = new Rectangle(0, 0, d.width, d.height);
switch (titlePosition){
case ABOVE_TOP:
r.y = EDGE_SPACING;
break;
case TOP:
case DEFAULT_POSITION:
r.y = EDGE_SPACING +
(bIns.top EDGE_SPACING TEXT_SPACING d.height)/2;
break;
case BELOW_TOP:
r.y = bIns.top d.height TEXT_SPACING;
break;
case ABOVE_BOTTOM:
r.y = rect.height bIns.bottom + TEXT_SPACING;
break;
case BOTTOM:
r.y = rect.height bIns.bottom + TEXT_SPACING +
(bIns.bottom EDGE_SPACING TEXT_SPACING d.height)/2;
break;
449
450
III.
case BELOW_BOTTOM:
r.y = rect.height d.height EDGE_SPACING;
}
switch (titleJustification) {
case LEFT:
case DEFAULT_JUSTIFICATION:
r.x = TEXT_INSET_H + bIns.left;
break;
case RIGHT:
r.x = rect.width bIns.right -TEXT_INSET_H r.width;
break;
case CENTER:
r.x = (rect.width r.width) / 2;
}
return r;
}
}}
. 16.5. JLabel
1. Swing ?
2. ?
3. ?
4. - ?
5. - ?
6. , ?
7. ?
8. ?
17
Swing .
(look) , ,
, , , . (feel)
, ,
. . , Look and Feel, L&F. , L&F .
Swing LookAndFeel javax.swing. - L&F , L&F.
Swing
. , , (system defaults).
BasicLookAndFeel, LookAndFeel. BasicLookAndFeel javax.swing.plaf.basic.
, ,
, BasicLookAndFeel:
MotifLookAndFeel , CDE
dows;
MacLookAndFeel , Apple Macintosh.
CDE/Motif ,
Windows Macintosh, - , .
452
III.
Java , , Java
Look and Feel, Java L&F, JLF. "Metal" L&F .
""
. , JLF
, . Swing.
- SwingSet2. Java SE "Ocean", "Steel". "Steel"
, swing.metalTheme=steel.
, JLF, .
, .
Java L&F
BasicLookAndFeel MetalLookAndFeel.
, Java L&F Nimbus L&F,
JDK 1.6.0_10. Nimbus Java 2D ,
9. , ,
Nimbus .
Nimbus NimbusLookAndFeel
javax.swing.plaf.nimbus.
, ,
(look and feel defaults).
(user
defaults), .
. ,
Swing . ,
.
, L&F: ""
, CDE/Motif, Nimbus Java L&F. . 17.1.
JFrame JDialog, ,
.
,
JFrame.setDefaultLookAndFeelDecorated(true);
JDialog.setDefaultLookAndFeelDecorated(true);
JFrame newLAFWin = new JFrame();
,
L&F ,
JFrame JDialog L&F, . 17.4.
17.
453
. 17.1.
L&F
, , .
,
.
Swing Pluggable
Look and Feel, PL&F, PLAF plaf.
L&F
L&F L&F
UIManager javax.swing.
, L&F, L&F.
UIManager L&F
swing.defaultlaf, , ,
D:
XxxLookAndFeel
java -Dswing.defaultlaf=com.sun.java.swing.plaf.motif.MotifLookAndFeel
SomeSwingApplication
, swing.properties,
$JAVA_HOME/lib. , swing.defaultlaf, :
swing.defaultlaf=com.sun.java.swing.plaf.motif.MotifLookAndFeel
454
III.
Nimbus.
L&F UIManager UIDefaults. UIDefaults Hashtable, , -, " " (key value). - get(Object key), value key,
put(Object key, Object value), value key,
UIDefaults , . , get(Object).
, getBoolean(Object key) key,
boolean. getBorder(Object), getColor(Object),
getDimension(Object), getFont(Object), getIcon(Object), getInsets(Object), getInt(Object),
getString(Object). getXxx(Object, Locale), .
UIDefaults, UIManager, (private)
. UIDefaults
UIManager .
, , Jlabel,
:
Font labelFont = UIManager.getFont("Label.font");
, getDefaults()
UIDefaults, UIManager.
, UIDefaults,
:
UIDefaults defs = UIManager.getDefaults();
Enumeration keys = defs.keys();
Enumeration elem = defs.elements();
while (keys.hasMoreElements() && elem.hasMoreElements())
System.out.println(
keys.nextElement() + ": " + elem.nextElement());
put(Object key, Object value);
,
L&F . L&F
geLookAndFeelDefaults(), UIDefaults.
17.
455
, UIManager
L&F UIManager.LookAndFeelInfo.
UIManager.LookAndFeelInfo,
installLookAndFeel(UIManager.LookAndFeelInfo);
L&F
PL&F, setLookAndFeel(LookAndFeel) setLookAndFeel(String) UIManager. ,
XxxLookAndFeel . , "javax.swing.plaf.metal.
MetalLookAndFeel" , Java L&F. Java SE, Java L&F
getCrossPlatformLookAndFeelClassName()
UIManager. , Java L&F ,
, .
getSystemLookAndFeelClassName() UIManager ,
L&F .
L&F :
public static void main(String[] args){
try{
UIManager.setLookAndFeel(
UIManager.getSystemLookAndFeelClassName());
}catch(Exception e){}
new SomeSwingApplication();
}
,
Java L&F.
CDE/Motif UIManager
, :
UIManager.setLookAndFeel(
"com.sun.java.swing.plaf.motif.MotifLookAndFeel");
17.1 , . 17.1.
L&F.
456
III.
17.1. L&F
import java.awt.*;
import javax.swing.*;
public class DiffLAF extends JFrame{
DiffLAF(){
super(" L&F");
setLayout(new FlowLayout());
JInternalFrame ifr1 =
new JInternalFrame(" O Metal", true, true, true, true);
ifr1.getContentPane().add(new JLabel(" Java L&F"));
ifr1.setPreferredSize(new Dimension(200, 100));
ifr1.setVisible(true);
add(ifr1);
try{
UIManager.setLookAndFeel(
UIManager.getSystemLookAndFeelClassName());
JInternalFrame ifr2 =
new JInternalFrame(" O Windows", true, true, true, true);
ifr2.getContentPane().add(
new JLabel("<html> Windows L&F<p> Classic"));
ifr2.setPreferredSize(new Dimension(200, 100));
ifr2.setVisible(true);
add(ifr2);
UIManager.setLookAndFeel(
"com.sun.java.swing.plaf.motif.MotifLookAndFeel");
}catch(Exception e){}
JInternalFrame ifr3 =
new JInternalFrame(" O CDE/Motif", true, true, true, true);
ifr3.getContentPane().add(
new JLabel(" Solaris CDE L&F"));
ifr3.setPreferredSize(new Dimension(200, 100));
ifr3.setVisible(true);
add(ifr3);
setSize(400, 400);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args){
new DiffLAF();
}
}
17.
457
L&F
L&F Swing (auxiliary) L&F. MultiLookAndFeel
javax.swing.plaf.multi. XxxLookAndFeel
$JAVA_HOME/lib/swing.properties, swing.auxiliarylaf, .
L&F Java
L&F, L&F
swing.auxiliarylaf swing.properties.
L&F /:
, / .
L&F ,
L&F. L&F , BasicLookAndFeel,
MultiLookAndFeel.
L&F
GUI L&F . L&F L&F:
UIManager.setLookAndFeel(new MyCoolLookAndFeel());
L&F.
- , L&F, L&F ,
PropertyChangeEvent. UIManager addPropertyChangeListener(PropertyChangeListener).
L&F.
updateComponentTreeUI(Component)
SwingUtilities. , .
, L&F :
JFrame frame = JFrame(" ");
UIManager.addPropertyChangeListener(
new PropertyChangeListener(){
public void propertyChange(PropertyChangeEvent e){
SwingUtilities.updateComponentTreeUI(frame);
}
});
, frame.pack().
updateComponentTreeUI(frame) . updateUI()
JComponent, , , setUI(ComponentUI)
, L&F .
III.
458
java.awt.*;
java.awt.event.*;
java.beans.*;
java.util.*;
javax.swing.*;
17.
459
setSize(400, 400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args){
new ChLAF();
}
class LAFChange implements ItemListener{
private String className;
public LAFChange(String className){
this.className = className;
}
public void itemStateChanged(ItemEvent e){
if(e.getStateChange() == ItemEvent.SELECTED)
try{
UIManager.setLookAndFeel(className);
}catch(Exception ex){}
}
}
}
. 17.2. L&F
L&F
L&F, .
put(Object key, Object value) UIManager.
UIDefaults
, getDefaults().
updateComponentTreeUI(Component) .
III.
460
17.3 , . , .
17.3.
import
import
import
import
import
import
java.awt.*;
java.awt.event.*;
java.beans.*;
java.util.*;
javax.swing.*;
javax.swing.plaf.*;
17.
461
setSize(400, 400);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args){
new PropCh();
}
class FontChange implements ItemListener{
public FontChange(){}
public void itemStateChanged(ItemEvent e){
if (e.getStateChange() == ItemEvent.SELECTED){
JMenuItem mi = (JMenuItem)e.getSource();
int n = Integer.parseInt(mi.getText());
Font f = UIManager.getFont("TextArea.font");
String name = f.getName();
int style = f.getStyle();
FontUIResource fr = new FontUIResource(name, style, n);
UIManager.put("TextArea.font", fr);
UIManager.put("TextField.font", fr);
UIManager.put("PasswordField.font", fr);
UIManager.put("EditorPane.font", fr);
UIManager.put("TextPane.font", fr);
UIManager.put("FormattedTextField.font", fr);
//
//
}
}
}
}
. 17.3 17.3.
20 . , .
. 17.3.
462
III.
Java L&F
Java L&F (primary) (secondary) ,
. , .
- ,
, , (theme)
.
, , MetalTheme javax.swing.plaf.metal. ,
, DefaultMetalTheme. -, , , primary1 RGB (102,
102, 153), primary2 (153, 153, 204), primary3 (204, 204, 255). -, -, , secondary1
(102, 102, 102), secondary2 (153, 153, 153), secondary3 (204, 204, 204).
primary1 , .
primary2 , primary3 .
secondary1 "" , secondary2 , secondary3 .
DefaultMetalModel ,
, .
OceanTheme, DefaultMetalModel,
-, -, , RGB
(99, 130, 191), (163, 184, 204) (184, 207, 229). -,
- -, , (122, 138, 153), (184, 207, 229) (238, 238, 238).
MetalTheme, , : getPrimary1(), getPrimary2(),
getPrimary3(), getSecondary1(), getSecondary2(), getSecondary3(), ,
: getControlTextFont(), getMenuTextFont(), getSubTextFont(),
getSystemTextFont(), getUserTextFont(), getWindowTitleFont().
, DefaultMetalTheme
OceanTheme.
, , ColorUIResource. :
ColorUIResource(Color);
ColorUIResource(int red, int green, int blue);
ColorUIResource(float red, float green, float blue);
ColorUIResource(int rgb);
, , :
public ColorUIResource getPrimary1(){
return new ColorUIResource(36, 124, 225);
}
, , FontUIResource,
:
17.
463
FontUIResource(Font);
FontUIResource(String name, int style, int size);
, , :
public FontUIResource getSystemTextFont(){
return FontUIResource("Times New Roman", Font.PLAIN, 10);
}
, ,
Java L&F. MetalTheme
addCustomEntriesToTable(UIDefaults), UIDefaults
, - . MetalTheme, .
17.4 ,
.
, MetalTheme,
DefaultMetalTheme OceanTheme, setCurrentTheme(MetalTheme) MetalLookAndFeel, 17.4.
, . . 17.4.
17.4. , ""
import
import
import
import
import
java.awt.*;
javax.swing.*;
javax.swing.border.*;
javax.swing.plaf.*;
javax.swing.plaf.metal.*;
464
III.
. 17.4. , ""
, , Java L&F.
17.
465
1. (Look and Feel) ?
2. (theme) ?
3. L&F Swing?
4. Swing L&F?
5. Java L&F?
6. Java L&F?
18
(applications),
(standalone) JVM .
Frame, (window manager) .
Java (applets). ,
.
. JVM , JVM . .
AWT,
Applet, , , Panel. ,
, . ,
Panel, FlowLayout. Applet java.applet, , . ,
.
Swing JApplet, Applet. Swing AWT
setJMenuBar(JMenuBar)
, JFrame. ,
getContentPane(), BorderLayout.
, ,
JVM, , main(),
.
. , .
, .
, main(),
init() Applet. Java . Applet:
public void init(){}
18.
467
! init() , Applet.
,
destroy(), . Applet .
init() destroy() Applet ,
. start() stop(),
. stop() ,
, start() . ,
.
.
, , , init() . , , start(), , stop(). ,
, , destroy().
. 18.1
AWT, HelloWorld.
18.1. HelloWorld
import java.awt.*;
import java.applet.*;
public class HelloWorld extends Applet{
public void paint(Graphics g){
g.drawString("Hello, XXI century World!", 10, 30);
}
}
HelloWorld.java :
javac HelloWorld.java
468
III.
. 18.1. HelloWorld
Internet Explorer
. -,
, <applet>. ,
, . ,
, . , , :
<applet code = "HelloWorld.class" width = "100%" height = "100%">
-, . 18.1, . , . ,
setBackground(Color.white), init().
JDK appletviewer. ,
. -
18.
469
, . appletviewer
:
appletviewer HelloWorld.html
. 18.2. HelloWorld
appletviewer
.
(status bar) .
str showStatus(String str). 18.3 ,
" ", 18.4
HTML-.
18.3.
// RunningString.java
import java.awt.*;
import java.applet.*;
public class RunningString extends Applet{
private boolean go;
public void start(){
go = true;
sendMessage(" ");
}
public void sendMessage(String s){
String s1 = s + " ";
while (go){
showStatus(s);
try{
Thread.sleep(200);
}catch(Exception e){}
s = s1.substring(1) + s.charAt(0);
s1 =s;
}
}
470
III.
, , -. appletviewer ,
. , .
. ShowWindow SomeWindow Frame,
TextField. , <Enter> . . SomeWindow ,
. , stop() start(),
? 18.5 18.6, . 18.3.
18.5. ,
// ShowWindow.java
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
public class ShowWindow extends Applet{
private SomeWindow sw = new SomeWindow();
private TextField tf = new TextField(30);
private Button b = new Button("");
public void init(){
add(tf); add(b); sw.pack();
b.addActionListener(new ActShow());
sw.tf.addActionListener(new ActShow());
}
public void start(){ sw.setVisible(true); }
public void stop(){ sw.setVisible(false); }
public void destroy(){ sw.dispose(); sw = tf = b = null; }
18.
471
18.6. ShowWindow.html
<html>
<head><title> ShowWindow Applet</title></head>
<body>
.<br>
<applet code = "ShowWindow.class" width = "400" height = "50">
</applet>
</body>
</html>
. 18.3. ,
III.
472
,
Refresh Reload .
Refresh Internet Explorer (IE) <Ctrl>,
Reload Firefox <Shift>. .
. : ,
. IE Delete Files ,
Tools | Internet Options. Firefox Network Tools |
Options | Advanced Clear Now.
java main(String[] args).
, .
<param>,
<applet> </applet> HTML-.
<param> name value.
, , HelloWorld . 18.7 HelloWorld.html.
18.7.
<html>
<head><title> Applet</title></head>
<body>
.<br>
<applet code = "HelloWorld.class"
<param name = "fontName" value
<param name = "fontStyle" value
<param name = "fontSize" value
</applet>
</body>
</html>
getParameter(String name) Applet, String.
name ,
, value
.
18.
473
System.out.println(), ,
Java Console. . Internet Explorer Java Console enabled Tools | Internet Options | Advanced. IE View Java Console.
18.8 HelloWorld. ,
, HTML-.
18.8. ,
import java.awt.*;
import java.applet.*;
public class HelloWorld extends Applet{
public void init(){
setBackground(Color.white);
String font = "Serif";
int style = Font.PLAIN, size = 10;
font = getParameter("fontName");
style = Integer.parseInt(getParameter("fontStyle"));
size = Integer.parseInt(getParameter("fontSize"));
setFont(new Font(font, style, size));
}
public void paint(Graphics g){
g.drawString("Hello, XXI century World!", 10, 30);
}
}
, HTML-, -
, 18.8.
. 18.4 .
. 18.4.
III.
474
, ,
, ,
. "", "", "".
:
String[][] pinfo = {
{"fontName", "String", "font name"},
{"fontStyle", "int", "font style"},
{"fontSize", "int", "font size"}
};
getParameterInfo(), .
Applet. , , , . :
public String[][] getParameterInfo(){
return pinfo;
}
, ,
, . :
getAppletInfo(),
. ,
JVM. -, java_arguments
JVM, ,
<applet name = "AnApplet" code = "AnApplet.class" width = "300" height = "200">
<param name="java_arguments" value="-Xmx128m Dsun.java2d.nodraw=true">
</applet>
-, java_version JRE, , ,
<applet name = "AnApplet" code = "AnApplet.class" width = "300" height = "200">
<param name="java_version" value="1.6.0_10+">
</applet>
, .
18.
475
-, , , , - Lava, ,
"". ,
:
<applet name
<param
<param
<param
<param
<param
<param
</applet>
, <applet>.
<applet>
<applet>.
:
ode URL- ;
width height .
:
odebase URL- , .
, ,
HTML-;
archive , , -
;
download . -
;
name . , -
code codebase;
style CSS (Cascading Style Sheet, );
title , ;
alt , , ;
III.
476
mayscript . , -
JavaScript.
<applet> </applet> , ,
<applet>. <applet>:
<applet name = "AnApplet" code = "AnApplet.class"
archive = "anapplet.zip, myclasses.zip"
codebase = "http://www.some.com/public/applets"
width = "300" height = "200" align = "TOP"
vspace = "5" hspace = "5" mayscript
alt = "If you have a java-enabled browser,
you would see an applet here.">
<hr>If your browser recognized the applet tag,
you would see an applet here.<hr>
</applet>
zip- jar- archive HTML-. .
getCodeBase() URL- , .
getDocumentBase() URL- , HTML-,
.
AppletContext, java.applet.
getAppletContext().
getApplet(String name) getApplets() AppletContext
name , .
showDocument(URL address) HTML- address.
showDocument(URL address, String target) ,
target. :
_self , ;
_parent ;
_top ;
18.
477
_blank ;
name name. , .
4. , .
Java Image, . drawImage()
Graphics.
20, :
drawImage(Image img, int x, int y, ImageObserver obs);
drawImage(Image img, int x, int y, int width, int height,
ImageObserver obs);
, img. , , drawImage().
false, .
(x, y) img; width
height ; obs , ImageObserver, . this.
,
Image, . getWidth(), getHeight()
Image.
ImageObserver, Component, , Applet,
imageUpdate(),
.
. ,
.
, , ,
. ,
awt.image.incrementalDraw true.
imageUpdate() ImageObserver.
img. :
imageUpdate(Image img, int status, int x, int y, int width, int height);
478
III.
status ,
ImageObserver:
WIDTH -
width;
HEIGHT -
height;
PROPERTIES ,
getProperties() Image;
SOMEBITS , -
; x, y, width, height ;
FRAMEBITS , ;
x, y, width, height ;
ALLBITS , x, y, width, height -
;
ERROR , , ABORT;
ABORT , -
.
.
MediaTracker. , ,
. MediaTracker .
MediaTracker
MediaTracker(Component comp) . this.
addImage(Image img, int id) img id.
.
checkID(int id), checkID(int id, boolean load)
checkAll() , id
. true,
, false . load true,
.
statusID(int id), statusID(int id, boolean load) statusAll()
, COMPLETE, ABORTED, ERRORED.
, waitForID(int id) waitForAll() .
20 20.5 .
18.
479
, Image,
, GIF JPEG, Applet:
getImage(URL address) URL- ;
getImage(URL address, String fileName) address -
filename.
, ,
AudioClip, AU, AIFF, WAVE MIDI
Applet :
getAudioClip(URL address);
getAudioClip(URL address, String fileName);
newAudioClip(URL address);
, ,
.
AudioClip java.applet . . play() . loop() . stop() .
. , .
18.9 ,
, HTML-. . 18.5 , , .
18.9.
import java.applet.*;
import java.awt.*;
import java.awt.image.*;
public class SimpleAudioImage extends Applet{
private Image img;
private AudioClip ac;
public void init(){
img = getImage(getDocumentBase(), "javalogo52x88.gif");
ac = getAudioClip(getDocumentBase(), "yesterday.au");
}
public void start(){ ac.loop(); }
public void paint(Graphics g){
int w = img.getWidth(this), h = img.getHeight(this);
g.drawImage(img, 0, 0, 2 * w, 2 * h, this);
}
public void stop(){ ac.stop(); }
}
480
III.
. 18.5.
,
20.
5. , , .
6. , 3 .
, .
. , - , . ,
, , ,
, , , .
: "Applet started...", , , : "Warning: Applet Window".
.
. Firefox Disable , Tools | Add-ons, Internet
Explorer Tools | Internet Options | Security.
.
, ,
(sandbox), "" , .
, , :
, , -
18.
481
, ;
, , ,
6.4;
, ,
;
(clipboard);
exec();
"" load();
JVM exit();
java.*, sun.*
.
, , , ,
. (trusted) ,
java.security.*.
, ,
. SecurityManager. JVM
setSecurityManager(SecurityManager sm);
System. .
SecurityManager -,
. JVM .
Swing
, ,
Swing, JApplet, Applet.
JFrame. , Swing
. 18.10 .
18.10. , Swing
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class SwingAppletTemplate extends JApplet{
public void init(){
Container c = getContentPane();
482
III.
//
}
class MainFrame extends JFrame{
// ,
}
JApplet
, , Swing,
JApplet, Applet. ,
, : init(), start(), stop(),
destroy(). Swing, Swing
JRootPane. JFrame.
,
BorderLayout.
, , Swing,
JApplet <APPLET> . Swing ,
Java Plug-in. JRE
JRE. Java Plug-in
,
. Java Plug-in http://java.sun.com/
http://www.microsoft.com/java/ .
JDK 1.6.0_10 Java Plug-in JRE .
Java Plug-in <applet> <object> Internet Explorer <embed> Netscape Communicator.
JRE ,
, , :
<html>
<body>
<!--"CONVERTED_APPLET"-->
<!-- HTML CONVERTER -->
<object classid = "clsid:CAFEEFAC-0014-0000-0000-ABCDEFFEDCBA"
width = 100 height = 100
codebase="http://java.sun.com/products/plugin/1.4/
jinstall-140-win32.cab#Version=1,4,0,0">
18.
483
,
java jar htmlconverter.jar dummy.html
7. Swing.
484
III.
Java.
Java ,
WWW. , JDK demo/applets.
JDK java.applet, Sun
, .
. , , , ,
" ".
, , Java, . .
,
, , .
Oracle java.applet.
.
2007 JavaFX,
, , , Rich Internet Applications. JavaFX http://
www.oracle.com/technetwork/java/javafx/overview/index.html.
1. ?
2. ?
3. , , , . .
?
4. ?
5. ?
6. ?
7. ?
8. , ?
9. ?
19
Swing
Swing, .
Swing -, JComponent. , .
putClientProperty(Object key,
Object value). , value key getClientProperty(Object key),
value Object. , getClientProperty(Object)
, null.
JToolBar , (. . 14.10).
setRollover(boolean) JToolBar.isRollover.
:
public void setRollover(boolean rollover){
putClientProperty("JToolBar.isRollover",
rollover ? Boolean.TRUE : Boolean.FALSE);
}
isRollover() . :
public boolean isRollover(){
Boolean rollover =
(Boolean)getClientProperty("JToolBar.isRollover");
if (rollover != null)
return rollover.booleanValue();
return false;
}
comp JComponent:
- , :
comp.putClientProperty("Number", new Integer(k++));
486
III.
, , :
Integer numb = (Integer)comp.getClientProperty("Number");
19.1.
Swing, JScrollPane, . , Scrollable. Swing.
(drag), .
,
, scrollRectToVisible(Rectangle rect). :
setAutoscrolls(true).
Swing .
. <Tab>, <Ctrl>+<Tab>.
, ,
, , .
. <Shift>+<Tab>, <Ctrl>+<Shift>+<Tab>.
,
. ,
, .
19. Swing
487
Component
requestFocus(boolean) requestFocusInWindow(boolean).
true , false .
, , . ,
, . false,
, true, .
. , Swing
AWT. java.awt KeyEventDispatcher,
dispatchKeyEvent(KeyEvent). false,
KeyEvent ,
, true, .
- KeyListener, ,
dispatchKeyEvent(KeyEvent) , .
, KeyEventPostProcessor,
postProcessKeyEvent(KeyEvent),
.
KeyboardFocusManager, DefaultKeyboardFocusManager.
KeyEvent .
:
FORWARD_TRAVERSAL_KEY <Tab> <Ctrl>+<Tab>;
BACKWARD_TRAVERSAL_KEY <Shift>+<Tab>;
UP_CYCLE_TRAVERSAL_KEY ,
DOWN_CYCLE_TRAVERSAL_KEY , -
.
setDefaultFocusTraversalKeys(int, Set), <Tab> <Shift>.
Set AWTKeyStroke.
setFocusTraversalKeys(int, Set) Component.
,
, FocusTraversalPolicy. , :
getComponentAfter(Container, Component) ;
getComponentBefore(Container, Component) ;
getFirstComponent(Container) ;
getLastComponent(Container) ;
getDefaultComponent(Container) , -
III.
488
getInitialComponent(Window) , -
.
FocusTraversalPolicy.
ContainerOrderFocusTraversalPolicy , , getComponents() Container.
accept(Component),
. :
protected boolean accept(Component comp){
if (!(comp.isVisible() && comp.isDisplayable() &&
comp.isEnabled() && comp.isFocusable())) return false;
// ...
}
, ,
.
ContainerOrderFocusTraversalPolicy DefaultFocusTraversalPolicy,
accept(Component) , ,
isFocusable(), , .
, InternalFrameFocusTraversalPolicy, Swing.
, javax.swing. getInitialComponent(JInternalFrame). Component.
InternalFrameFocusTraversalPolicy SortingFocusTraversalPolicy.
, Comparator, .
6. SortingFocusTraversalPolicy(Comparator).
SortingFocusTraversalPolicy,
,
LayoutFocusTraversalPolicy.
, . L&F BasicLookAndFeel .
setDefaultFocusTraversalPolicy(FocusTraversalPolicy)
LayoutFocusTraversalPolicy
KeyboardFocusManager.
setFocusTraversalPolicy(FocusTraversalPolicy)
Container.
focusNextComponent() focusPreviousComponent()
.
transferFocus(), transferFocusBackward() Component.
KeyboardFocusManager
19.1
. 19.1 .
19. Swing
. 19.1.
19.1.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class SimpFocus extends JFrame implements FocusListener{
DefaultKeyboardFocusManager myFocusmgr =
new DefaultKeyboardFocusManager();
JButton
bt;
JTextField tf;
JTextArea ta;
SimpFocus(){
super(" ");
JPanel p = new JPanel();
add(p, BorderLayout.NORTH);
bt = new JButton(" myButton ");
bt.putClientProperty("Focus", "JButton bt");
tf = new JTextField(" myTextField ");
tf.putClientProperty("Focus", "JTextField tf");
tf.addFocusListener(this);
ta = new JTextArea(6, 40);
ta.putClientProperty("Focus", "JTextArea ta");
add(ta);
p.add(tf);
p.add(bt);
pack();
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
489
490
III.
printDefaultSettings(myFocusmgr);
changeFocusOwner(myFocusmgr);
}
public void focusLost(FocusEvent e){
ta.append("\n myTextField: .");
ta.append("\n " +
((JComponent)e.getOppositeComponent()).
getClientProperty("Focus")+".");
}
public void focusGained(FocusEvent e){
ta.append("\n myTextField: .");
}
public void printDefaultSettings(
DefaultKeyboardFocusManager fm){
ta.append("\n : ");
ta.append("\n FORWARD_TRAVERSAL_KEYS: " +
fm.getDefaultFocusTraversalKeys(
KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS));
ta.append("\n BACKWARD_TRAVERSAL_KEYS: " +
fm.getDefaultFocusTraversalKeys(
KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS));
ta.append("\n UP_CYCLE_TRAVERSAL_KEYS: " +
fm.getDefaultFocusTraversalKeys(
KeyboardFocusManager.UP_CYCLE_TRAVERSAL_KEYS));
ta.append("\n DOWN_CYCLE_TRAVERSAL_KEYS: " +
fm.getDefaultFocusTraversalKeys(
KeyboardFocusManager.DOWN_CYCLE_TRAVERSAL_KEYS));
}
public void changeFocusOwner(DefaultKeyboardFocusManager fm){
ta.append("\n " +
((JComponent)fm.getFocusOwner()).getClientProperty("Focus"));
ta.append("\n : " +
(fm.getCurrentFocusCycleRoot()));
ta.append("\n .");
fm.focusNextComponent();
ta.append("\n " +
((JComponent)fm.getFocusOwner()).getClientProperty("Focus"));
ta.append("\n .");
fm.focusPreviousComponent();
ta.append("\n " +
((JComponent)fm.getFocusOwner()).getClientProperty("Focus"));
}
public static void main(String[] args){
new SimpFocus();
}
}
19. Swing
491
getContents(Object) ,
Transferable. , ClipBoardOwner.
TransferHandler.
Swing. TransferHandler(String),
JavaBean.
setTransferHandler(TransferHandler) JComponent.
exportAsDrag(JComponent comp, InputEvent evt, int action);
comp
evt. action COPY MOVE.
<Ctrl>, L&F.
,
AWT. : java.awt.dnd java.awt.datatransfer.
TransferHandler.
19.2
JTextField JLabel .
19.2.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class LabelDnD extends JFrame{
public LabelDnD(){
super(" JLabel");
JTextField tf = new JTextField(100);
tf.setDragEnabled(true);
492
III.
Timer
Timer ,
ActionEvent.
Timer(int millisec, ActionListener al);
"" start().
, millisec
ActionEvent. al.
, stop().
,
setRepeats(false).
setDelay(int). setInitialDelay(int).
setLogTimers(true),
System.out , "Timer ringing:"
Timer.
19.3 Timer.
. "".
19. Swing
493
19.3. Timer
import
import
import
import
java.awt.*;
java.util.*;
java.awt.event.*;
javax.swing.*;
20
, Java
Image. 18 , getImage()
.
getImage() Toolkit
String URL. getToolkit() Component :
java.awt
getDefaultToolkit()
Toolkit:
Image img = Toolkit.getDefaultToolkit().getImage("C:\\images\\Ivanov.gif");
filename;
createImage(URL address) -
, URL address;
createImage(byte[] imageData) imageData,
GIF JPEG;
createImage(byte[] imageData, int offset, int length)
producer.
Component. "", .
"-"
:
, - .
20.
495
AWT .
"" (Producer-Consumer). , "",
,
, . , "", .
Image .
, . ,
.
AWT : ImageProducer
ImageConsumer java.awt.image.
ImageProducer :
addConsumer(ImageConsumer ic) ic;
removeConsumer(ImageConsumer ic) ;
isConsumer(ImageConsumer ic) ; ,
ic;
startProduction(ImageConsumer ic) ic -
;
requestTopDownLeftRightResend(ImageConsumer ic)
, " , " , .
Image ,
ImageProducer. getSource() Image.
ImageProducer MemoryImageSource . pix, .
MemoryImageSource.
Image createImage().
20.1 ,
100 100 . , ,
, .
20.1. ,
import
import
import
import
java.awt.*;
java.awt.event.*;
java.awt.image.*;
javax.swing.*;
496
III.
InMemory(String s){
super(s);
int i = 0;
for (int y = 0; y < h; y++){
int red = 255 * y / (h 1);
for (int x = 0; x < w; x++){
int green = 255 * x / (w 1);
pix[i++] = (255 << 24)|(red << 16)|(green << 8)| 128;
}
}
setSize(250, 200);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public void paint(Graphics gr){
if (img == null)
img = createImage(new MemoryImageSource(w, h, pix, 0, w));
gr.drawImage(img, 50, 50, this);
}
public static void main(String[] args){
new InMemory(" ");
}
}
, pix int,
byte.
. width height c
(x, y), pix, offset.
scansize pix. model ( RGB).
20.
. 20.1. ,
497
. 20.2. ,
"-"
. 20.2 , "-".
-
ImageConsumer ,
ImageFilter. , , . , setPixels().
,
(protected) consumer .
java.awt.image ImageFilter:
CropImageFilter(int x, int y, int w, int h) , -
;
RGBImageFilter ; ,
filterRGB();
ReplicateScaleFilter(int w, int h)
, / ;
AreaAveragingScaleFilter(int w, int h) ; -
, .
-,
ImageProducer FilteredImageSource. , producer, filter - ImageFilter .
FilteredImageSource(ImageProducer producer, ImageFilter filter);
, .
20.220.4.
498
III.
20.2 . , ,
ReplicateScaleFilter AreaAveragingScaleFilter.
20.2.
import
import
import
import
java.awt.*;
java.awt.event.*;
java.awt.image.*;
javax.swing.*;
. 20.3, , ,
, , .
20.
499
. 20.3.
20.3 .
rgb >> 1 filterRGB().
. filterRGB()
ColorFilter RGBImageFilter.
20.3.
import
import
import
import
java.awt.*;
java.awt.event.*;
java.awt.image.*;
javax.swing.*;
500
III.
20.4 .
ShiftFilter ImageFilter, . , ,
setPixels().
20.4.
import
import
import
import
java.awt.*;
java.awt.event.*;
java.awt.image.*;
javax.swing.*;
20.
501
20.4, setPixels() ,
, ,
consumer ImageFilter setPixels() .
. 20.4 .
. 20.4.
1. "", .
2. , .
3. 20.4 setPixels() , ,
.
Java 2D. (immediate mode model).
502
III.
Graphics Java 2D
Graphics2D, 9, Image Java 2D BufferedImage.
BufferedImage(int width, int height, int imageType);
:
TYPE_INT_RGB
TYPE_4BYTE_ABRG
TYPE_USHORT_565_RGB
TYPE_INT_ARGB
TYPE_4BYTE_ABRG_PRE
TYPE_USHORT_555_RGB
TYPE_INT_ARGB_PRE
TYPE_BYTE_GRAY
TYPE_USHORT_GRAY
TYPE_INT_BRG
TYPE_BYTE_BINARY
TYPE_3BYTE_BRG
TYPE_BYTE_INDEXED
bi : , .
Raster
, getPixel(), getPixels(). WritableRaster setPixel() setPixels() setRect().
WritableRaster.
(minX, minY), .
BufferedImage
WritableRaster.
, .
DataBufferByte, DataBufferInt, DataBufferShort, DataBufferUShort
.
DataBuffer. , : TYPE_BYTE, TYPE_USHORT,
TYPE_INT, TYPE_UNDEFINED.
DataBuffer ,
Raster WritableRaster.
Raster WritableRaster
DataBuffer.
20.
503
, Raster
DataBuffer, SampleModel,
, (samples) . RGB
, .
java.awt.image SampleModel:
ComponentSampleModel
DataBuffer;
BandedSampleModel ,
, DataBuffer :
;
ComponentSampleModel;
PixelInterleavedSampleModel
DataBuffer;
ComponentSampleModel;
MultiPixelPackedSampleModel -
, DataBuffer;
SinglePixelPackedSampleModel
DataBuffer.
. 20.5 Java 2D, .
, Java 2D DataBuffer
SampleModel Raster BufferedImage. , Raster
SampleModel. , DataBuffer.
. 20.5. ,
504
III.
, .
.
Java 2D
source, BufferedImage,
destination
filter(BufferedImage source, BufferedImage destination);
WritableRaster.
RasterOp.
, , .
java.awt.image , BufferedImageOp
RasterOp:
AffineTransformOp : , -
, , ;
RescaleOp ;
LookupOp ;
BandCombineOp Raster;
ColorConvertOp ;
ConvolveOp , /
, "" .
, .
AffineTransform 9,
.
AffineTransformOp at interp / hints:
AffineTransformOp(AffineTransform at, int interp);
AffineTransformOp(AffineTransform at, RenderingHints hints);
: TYPE_NEAREST_NEIGHBOR ( ) TYPE_BILINEAR.
20.
505
AffineTransformOp filter().
BufferedImage,
. 20.6, . .
drawImage(BufferedImage img, BufferedImageOp op, int x, int y);
Graphics2D. img,
. 20.6, .
. 20.6.
20.5 , , . 20.6.
BufferedImage.
. ,
,
, Swing .
20.5.
import
import
import
import
import
java.awt.*;
java.awt.geom.*;
java.awt.image.*;
java.awt.event.*;
javax.swing.*;
506
III.
// bi
// img.
bi = new BufferedImage(img.getWidth(this), img.getHeight(this),
BufferedImage.TYPE_INT_RGB);
// big bi.
Graphics2D big = bi.createGraphics();
// img big.
big.drawImage(img, 0, 0, this);
}
public void paint(Graphics g){
Graphics2D g2 = (Graphics2D)g;
int w = getSize().width;
int h = getSize().height;
int bw = bi.getWidth(this);
int bh = bi.getHeight(this);
// at.
AffineTransform at = new AffineTransform();
at.rotate(Math.PI/4);
// 45
// .
// bw.
at.preConcatenate(new AffineTransform(1, 0, 0, 1, bw, 0));
// bimg
// . .
BufferedImage bimg =
new BufferedImage(2*bw, 2*bw, BufferedImage.TYPE_INT_RGB);
// biop, at.
BufferedImageOp biop = new AffineTransformOp(at,
AffineTransformOp.TYPE_NEAREST_NEIGHBOR);
// , bimg.
biop.filter(bi, bimg);
// .
g2.drawImage(bi, null, 10, 30);
// biop bi.
g2.drawImage(bi, biop, w/4+3, 30);
// bimg .
g2.drawImage(bimg, null, w/2+3, 30);
}
public static void main(String[] args){
JFrame f = new AffOp(" ");
f.setSize(400, 200);
f.setVisible(true);
f.setDefaultCloseOperation(EXIT_ON_CLOSE);
}
}
. 20.6 , .
20.
507
factor
offset. . .
factor offset
hints:
RescaleOp(float factor, float offset, RenderingHints hints);
filter().
. 20.7 ,
, . 70 .
20.6 , .
. 20.7.
20.6.
import
import
import
import
java.awt.*;
java.awt.image.*;
java.awt.event.*;
javax.swing.*;
508
III.
,
BufferedImage, TYPE_INT_RGB. , . ,
int.
. 20.7 samples.
.
20.7 - . ByteLookupTable,
. LookupOp. , filter() .
20.7 . 20.6 . Java - .
20.7.
//---------------- 20.6 --------------byte samples[][] = new byte[3][256];
for (int j = 0; j < 255; j++){
samples[0][j] = (byte)(255);
// .
samples[1][j] = (byte)(0);
// .
samples[2][j] = (byte)(0);
// .
}
20.
509
samples[0][255] = (byte)(255);
// .
samples[1][255] = (byte)(255);
samples[2][255] = (byte)(255);
ByteLookupTable blut=new ByteLookupTable(0, samples);
LookupOp lop = new LookupOp(blut, null);
lop.filter(bi, bimg);
//------------------ ------------------------
.
(convolution)
. (x, y) ,
A(x, y). w(0),
w(1) ... w(8). (x, y) :
w(0)*A(x-1, y-1) + w(1)*A(x, y-1) + w(2)*A(x+1, y-1)+
w(3)*A(x-1, y) + w(4)*A(x, y)
+ w(5)*A(x+1, y) +
w(6)*A(x-1, y+1) + w(7)*A(x, y+1) + w(8)*A(x+1, y+1)
w(i),
, .
w(i) 1.0f, . , . . 0.1111111f, , , . w(4) 1.0f, , ,
.
, ,
15 (3 5, 5 3), 25 (5 5) .
Java 2D . , :
float[] w = {0, -1, 0, -1, 5, -1, 0, -1, 0};
Kernel :
Kernel kern = new Kernel(3, 3, w);
ConvolveOp :
ConvolveOp conv = new ConvolveOp(kern);
, filter():
conv.filter(bi, bimg);
20.8 , "".
20.8.
//-------------- 20.6 -----------------------float[] w1 = { 0.11111111f, 0.11111111f, 0.11111111f,
0.11111111f, 0.11111111f, 0.11111111f,
0.11111111f, 0.11111111f, 0.11111111f };
510
III.
. 20.8.
4. , .
5. ,
.
6. 20.8 9 15 25 .
?
.
,
Image BufferedImage .
20.9. run1.gif,
run2.gif, ..., run10.gif. img[]
100 , 0,1 .
20.9.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
20.
511
.
paint() , paint() , .
Component repaint().
repaint() , ,
paint(). ""
update(Graphics g). repaint()
Java .
512
III.
,
Image BufferedImage ,
. , . .
update(), paint() update().
20.10 20.11 .
20.10. Image
public void update(Graphics g){
int w = getSize().width, h = getSize().height;
// - .
Image offImg = createImage(w, h);
// .
Graphics offGr = offImg.getGraphics();
//
offGr.setColor(getBackground());
// , .
offGr.fillRect(0, 0, w, h);
// .
offGr.setColor(getForeground());
// 20.9 .
offGr.drawImage(img[count % 10], 0, 0, this);
//
// ( ).
paint(offGr);
// -
// ( paint()).
20.
513
g.drawImage(offImg, 0, 0, this);
}
// paint() .
public void paint(Graphics g){ update(g); }
20.11. BufferedImage
public void update(Graphics g){
Graphics2D g2 = (Graphics2D)g;
int w = getSize().width, h = getSize().height;
// - .
BufferedImage bi = (BufferedImage)createImage(w, h);
// .
Graphics2D big = bi.createGraphics();
// .
big.setColor(getBackground());
// .
big.clearRect(0, 0, w, h);
// .
big.setColor(getForeground());
// - big
// ...
// .
g2.drawImage(bi, 0, 0, this);
}
, Swing .
.
- , paint()
, .
20.12
, update(), . .
20.12.
import
import
import
import
import
java.awt.*;
java.awt.event.*;
java.awt.geom.*;
java.awt.image.*;
javax.swing.*;
514
III.
MediaTracker tr = new MediaTracker(this);
img = getToolkit().getImage("back2.jpg");
tr.addImage(img, 0);
try{
tr.waitForID(0);
}catch(InterruptedException e){}
setSize(400, 400);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public void update(Graphics g){
Graphics2D g2 = (Graphics2D)g;
int w = getSize().width, h = getSize().height;
BufferedImage bi = (BufferedImage)createImage(w, h);
Graphics2D big = bi.createGraphics();
// img.
big.drawImage(img, 0, 0, this);
// .
big.setColor(Color.red);
// ,
// .
big.fill(new Arc2D.Double(4*count, 50+30*Math.sin(count),
50, 50, 0, 360, Arc2D.OPEN));
// .
big.setColor(getForeground());
//
big.draw(new Line2D.Double(0, 125, w, 125));
// - .
g2.drawImage(bi, 0, 0, this);
}
public void go(){
while(count < 100){
repaint();
try{
Thread.sleep(10);
}catch(InterruptedException e){}
count++;
}
}
public static void main(String[] args){
DrawAnim1 f = new DrawAnim1(" ");
f.go();
}
}
, , ,
,
20.
515
MemoryImageSource.
newPixels()
repaint(),
setAnimated(true). :
newPixels(int x, int y, int width, int height)
;
newPixels() .
20.13 . , ,
.
20.13. MemoryImageSource
import
import
import
import
java.awt.*;
java.awt.event.*;
java.awt.image.*;
javax.swing.*;
III.
516
// .
for(int y = 0; y < h; y++)
for(int x = 0; x < w; x++)
pix[i++] = (255 << 24)|(255 + 8 * count << 16)|
(8*count << 8)| 255 + 8 * count;
// .
mis.newPixels();
try{
Thread.sleep(100);
}catch(InterruptedException e){}
count++;
}
}
public static void main(String[] args){
InMemory f= new InMemory(" ");
f.go();
}
}
, .
, . ,
Java SE, $JAVA_HOME/demo/applets/ $JAVA_HOME/
demo/jfc/Java2D/src/, .
7. - run1.gif,
run2.gif . . 20.9.
8. Java 2D .
18, AudioClip.
, , getAudioClip(), , , , play(), loop()
stop() .
Applet newAudioClip(URL address), ,
address, , AudioClip. , , , , .
20.14 , doom.mid, .
, <Ctrl>+<C>.
20.
517
20.14.
import java.applet.*;
import java.net.*;
class SimpleAudio{
SimpleAudio(){
try{
AudioClip ac = Applet.newAudioClip(new URL("file:doom.mid"));
ac.loop();
}catch(Exception e){}
}
public static void main(String[] args){
new SimpleAudio();
}
}
Java
, JVM, : (digital audio) (sample rate) 8000
48 000 (quantization) 8 16 MIDI-
(sequences) 0 1.
AU, WAV AIFF.
.
Clip.
,
, .
SourceDataLine.
, .
AudioFormat.
:
AudioFormat(float sampleRate, int sampleSize, int channels,
boolean signed, boolean bigEndian);
518
III.
(1 , 2 ); ,
(signed == true) , bigEndian.
, .
.
getAudioFileFormat() AudioSystem, getFormat()
AudioFileFormat. 20.15.
AudioFormat, DataLine.Info (line) : Clip SourceDataLine.
, .
getLine()
AudioSystem. AudioInputStream.
AudioFormat getFormat(). 20.16. open().
-! , start(), stop(), "" setFramePosition(0)
setMillisecondPosition(0).
n loop(n)
loop(Clip.LOOP_CONTINUOUSLY). n
m setLoopPoints(n, m).
close().
20.15.
20.15.
import javax.sound.sampled.*;
import java.io.*;
class PlayAudio{
PlayAudio(String s){
play(s);
}
public void play(String file){
Clip line = null;
try{
// , .
File f = new File(file);
// .
AudioFileFormat aff = AudioSystem.getAudioFileFormat(f);
// .
AudioFormat af = aff.getFormat();
// ,
// Class.
DataLine.Info info = new DataLine.Info(Clip.class, af);
20.
519
// , .
if (!AudioSystem.isLineSupported(info)){
System.err.println("Line is not supported");
System.exit(0);
}
// .
line = (Clip)AudioSystem.getLine(info);
// .
AudioInputStream ais = AudioSystem.getAudioInputStream(f);
// .
line.open(ais);
}catch(Exception e){
System.err.println(e);
}
// .
line.start();
//
// :
line.stop();
// .
line.close();
}
public static void main(String[] args){
if (args.length != 1)
System.out.println("Usage: java PlayAudio filename");
new PlayAudio(args[0]);
}
}
// .
520
III.
try{
File f = new File(file);
// f.
ais = AudioSystem.getAudioInputStream(f);
// .
AudioFormat af = ais.getFormat();
// info.
DataLine.Info info = new DataLine.Info(SourceDataLine.class, af);
// , .
if (!AudioSystem.isLineSupported(info)){
System.err.println("Line is not supported");
System.exit(0);
}
// .
line = (SourceDataLine)AudioSystem.getLine(info);
// .
line.open(af);
// .
line.start();
// .
int num = 0;
// .
while(( num = ais.read(b)) != -1)
line.write(b, 0, num);
// "" , .
line.drain();
// .
ais.close();
}catch(Exception e){
System.err.println(e);
}
// .
line.stop();
// .
line.close();
}
public static void main(String[] args){
String s = "mamba.aif";
if (args.length > 0) s = args[0];
new PlayAudioLine(s);
}
}
. LineEvent
, OPEN, , CLOSE, , , START, , STOP, . . LineListener update().
MIDI- (sequence)
(sequencer) , MIDI--
20.
521
522
III.
Java
MIDI-
Sequence - : , , ,
, 20.18.
:
Sequence(float divisionType, int resolution);
Sequence(float divisionType, int resolution, int numTracks);
;
SMPTE_24, SMPTE_25, SMPTE_30, SMPTE_30DROP (Society of Motion Picture and Television
Engineers) , .
, resolution, , :
Sequence seq = new Sequence(Sequence.PPQ, 10);
10 .
, numTracks, MIDI-.
, , :
Track tr = seq.createTrack();
,
:
Track[] trs = seq.getTracks();
: NOTE_ON , NOTE_OFF
. . NOTE_ON ,
20.
523
, msg , , ticks
( "") seq ( ).
.
, :
tr.add(me);
, . 20.18 , MIDI-
MIDI-.
MIDI .
, 20.17, . start()
startRecording(), ,
. :
write(Sequence in, int type, File out);
write(Sequence in, int type, OutputStream out);
, type, MIDI-,
seq
getMidiFileTypes(seq). . . 20.18.
20.18. MIDI-
import javax.sound.midi.*;
import java.io.*;
class SynMIDI{
SynMIDI(){
play(synth());
}
public Sequence synth(){
Sequence seq = null;
try{
// 10
// MIDI- .
seq = new Sequence(Sequence.PPQ, 10);
524
III.
// .
Track tr = seq.createTrack();
for (int k = 0; k < 100; k++){
ShortMessage msg = new ShortMessage();
// MIDI- 10 109.
msg.setMessage(ShortMessage.NOTE_ON, 10+k, 93);
// 5 .
tr.add(new MidiEvent(msg, 5*k));
msg = null;
}
}catch(Exception e){
System.err.println("From synth(): "+e);
System.exit(0);
}
return seq;
}
public void play(Sequence seq){
try{
Sequencer sequencer = MidiSystem.getSequencer();
if (sequencer == null){
System.err.println("Sequencer is not supported");
System.exit(0);
}
sequencer.open();
sequencer.setSequence(seq);
sequencer.startRecording();
int[] type = MidiSystem.getMidiFileTypes(seq);
MidiSystem.write(seq, type[0], new File("gammas.mid"));
}catch(Exception e){
System.err.println("From play(): " + e);
}
}
public static void main(String[] args){
new SynMIDI();
}
}
,
(synthesizer), ,
Java Sound API. Java SE, $JAVA_
HOME/docs/technotes/guides/sound/programmer_guide/, .
20.
01. Java?
02. Image?
03. "-"?
04. ?
05. Java?
06. ?
07. Java 2D ?
08. Java?
09. Java?
10. Java?
525
IV
Java
21.
22.
23.
24.
Java
21
(exceptions)
(runtime) , . , ,
, , .
, -
:
if (something == wrong){
//
}else{
//
}
,
. , Pascal, , 2/3 .
, , ,
. , .
- .
, .
, , . ,
. , .
: .
. 21.1 ,
0. . . 21.1,
Java.
IV. Java
530
. 21.1.
21.1.
class SimpleExt{
public static void main(String[] args){
int n = Integer.parseInt(args[0]);
System.out.println("10 / n = " + (10 / n));
System.out.println("After all actions");
}
}
. . ,
"" (throws) -. ""
21.
531
532
IV. Java
catch(){}
finally{}, catch(){}
, . . ,
- - .
21.2 , .
: 5, 0 .
. 21.2.
. 21.2.
, , .
, , catch(ArithmeticException ae){}, ,
finally{}.
parseInt()
catch(ArrayIndexOutOfBoundsException arre){}, finally{}.
, ,
"After all actions".
, , 21.1, finally{}.
,
.
. 21.2.
21.
533
, catch(){},
, , ,
. ""
.
, "" . ? 21.2, f(). 21.3.
21.3.
class SimpleExt2{
private static void f(int n){
System.out.println(" 10 / n = " + (10 / n));
}
public static void main(String[] args){
try{
int n = Integer.parseInt(args[0]);
System.out.println("After parseInt()");
f(n);
System.out.println("After results output");
}catch(ArithmeticException ae){
System.out.println("From Arithm.Exc. catch: " + ae);
}catch(ArrayIndexOutOfBoundsException arre){
System.out.println("From Array.Exc. catch: " + arre);
}finally{
System.out.println("From finally");
}
System.out.println("After all actions");
}
}
21.3, ,
, , . 21.2. ,
f(), "" , "" main(), .
1. , .
2. .
throws
, , (throws) , throws
:
534
IV. Java
21.3? , JLS
(checked), , , (unchecked).
throws.
.
, RuntimeException , ArithmeticException, , throws .
Error .
? , RuntimeException ,
. Error,
.
, , , .
, .
, throws. main() 21.1,
, ,
RuntimeException, :
public static void main(String[] args)
throws ArithmeticException, ArrayIndexOutOfBoundsException{
//
}
f()
, 21.4. . 21.3.
21.4.
class SimpleExt3{
private static void f(int n){ // throws ArithmeticException{
try{
System.out.println(" 10 / n = " + (10 / n));
System.out.println("From f() after results output");
}catch(ArithmeticException ae){
System.out.println("From f() catch: " + ae);
//
throw ae;
}finally{
System.out.println("From f() finally");
}
}
21.
535
,
ArithmeticException main().
try{}catch(){} f()
, main().
throw ae. 21.4 . //,
, .
, , throws, . , .
. 21.3.
536
IV. Java
throw
: throw . throw, :
throw new ArithmeticException();
. -
, ,
ArithmeticException.
catch(){} , , . , catch ( multicatch) , - .
. 21.2, 21.5.
21.5.
class SimpleExt4{
public static void main(String[] args){
try{
int n = Integer.parseInt(args[0]);
System.out.println("After parseInt()");
System.out.println(" 10 / n = " + (10 / n));
System.out.println("After results output");
}catch(RuntimeException ae){
System.out.println("From Run.Exc. catch: " + ae);
}finally{
System.out.println("From finally");
}
System.out.println("After all actions");
}
}
21.5 catch(){} ,
RuntimeException. . 21.4, . ?
RuntimeException.
, -, .
-.
21.
537
. 21.4.
-
- Throwable
Object.
Throwable :
Throwable() ;
Throwable(String message) -
message.
getMessage().
, null.
toString() , .
, "" :
printStackTrace() , , -
;
printStackTrace(PrintStream stream) stream;
printStackTrace(PrintWriter stream) stream.
538
IV. Java
throw. Error - .
-, , Error.
-, Exception,
, .
throw. - , . Java SE API.
- . -,
Exception .
- RuntimeException
Exception. , JVM, , . ,
, JVM,
, . , throws.
-, , Exception.
catch(){} .
.
21.2 catch(){},
. , - ArithmeticException ArrayIndexOutOfBoundsException . , catch(){} , . 21.5 , RuntimeException, ,
:
try{
// ,
}catch(RuntimeException re){
// -
}catch(ArrayIndexOutOfBoundsException ae){
// !
}
,
RuntimeException catch(){}. , ,
ArrayOutOfBoundsException , RuntimeException.
3. , .
21.
539
21.5 RuntimeException. ArithmeticException ArrayIndexOutOfBoundsException . RuntimeException
, catch(){}.
Java SE 7 , multi-catch.
ArithmeticException ArrayIndexOutOfBoundsException,
catch ( ). 21.6.
21.6.
class SimpleExt5{
public static void main(String[] args){
try{
int n = Integer.parseInt(args[0]);
System.out.println("After parseInt()");
System.out.println(" 10 / n = " + (10 / n));
System.out.println("After results output");
}catch(ArithmeticException | ArrayIndexOutOfBoundsException ae){
System.out.println("From two Exceptions catch: " + ae);
}finally{
System.out.println("From finally");
}
System.out.println("After all actions");
}
}
, , , , :
.
, , , , , .
-.
Exception .
-. , , Exception. , toString() getMessage().
. handle(int cipher)
09, cipher int.
, cipher 09.
IV. Java
540
, , Exception.
,
- . ,
CipherException, Exception. CipherException, 21.7, ExceptDemo. . 21.5 .
21.7. -
class CipherException extends Exception{
private String msg;
CipherException(){ msg = null; }
CipherException(String s){ msg = s; }
public String toString(){
return "CipherException (" + msg + ")";
}
}
public class ExceptDemo{
static public void handle(int cipher) throws CipherException{
System.out.println("handle()'s beginning");
if (cipher < 0 || cipher > 9)
throw new CipherException("" + cipher);
System.out.println("handle()'s ending");
}
public static void main(String[] args){
try{
handle(1);
handle(10);
}catch(CipherException ce){
System.out.println("caught " + ce);
ce.printStackTrace();
}
}
}
. 21.5.
21.
541
. Java SE , , , .
, ,
. , KISS.
, finally{}
. , ,
try{}? .
1. -
, , ?
2. ?
3. return?
4. ?
5. catch(){}?
6. finally{}?
7. , ,
throws?
8. ?
9. -?
22
(process).
, , .
(runnable) ,
, .
, "" (sleep) , . .
.
(multitasking), . , , , , .
, .
,
, . "" (ticks). 0,01 .
(priority).
,
, , " ". , (scheduler), . ,
, .
.
, (context).
, .
- . MS Windows , . , . .
22.
543
UNIX ,
.
: , .
.
, .
threads.
. "", . thread "", /. "", "-".
" ", ,
Solaris, thread lightweight process. "".
,
, .
,
Java . , Java, ,
.
Java
, . (main)
- , main() . , ,
, . . , .
, .
,
- (enum) Thread.State,
Thread:
NEW , ;
RUNNABLE ;
BLOCKED ;
WAITING ;
TIMED_WAITING ;
TERMINATED .
Thread.State.
Java Thread.
start().
544
IV. Java
Thread.currentThread();
getState(),
Thread.State.
Thread Runnable, run().
, . ,
Thread run(), Thread , . run() .
run() , .
, . run() ,
,
.
Java start().
. JDK java.util.concurrent,
java.util.concurrent.atomic, java.util.concurrent.locks, , .
Callable, call().
run() call() Exception. call()
Future, get()
call() . isDone(). call() cancel(),
isCancelled().
Future ForkJoinTask, ,
adapt(), .
Runnable, Runnable Future RunnableFuture.
RunnableFuture FutureTask, Runnable Callable.
,
Runnable, Executor. execute(Runnable), , execute(Runnable) .
.
Executor
ExecutorService. submit() Runnable
Callable Future, .
22.
545
ExecutorService . AbstractExecutorService,
newTaskFor(),
submit().
AbstractExecutorService ThreadPoolExecutor, , ForkJoinPool,
ForkJoinTask, Runnable Callable execute(), invoke() submit().
, ,
, .
Executor 26.8.
,
,
. ,
.
, , . java.util.concurrent RecursiveTask
RecursiveAction. compute(),
.
ForkJoinPool, ForkJoinTask RecursiveAction
Java SE, $JAVA_HOME/sample/forkjoin/mergesort.
, java.util.concurrent Executors,
, ExecutorService .
, : Thread, Runnable, Executor
. Thread . , run() , , - . .
, Thread.
Thread
Thread . ,
Thread(ThreadGroup group, Runnable target, String name, long stackSize);
name, group
run() target. , stackSize, .
,
null:
Thread() run();
Thread(Runnable target);
546
IV. Java
name ,
Java .
start().
Java run() -.
run(). - null.
sleep(long ms);
ms . . ,
sleep(long ms, int nanosec);
22.
547
. 22.1 22.1. ,
Thread 1
.
Thread 1 , Thread 2,
, Thread 1 .
22.1 , 0,1 . InterruptedException ,
. . 22.2 . , ,
.
. 22.1.
. 22.2.
, , (synchronization) ? ,
.
548
IV. Java
22.2 : TwoThreads2
Thread, run() .
22.2. Thread
class TwoThreads2 extends Thread{
private String msg;
TwoThreads2(String s, String name){
super(name); msg = s;
}
public void run(){
for(int i = 0; i < 20; i++){
try{
Thread.sleep(100);
}catch(InterruptedException ie){}
System.out.print(msg + " ");
}
System.out.println("End of " + getName());
}
public static void main(String[] args){
new TwoThreads2("HIP", "Thread 1").start();
new TwoThreads2("hop", "Thread 2").start();
System.out.println();
}
}
: TwoThreads3 Runnable.
22.3. Thread,
TwoThreads3 . , , Applet JApplet.
22.3. Runnable
class TwoThreads3 implements Runnable{
private String msg;
TwoThreads3(String s){ msg = s; }
public void run(){
for(int i = 0; i < 20; i++){
try{
Thread.sleep(100);
}catch(InterruptedException ie){}
System.out.print(msg + " ");
}
System.out.println("End of thread.");
}
22.
549
,
: ,
, . run()
, , - null.
22.4 ,
run() , - th go, . stop(), .
, Java SE JDK. -, 1 .
22.4.
class TwoThreads5 implements Runnable{
private String msg;
private Thread go;
TwoThreads5(String s){
msg = s;
go = new Thread(this);
go.start();
}
public void run(){
Thread th = Thread.currentThread();
while(go == th){
try{
Thread.sleep(100);
}catch(InterruptedException ie){}
System.out.print(msg + " ");
}
System.out.println("End of thread.");
}
public void stop(){ go = null; }
public static void main(String[] args){
TwoThreads5 th1 = new TwoThreads5("HIP");
TwoThreads5 th2 = new TwoThreads5("hop");
try{
Thread.sleep(1000);
}catch(InterruptedException ie){}
IV. Java
550
th1.stop(); th2.stop();
System.out.println();
}
}
, ,
.
,
numDep. ,
:
Deposit myDep = getDeposit(numDep); // numDep
int rest = myDep.getRest();
// myDep
rest += sum;
// sum
myDep.setRest(rest); // myDep
1000 . 500 ,
1500 .
, myDep numDep.
. 22.1 22.2, , . 1000 500,
1000 + 1500 = 2500 ,
setRest()
500 . .
Java ,
(monitor). , ,
, , . myDep,
. ,
, myDep.
synchronized(){}, :
Deposit myDep = getDeposit(numDep);
synchronized(myDep){
int rest = myDep.getRest();
rest += sum;
myDep.setRest(rest);
}
synchronized ,
.
, . .
22.
551
- , synchronized
, synchronized,
(synchronized):
synchronized int getRest(){
//
}
synchronized void setRest(int rest){
//
}
. 22.3.
22.5.
class TwoThreads4 implements Runnable{
public void run(){
//
synchronized public void run(){
System.out.print("Hello, ");
try{
Thread.sleep(1000);
}catch(InterruptedException ie){}
552
IV. Java
System.out.println("World!");
}
public static void main(String[] args){
TwoThreads4 th = new TwoThreads4();
new Thread(th).start();
new Thread(th).start();
}
}
, ,
(critical section) . , , . , , .
Java 2 JDK . ,
. 22.1 , .
, print() PrintStream , System.out , print()
.
, synchronized(){}. (mutually exclusive) .
, ?
Java (wait-notify).
Java
. wait() notify(), , , (notify) . Object .
,
(wait set). " " .
wait(long millisec) this, , millisec " ", .
, ,
. millisec ,
notify(), . millisec 0,
,
notify().
22.
553
sleep() , wait()
. " ", , , Java
Language Specification.
, wait(), wait(0). , wait(long millisec,
int nanosec), nanosec , .
notify() " " , . notifyAll() . .
? ,
.
"-", 20.
, , , , ,
. st Store.
. ,
st, ,
.
Store ,
.
22.6 Store . . 22.4.
22.6.
class Store{
private int inform;
synchronized public int getInform(){ return inform; }
synchronized public void setInform(int n){ inform = n; }
}
class Producer implements Runnable{
private Store st;
private Thread go;
Producer(Store st){
this.st = st;
go = new Thread(this);
go.start();
}
public void run(){
int n = 0;
Thread th = Thread.currentThread();
IV. Java
554
Wwile (go == th){
st.setInform(n);
System.out.print("Put: " + n + " ");
n++;
}
}
public void stop(){ go = null; }
}
class Consumer implements Runnable{
private Store st;
private Thread go;
Consumer(Store st){
this.st = st;
go = new Thread(this);
go.start();
}
public void run(){
Thread th = Thread.currentThread();
while (go == th) System.out.println("Got: " + st.getInform());
}
public void stop(){ go = null; }
}
class ProdCons{
public static void main(String[] args){
Store st = new Store();
Producer p = new Producer(st);
Consumer c = new Consumer(st);
try{
Thread.sleep(30);
}catch(InterruptedException ie){}
p.stop(); c.stop();
}
}
. 22.4.
22.
555
. 22.5.
556
IV. Java
22.
557
Java , . - . .
Thread , :
NORM_PRIORITY , , 5;
IV. Java
558
MIN_PRIORITY , 1;
MAX_PRIORITY , 10.
1 10,
, , , .
sleep() .
. checkAccess(), SecurityException,
.
setPriority(int newPriority) ,
, -.
, , , NORM_PRIORITY. , - ,
, MAX_PRIORITY. , , , MIN_PRIORITY.
-
main() .
,
.
. , . ,
, .
. , - , , . ,
, ,
.
, (daemons).
UNIX.
(user) ,
.
Java.
, .
setDaemon(true). checkAccess()
SecurityException.
.
, , . setDaemon(false).
22.
559
. Java main.
.
,
. ThreadGroup
ThreadGroup(String name);
, name. Thread. , .
.
.
. , setMaxPriority(int maxPri) ThreadGroup.
maxPri, , maxPri, .
Java , threads.
, Java, ,
. , , , .
, , , , .
1. ?
2. , , ?
3. Java ?
4. ?
5. ?
6. ?
7. "" ?
8. Java?
23
/
, , , .
, , . , .
/,
Java (stream). , (input stream) Unicode ,
read(). write() print(), println()
(output stream) . ,
: , , , write()
print() .
, "" , . read(), write(), print(),
println() , ,
.
, / . Java - /,
, .
System in, out err.
,
. (stdin), (stdout) (stderr).
.
out err PrintStream,
. print(), println()
write(), PrintStream
.
err : ,
- .
, log-, -
23. /
561
. Java . , ,
.
in InputStream.
, read(). InputStream ,
- .
/, Java ,
, , . . . , ,
String, - . , (pipe) .
, Java. , . (serialization) .
java.io.
, , java.io , ,
, .
, java.io,
.
, Java , . ,
Object:
Reader ,
;
Writer ,
;
InputStream ;
OutputStream .
Reader InputStream :
read() , , -
int; , 1;
read(char[] buf) buf -
; InputStream byte[] ; 1,
;
read(char[] buf, int offset, int len)
562
IV. Java
byte[];
write(char[] buf, int offset, int len) len buf,
offset;
write(int elem) Writer 16, OutputStream 8 -
elem .
Writer :
write(String s) s ;
write(String s, int offset, int len) len s,
offset;
Writer append(char c) ,
;
Writer append(CharSequence seq) -
;
Writer append(CharSequence seq, int offset, int len) len -
seq, offset.
Writer OutputStream .
, , , . ,
. flush(),
.
, close().
, , close(), Closeable. Java
try{}catch(){}
close() , .
, Autoloseable.
Closeable Autoloseable, Closeable .
try(){}catch(){} 23.4.
23. /
563
. 23.1.
. 23.2.
, /, . 23.1 23.2.
java.io : ,
(data sink), , (data processing).
, , , :
, , :
FileReader
FileWriter
FileInputStream
FileOutputStream
, , :
CharArrayReader
CharArrayWriter
ByteArrayInputStream
ByteArrayOutputStream
, :
PipedReader
PipedWriter
PipedInputStream
PipedOutputStream
, , :
StringReader
StringWriter
, Java:
ObjectInputStream
ObjectOutputStream
, .
IV. Java
564
, , , . " ", .
:
FilterReader
FilterWriter
FilterInputStream
FilterOutputStream
. , /.
,
. .
/:
BufferedReader
BufferedWriter
BufferedInputStream
BufferedOutputStream
, Java,
:
DataInputStream
DataOutputStream
,
:
PushbackReader
PushbackInputStream
, :
PrintWriter
PrintStream
:
InputStreamReader ;
OutputStreamWriter .
StreamTokenizer
(tokens) , StringTokenizer,
5, .
SequenceInputStream,
, , , LineNumberReader, ""
.
'\n' / '\r'.
RandomAccessFile, .
,
.
Console, , /, .
/ , ,
. .
23. /
565
/
println() PrintStream, . out System, PrintStream. Java .
, System.out.println(),
System.out, :
PrintStream pr = System.out;
pr.println().
, Unicode . Latin 1 '\u0000'
'\u00FF'
'0x00''0xFF'. , '\u0400''\u04FF'
Unicode,
, .
5.
, , . MS Windows. CP1251,
CP866.
PrintStream, , PrintWriter " " Unicode
System.out, ,
OutputStreamWriter. ,
CP866. :
PrintWriter pw = new PrintWriter(
new OutputStreamWriter(System.out, "Cp866"), true);
PrintWriter . true
println(). print() ! print()
flush().
PrintWriter , print()
. flush().
PrintWriter,
PrintStream, , ,
pw.println(" ");
23.1 . 23.3.
IV. Java
566
, PrintWriter, ,
OutputStreamWriter
.
read() InputStream in System. C , scan-
. Unicode
, .
BufferedReader, " "
InputStreamReader:
BufferedReader br = new BufferedReader(
new InputStreamReader(System.in, "Cp866"));
23. /
567
pw.println(s);
}while(!s.equals("q"));
}catch(Exception e){
System.out.println(e);
}
}
}
. 23.3. System.out. ,
.
, CP866.
" :" "" <Enter>. "". <Enter>,
.
. . '\n' '\r',
<Enter>. (glyph).
<Ctrl>+<Z>. "^Z"
, .
.
" :" " " ,
<Enter>, s. s
.
q <Enter>.
. 23.3. /
IV. Java
568
Java , . printf(),
- :
, .
JDK 1.5 printf(), ,
PrintStream PrintWriter. ,
format(), .
Formatter, java.util .
/ PrintStream :
PrintStream
PrintStream
PrintStream
PrintStream
PrintWriter
PrintWriter.
, ,
, , Locale.
, .
format , , ,
. , ,
System.out.printf("x = %d, y = %d\n", x, y);
"x = , y = \n",
. "%d".
,
. , . . x, , y, . . ,
, , :
System.out.printf(" %d%% \n", x);
, , MissingFormatArgumentException, , ,
" " , .
, , : %1$d, %2$d, %3$d.
,
System.out.printf("x = %2$d, y = %1$d\n", x, y);
23. /
569
y, x.
, :
System.out.printf("x = %2$d, y = %2$d\n", x, y);
,
a, A, b, B, c, C, d, e, E, f, g, G, h, H, n, o, s, S, t, T, x, X, . d, , ,
.
, ,
. , , , .
d ,
, %10d %2$10d. ,
10 , .
, 10 , ,
.
: %-10d, %2$-10d,
, .
,
: %010d, %2$010d.
: , , . %,10d, %2$,10d,
, ,
.
.
, %+10d, %2$+10d, , - . , , . .
d . o , x X
. x, , d2cf10,
X , D2CF10.
o, x, X
BigInteger, . "" (#). ,
0x 0X,
Java.
570
IV. Java
a, A, e, E, f, g, G. f , e E . E. g, G ,
.
, .
. ,
%.8f, %2$.6e, %+10.5E, %2$-10.4g, %2.5G. 6 .
a, A . .
Unicode.
. : %c, %2$6c, %-10C, %2$-3.
s, S .
, toString().
, null.
. S, .
: %s, %2$6S, %-10s, %2$-50S.
b, B true false.
. B, : TRUE, FALSE. : %b, %2$6B, %-10b, %2$-3b.
-
h, H - .
h, ,
H, .
. : %h, %2$6H,
%-10h, %2$-3h.
t, T .
23. /
571
long Long,
Calendar Date.
t T , : , , , . . ,
System.out.printf(" : %tT\n", Calendar.getInstance());
, , .
12:36:14.
, %ts ,
1 1970 (Epoch), %tQ ,
.
10/24/11 %tD, 2011-10-24
%tF. , .
24.10.11
System.out.printf(" %1$td.%1$tm.%1$ty\n", Calendar.getInstance());
%td , : 01.
, %te.
%ty .
%tY.
, , %tB,
%tb %th.
%tA,
%ta.
, , %tc.
Console
, -
. Java SE 6 java.io Console, .
,
Java, Console
console() System, :
Console cons = System.console();
572
IV. Java
public String readLine();
public String readLine(String format, Object... args);
public char[] readPassword();
public char[] readPassword(String format, Object... args);
null, , , <Ctrl>+<D>
UNIX <Ctrl>+<Z> MS Windows.
,
Reader reader();
Reader, .
Console printf(String format, Object... args);
, PrintWriter:
PrintWriter writer();
,
void flush();
1. "" , . .
2. "25 2011 ",
.
/
, /
FileInputStream FileOutputStream. , -, , , .
, .
Unicode,
23. /
573
.
.
.
, java.io FileReader
FileWriter. :
, . ,
InputStreamReader OutputStreamWriter , , " " .
, /
.
String File. ,
. :
FileInputStream fis = new FileInputStream("PrWr.java");
FileReader fr = new FileReader("D:\\jdk1.7.0\\src\\PrWr.java");
FileNotFoundException,
FileWriter IOException.
FileWriter FileOutputStream
, , . , .
true, , false,
. :
FileWriter fw = new FileWriter("ch23.txt", true);
FileOutputStream fos = new FileOutputStream("D:\\samples\\newfile.txt");
!
, , .
:
fis.read(); fr.read();
:
fos.write((char)c); fw.write((char)c);
close().
FileReader FileWriter .
FileReader, FileInputStream.
, ,
" " , , :
InputStreamReader isr = new InputStreamReader(fis, "KOI8_R"));
fis .
574
IV. Java
/, ,
. ,
, , .
File,
. Java
NIO2.
.
File,
File(String filename);
23. /
575
renameTo(File newName)
delete(). true,
.
, createNewFile(), true, ,
, false, .
createTempFile(String prefix, String suffix, File tmpDir);
createTempFile(String prefix, String suffix);
. 23.4.
23.2.
import java.io.*;
class FileTest{
IV. Java
576
NIO2
, Java , java.nio.file, java.nio.file.attribute
java.nio.file.spi.
, .
FileSystem, .
FileSystems.
, getDefault()
FileSystems.
Path, get()
Paths, ,
getPath() FileSystem, .
, . get()
, URI.
, :
Path path = Paths.get("pub/file.txt");
Path path = Paths.get("C:\\docs\\pub\\file.txt");
Path , .
23. /
577
getName(), getParent(),
getRoot(). , iterator() . Path.
Path. ,
for (Path name: path) System.out.println(name);
Files.
, .
Files File,
Path.
File, , , exists() notExists().
, , , , ,
isRegularFile(Path), isDirectory(Path), isSymbolicLink(Path), isHidden(Path).
isReadable(Path), isWritable(Path),
isExecutable(Path).
createFile() createDirectory(), copy(), move(), delete(Path) deleteIfExists(Path).
, , , ,
, BasicFileAttributes,
DosFileAttributes PosixFileAttributes.
readAttributes(Path, Class) Files. BasicFileAttributes ,
. size(), creationTime(),
lastAccessTime(), lastModifiedTime(), isRegularFile(), isDirectory(), isSymbolicLink().
setLastModifiedTime() Files.
setAttribute().
UserPrincipal
getOwner(Path) Files. setOwner(Path,
UserPrincipal).
, , . Files DirectoryStream<Path> newDirectoryStream().
:
DirectoryStream<Path> dir = Files.newDirectoryStream(path);
for (Path p: dir) System.out.println(p);
578
IV. Java
newDirectoryStream() NotDirectoryException,
path , . , .
,
newDirectoryStream() ,
DirectoryStream.Filter. , newInputStream() newOutputStream()
Files .
, readAllBytes(Path), .
, readAllLines(), List<String>.
write().
NIO2 23.4.
Java SE,
$JAVA_HOME/sample/nio.
/
/ . , .
, ,
.
, .
, . , . , ,
.
/ . BufferedXxx, .
/ " ", :
BufferedReader br = new BufferedReader(isr);
BufferedWriter bw = new BufferedWriter(fw);
isr fw .
23.3 , CP866,
KOI8-R. .
args[0], args[1].
23.3. /
import java.io.*;
class DOStoUNIX{
23. /
579
/
.
. Java
java.nio.* (New Input-Output, NIO), /. , , . Java NIO ,
NIO2.
, NIO, Buffer. :
capacity(), position(),
reset() rewind() .
Buffer ByteBuffer, CharBuffer, ShortBuffer, IntBuffer, LongBuffer, FloatBuffer
DoubleBuffer. get()
put() . ,
, .
,
java.nio.channels java.nio.channels.spi. Channel. . : isOpen() close(). ,
.
ReadableByteChannel,
WritableByteChannel, GatheringByteChannel, ScatteringByteChannel Channel. , read(ByteBuffer), , write(ByteBuffer),
. , ByteChannel,
ReadableByteChannel WritableByteChannel. SeekableByteChannel,
position(), size() trancate(),
IV. Java
580
/ AsynchronousChannel AsynchronousByteChannel.
java.nio.channels AsynchronousFileChannel,
AsynchronousSocketChannel, AsynchronousServerSocketChannel.
Java SE, SJAVA_HOME/sample/nio/chatserver, chat-,
/.
(final) Channels.
InputStream, OutputStream, Reader Writer,
ReadableByteChannel WritableByteChannel.
, Files newByteChannel(),
SeekableByteChannel.
Channels , . . / FileChannel. FileInputStream FileOutputStream,
getChannel() FileChannel
FileChannel.
23.4 /.
23.4. NIO2
import
import
import
import
import
import
java.nio.*;
java.nio.channels.*;
java.nio.file.*;
java.nio.file.attribute.*;
java.util.*;
java.io.*;
23. /
581
}catch(IOException ie){
ie.printStackTrace();
}
}
try(FileChannel fc = (FileChannel)Files.newByteChannel(
path, StandardOpenOption.READ,
StandardOpenOption.WRITE)){
ByteBuffer buf = ByteBuffer.allocate((int)fc.size());
int n = fc.read(buf);
System.out.println("n = " + n);
byte[] arr = new byte[n];
buf.position(0);
buf.get(arr);
for(byte b: arr)
System.out.print((char)b);
}catch(IOException ie){
ie.printStackTrace();
}
}
}catch(Exception e){
e.printStackTrace();
}
}
}
, / Java NIO2
,
.
1. Files.readAllBytes(Path), Files.readAllLines(Path, Charset),
Files.write(Path, byte[]) .
2. Files.newBufferedReader(Path, Charset), Files.newBufferedWriter(Path, Charset)
/ BufferedReader
BufferedWriter.
3. Files.newInputStream(Path), Files.newOutputStream(Path)
/ InputStream OutputStream.
4. Files.newByteChannel()
SeekableByteChannel.
5. , , . " ", FileChannel,
.
3. , , .
4. , .
582
IV. Java
Java
DataOutputStream Java
writeBoolean(boolean b), writeByte(int b), writeShort(int h), writeChar(int c),
writeInt(int n), writeLong(long l), writeFloat(float f), writeDouble(double d).
, writeBytes(String s) s ,
Unicode,
writeChars(String s) s ,
Unicode, , writeChar().
writeUTF(String s) s
UTF-8. .
UTF-8
, Unicode . UTF-8 (Universal Transfer Format) .
, .
Unicode '\u0000''\u007F', , , .
Unicode '\u0080''\u07FF', , : Unicode 00000xxxxxyyyyyy
110xxxxx10yyyyyy.
Unicode '\u0800''\uFFFF' : Unicode xxxxyyyyyyzzzzzz 1110xxxx10yyyyyy10zzzzzz.
,
, .
, writeUTF(String s) , , , s UTF-8, . readUTF() DataInputStream.
DataOutputStream
DataInputStream InputStream, Java, . , , DataOutputStream.
readBoolean(), readByte(), readShort(), readChar(), readInt(), readLong(), readFloat(),
readDouble(), .
, readUnsignedByte() readUnsignedShort() int,
, .
23. /
583
. 23.5.
IV. Java
584
, IOException, 23.5
.
, Java, , , FileChannel java.nio.channels
RandomAccessFile java.io. .
, , .
FileChannel ,
NIO, , Path
:
Path path = Paths.get("pub/file.txt");
FileChannel fc = (FileChannel)Files.newByteChannel(path,
StandardOpenOption.READ,
StandardOpenOption.WRITE);
, StandardOpenOption
, .
APPEND, CREATE, CREATE_NEW, TRANCATE_EXISTING, DELETE_ON_CLOSE,
SPARSE, SYNC, DSYNC.
Path
open(), ,
FileChannel
FileChannel
FileInputStream FileOutputStream, RandomAccessFile
getChannel():
RandomAccessFile ras = new RandomAccessFile("pub/file.txt", "rw");
FileChannel fc = ras.getChannel();
, RandomAccessFile .
RandomAccessFile(File file, String mode);
RandomAccessFile(String fileName, String mode);
, mode, .
"r" , "rw" ,
"rwd" "rws" , .
.
DataInputStream DataOutputStream, ,
readLine() .
23. /
585
0, . (file pointer) .
. ,
0.
. pos
seek(long pos). seek(0) .
getFilePointer().
RandomAccessFile
, .
FileChannel position(), position(long pos).
FileChannel read() write().
, ByteBuffer,
.
:
ByteBuffer buf = ByteBuffer.allocate((int)fc.size());
int n = fc.read(buf);
byte[] arr = new byte[n];
buf.position(0);
buf.get(arr);
for (byte b: arr) System.out.print((char)b);
fc.close();
5. 4 .
,
. java.io PipedXxx, .
PipedWriter+ PipedOutputstream,
write() .
PipedReader PipedInputStream. -
connect()
read().
.
(pipe) . ,
. , .
IV. Java
586
, .
23.6 run() Source , k, pw.write(k). run() Target
pr.read(). Target. . 23.6
.
. 23.6. ,
23.6.
import java.io.*;
class Target extends Thread{
private PipedReader pr;
Target(PipedWriter pw){
try{
pr = new PipedReader(pw);
}catch(IOException e){
System.err.println("From Target(): " + e);
}
}
PipedReader getStream(){ return pr;}
public void run(){
while(true)
try{
System.out.println("Reading: " + pr.read());
}catch(IOException e){
System.out.println("The job's finished.");
23. /
587
System.exit(0);
}
}
}
class Source extends Thread{
private PipedWriter pw;
Source(){
pw = new PipedWriter();
}
PipedWriter getStream(){ return pw;}
public void run(){
for (int k = 0; k < 10; k++)
try{
pw.write(k);
System.out.println("Writing: " + k);
}catch(Exception e){
System.err.println("From Source.run(): " + e);
}
}
}
class PipedPrWr{
public static void main(String[] args){
Source s = new Source();
Target t = new Target(s.getStream());
s.start(); t.start();
}
}
ObjectInputStream ObjectOutputStream
, , , DataInputStream
DataOutputStream .
, ObjectXxx ,
. ,
, / .
(serialization),
(deserialization).
, , , private- , , , -
588
IV. Java
, .
, ,
Serializable. , .
.
class A implements Serializable{...}
, .
Java, .
ObjectOutputStream, ,
writeObject():
MyClass mc = new MyClass("abc", -12, 5.67e-5);
int[] arr = {10, 20, 30};
ObjectOutputStream oos = new ObjectOutputStream(
new FileOutputStream("myobjects.ser"));
oos.writeObject(mc);
oos.writeObject(arr);
oos.writeObject("Some string");
oos.writeObject(new Date());
oos.flush();
, , ,
. - .
, ,
, - , . writeObject() . , , ,
.
, , Serializable,
NotSerializableException . J2SE JDK . , . , java.awt.Component Serializable, , .
, , java.awt.Toolkit.
. Serializable , Java " ".
, :
ObjectInputStream ois = new ObjectInputStream(
new FileInputStream("myobjects.ser"));
23. /
MyClass mc1
int[] a
String s
Date d
=
=
=
=
589
(MyClass)ois.readObject();
(int[])ois.readObject();
(String)ois.readObject();
(Date)ois.readObject();
.
23.7 GregorianCalendar , date.ser, . . 23.7.
23.7.
import java.io.*;
import java.util.*;
class SerDate{
public static void main(String[] args) throws Exception{
GregorianCalendar d = new GregorianCalendar();
ObjectOutputStream oos = new ObjectOutputStream(
new FileOutputStream("date.ser"));
oos.writeObject(d);
oos.flush();
oos.close();
Thread.sleep(3000);
ObjectInputStream ois = new ObjectInputStream(
new FileInputStream("date.ser"));
GregorianCalendar oldDate = (GregorianCalendar)ois.readObject();
ois.close();
GregorianCalendar newDate = new GregorianCalendar();
System.out.println("Old time = " +
oldDate.get(Calendar.HOUR) + ":" +
oldDate.get(Calendar.MINUTE) + ":" +
oldDate.get(Calendar.SECOND) + "\nNew time = " +
newDate.get(Calendar.HOUR) + ":" +
newDate.get(Calendar.MINUTE) + ":" +
newDate.get(Calendar.SECOND));
}
}
. 23.7.
590
IV. Java
- ,
transient, :
transient MyClass mc = new MyClass("abc", -12, 5.67e-5);
writeObject() , static
transient. , , writeObject()
.
, / .
, Serializable,
Externalizable, readExternal() writeExternal(),
/.
. , Java Object Serialization Specification,
Java SE docs/platform/serialization/spec/.
docs/technotes/guides/serialization/examples/ ,
.
Java
,
. Java
AWT Java 2D. , javax.print.*
, .
Graphics " ". Graphics,
PrintGraphics
PrintJob, java.awt.
Toolkit java.awt.
:
PrintJob pj = getToolkit().getPrintJob(this, "Job Title", null);
Graphics pg = pj.getGraphics();
getPrintJob() (Print) .
K, pj.
(Cancel), null.
Toolkit getPrintJob():
getPrintJob(Frame frame, String jobTitle, JobAttributes jobAttr,
PageAttributes pageAttr);
getPrintJob(Frame frame, String jobTitle, Properties prop);
23. /
591
, null, .
jobAttr . JobAttributes,
, . , , .
, , .
pageAttr . PageProperties
,
. , .
, . Java 2D , .
" " pg Graphics ,
print(pg) printAll(pg) Component.
paint(pg).
, .
, ,
paint(pg) pg.drawString() ,
9. , " "
, pg.setFont().
print() pg.dispose(),
, pj.end(), .
23.8 , paint(). : , , .
simplePrint().
23.8. AWT
import java.awt.*;
import java.awt.event.*;
class PrintTest extends Frame{
PrintTest(String s){
super(s);
setSize(400, 400);
setVisible(true);
}
public void simplePrint(){
PrintJob pj =
getToolkit().getPrintJob(this, "Job Title", null);
if (pj != null){
Graphics pg = pj.getGraphics();
if (pg != null){
print(pg);
IV. Java
592
pg.dispose();
}else System.err.println("Graphics's null");
pj.end();
}else System.err.println("Job's null");
}
public void paint(Graphics g){
g.setFont(new Font("Serif", Font.ITALIC, 30));
g.setColor(Color.black);
g.drawArc(100, 100, 200, 200, 0, 360);
g.drawString(" 1", 100, 100);
}
public static void main(String[] args){
PrintTest pt = new PrintTest(" ");
pt.simplePrint();
pt.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent ev){
System.exit(0);
}
});
}
}
Java 2D
Java 2D
, java.awt.print.
AWT. ,
. , , , ,
AWT.
AWT, Java 2D , Graphics
Graphics2D.
Java 2D, ,
, , (page painter).
Printable.
print(). , , .
print() int :
print(Graphics g, PageFormat pf, int ind);
g , ,
pf PageFormat, , ind , .
print() , , paint(), AWT. , , Frame paint(). Graphics Graphics2D
print().
23. /
593
, print() , PAGE_EXISTS.
print() . ind 1.
ind , print()
NO_SUCH_PAGE, .
, paint()
. ind ,
print() .
PageFormat . 1/72 ,
:
PORTRAIT , Ox
, Oy ;
LANDSCAPE , Ox , Oy
;
REVERSE_LANDSCAPE , Ox ,
Oy .
, ,
(imageable area), getImageableX() getImageableY(),
getImageableWidth() getImageableHeight().
,
drawString(), 23.10.
PageFormat(),
, .
, , Java,
: " ?" :
" ".
pageDialog(PageDialog pd)
(Page Setup) , , pd.
(Cancel), pd; K, . pd .
.
, Paper :
Paper p = new Paper();
p.setSize(double width, double height);
p.setImageableArea(double x, double y, double width, double height);
594
IV. Java
PageFormat :
PageFormat pf = new PageFormat();
pf.setPaper(p);
pageDialog()
, (silent) . , " " .
, , print() . (print job) , ,
, . PrinterJob.
Java 2D .
Printable Job , ,
, , .
, Pageable Job
, ,
. , , , , . Book ,
Pageable.
Book, -, , :
Book b = new Book();
, .
Book :
append(Printable p, PageFormat pf) p ;
append(Printable p, PageFormat pf, int numPages) numPages p
; ,
UNKNOWN_NUMBER_OF_PAGES.
, . . PrinterJob,
setPrintable(Printable pr), setPrintable(Printable pr, PageFormat pf) setPageble(Pageable pg).
pr, .
(Print) ,
printDialog(). .
true, K, false
(Cancel).
, 1, setCopies(int n),
.
defaultPage() PrinterJob
PageFormat .
PageFormat.
23. /
595
, PrinterJob. , ,
getPrinterJob(), PrinterJob.
print() PrinterJob. . print(g, pf, ind) ,
, .
23.9. Java 2D
, 23.8. . 6.
, System.exit(0).
23.9. Java 2D
import java.awt.*;
import java.awt.geom.*;
import java.awt.print.*;
class Print2Test implements Printable{
public int print(Graphics g, PageFormat pf, int ind)
throws PrinterException{
// 5 .
if (ind > 4) return Printable.NO_SUCH_PAGE;
Graphics2D g2 = (Graphics2D)g;
g2.setFont(new Font("Serif", Font.ITALIC, 30));
g2.setColor(Color.black);
g2.drawString("Page " + (ind + 1), 100, 100);
g2.draw(new Ellipse2D.Double(100, 100, 200, 200));
return Printable.PAGE_EXISTS;
}
public static void main(String[] args){
// 1. .
PrinterJob pj = PrinterJob.getPrinterJob();
// 2. " ".
PageFormat pf = pj.pageDialog(pj.defaultPage());
// 3. , , ,
//
.
pj.setPrintable(new Print2Test(), pf);
// 4. , :
pj.setCopies(2);
// .
// 5. "" ()
if (pj.printDialog()){
// ...
try{
pj.print();
// print(g, pf, ind).
}catch(Exception e){
System.err.println(e);
}
}
IV. Java
596
// 6. .
System.exit(0);
}
}
drawString().
.
23.10 ,
. , , .
.
23.10.
import java.awt.*;
import java.awt.print.*;
import java.io.*;
public class Print2File{
public static void main(String[] args){
if (args.length < 1){
System.err.println("Usage: Print2File path");
System.exit(0);
}
PrinterJob pj = PrinterJob.getPrinterJob();
PageFormat pf = pj.pageDialog(pj.defaultPage());
pj.setPrintable(new FilePagePainter(args[0]), pf);
if (pj.printDialog()){
try{
pj.print();
}catch(PrinterException e){}
}
System.exit(0);
}
}
class FilePagePainter implements Printable{
private BufferedReader br;
private String file;
private int page = -1;
private boolean eof;
private String[] line;
private int numLines;
23. /
public FilePagePainter(String file){
this.file = file;
try{
br = new BufferedReader(new FileReader(file));
}catch(IOException e){ eof = true; }
}
public int print(Graphics g, PageFormat pf, int ind)
throws PrinterException{
g.setColor(Color.black);
g.setFont(new Font("Serif", Font.PLAIN, 10));
int h = (int)pf.getImageableHeight();
int x = (int)pf.getImageableX() + 10;
int y = (int)pf.getImageableY() + 12;
try{
// :
if (ind != page){
if (eof) return Printable.NO_SUCH_PAGE;
page = ind;
line = new String[h/12];
// .
numLines = 0;
// .
// .
while (y + 48 < pf.getImageableY() + h){
line[numLines] = br.readLine();
if (line[numLines] == null){
eof = true;
break;
}
numLines++;
y += 12;
}
}
// .
y = (int)pf.getImageableY() + 12;
g.drawString(": " + file + ", " + (ind + 1), x, y);
// .
y += 36;
// .
for (int i = 0; i < numLines; i++){
g.drawString(line[i], x, y);
y += 12;
}
return Printable.PAGE_EXISTS;
}catch(IOException e){
return Printable.NO_SUCH_PAGE;
}
}
}
597
598
IV. Java
Printable Job
, , , .
Pageable Job Book.
, Book, , .
PageFormat, , .
,
UNKNOWN_NUMBER_OF_PAGES. , print() NO_SUCH_PAGE.
pageIndex p.
23.11 , : Cover Content.
print(). Cover
.
. Content
.
pf1,
pf2.
bk Book : ,
, print() Content.
23.11.
import java.awt.*;
import java.awt.print.*;
public class Print2Book{
public static void main(String[] args){
PrinterJob pj = PrinterJob.getPrinterJob();
// .
PageFormat pfl = pj.defaultPage();
pfl.setOrientation(PageFormat.LANDSCAPE);
// .
PageFormat pf2 = pj.pageDialog(new PageFormat());
Book bk = new Book();
// .
bk.append(new Cover(), pfl);
// .
bk.append(new Content(), pf2, 2);
// Pageable Job.
pj.setPageable(bk);
23. /
599
if (pj.printDialog()){
try{
pj.print();
}catch(Exception e){}
}
System.exit(0);
}
}
class Cover implements Printable{
public int print(Graphics g, PageFormat pf, int ind)
throws PrinterException{
g.setFont(new Font("Helvetica-Bold", Font.PLAIN, 40));
g.setColor(Color.black);
int y = (int)(pf.getImageableY() +
pf.getImageableHeight()/2);
g.drawString(" .", 72, y);
g.drawString(" ", 72, y+60);
g.drawString(" .", 72, y+120);
return Printable.PAGE_EXISTS;
}
}
class Content implements Printable{
public int print(Graphics g, PageFormat pf, int ind)
throws PrinterException{
Graphics2D g2 = (Graphics2D)g;
g2.setFont(new Font("Serif", Font.PLAIN, 12));
g2.setColor(Color.black);
int x = (int)pf.getImageableX() + 30;
int y = (int)pf.getImageableY();
g2.drawString(" .",
x, y += 16);
g2.drawString(" ,", x, y += 16);
g2.drawString(" .", x, y += 16);
return Printable.PAGE_EXISTS;
}
}
1. (stream) ?
2. / Java
?
600
IV. Java
3. /?
4. ?
5. , ?
6. ?
7. / ?
8. ?
9. , , , /?
24
Java
, , . , (peer-to-peer) .
,
-, , , . . ,
, -, .
, , . . - (client-server).
, (listen) ,
.
(request) , . (response), , . ,
, (session).
,
(protocol) . , ,
.
, , . , , ,
. ,
. , , .
, , , , . , , , .
, : ,
. . , . , -
- , .
602
IV. Java
: , , ,
, . , . , , , .
,
, , . , , .
- -.
,
, Web-. , - (port).
, , -. , , ,
, , . , 25,
21, Web- 80.
1023. , 1024 65 535, .
. -
- . , " ", "" . . , -"".
, . , ,
.
, - . Web-
80 81, 8080, 8001 -
.
. , : " !" : " ...".
. : ", !" : ", ".
. , . , , . , . , ,
, , . , .
, :
, , .
(stack) : " ".
24. Java
603
, TCP/IP.
, ,
(application) : HTTP (80), SMTP (25), Telnet (23), FTP (21), POP3 (100) . .
(transport) . , , ,
. TCP
(Transmission Control Protocol) UDP (User Datagram Protocol).
TCP TCP- (packet), UDP
(datagram).
, , .
. , , .
,
.
, . , UDP . , , , , .
TCP- , ,
TCP . . . , . . , , ,
TCP . TCP
, .
, (network) .
IP (Internet Protocol). , . IP-.
, IP- , (link)
ENET, SLIP, PPP, , .
, , ,
.
IP-? , , (host), , IP- (IP-address).
0 255,
(octet), , : 138.2.45.12
17.056.215.38.
IP- , .
: " 154.223.145.26!" IP-
(domain name).
604
IV. Java
: ru , su , ua , de . ., :
com , org , edu . : msc.ru , spb.ru , kcn.ru , : bhv.ru "-", ksu.ru , sun.com Sun Microsystems. :
www.bhv.ru, java.sun.com.
.
Java IP- InetAddress java.net.
getByName(String host)
, host IP-.
WWW
WWW (World Wide Web),
HTTP (Hypertext Transfer Protocol). , URL (Uniform Resource Locator). :
protocol://authority@host:port/path/file#ref
protocol://authority@host:port/path/file/query?user_info
authority : ,
host IP- . :
http://www.bhv.ru/
https://132.192.5.10:448/public/some.html
ftp://guest:password@lenta.ru/users/local/pub
file:///C:/text/html/index.htm
- URL , . , HTTP 80,
HTTPS 443, FTP 21. path/file,
, , "welcome file".
index.html, index.htm index.jsp.
Java URL URL java.net.
.
URL(String url);
url . getProtocol(),
getAuthority(), getHost(), getPort(), getPath(), getFile(), getQuery(), getUserInfo(), URL, :
openConnection() URL URLConnection;
openStream() URL -
InputStream.
24.1 , , openStream().
24. Java
605
24.1. Web-
import java.net.*;
import java.io.*;
public class SimpleURL{
public static void main(String[] args){
try{
URL bhv = new URL("http://www.bhv.ru/");
BufferedReader br = new BufferedReader(
new InputStreamReader(bhv.openStream()));
String line = null;
while ((line = br.readLine()) != null)
System.out.println(line);
br.close();
}catch(MalformedURLException me){
System.err.println("Unknown host: " + me);
System.exit(0);
}catch(IOException ioe){
System.err.println("Input error: " + ioe);
}
}
}
, : , , , , , ,
, openConnection()
URLConnection HttpURLConnection.
,
. :
setDoOutput(boolean out) out true, -
; false;
setDoInput(boolean in) in true,
; true, setDoOutput(true),
false;
setUseCaches(boolean cache) cache false,
, true, ;
setDefaultUseCaches(boolean default) default true, -
, ;
setRequestProperty(String name, String value) name -
value .
connect(). . ,
getXxx(), ,
, connect() .
606
IV. Java
Web- , , ,
getXxx(). :
getContentType() String, MIME- -
, "text/html", null, ;
getContentLength() 1,
;
getContent() Object;
getContentEncoding() String -
null, .
/, :
getInputStream() InputStream;
getOutputStream() OutputStream.
, , .
bhv.openStream(), 24.1,
bhv.openConnection().getInputStream();
24.2 , URL.
Web-, , , . ? , ?
? ?
CGI (Common Gateway Interface), , , . URL
, -. , Web
. - , .
. Web- , .
CGI- : C, C++, Pascal, Perl, ASP, PHP,
. Java,
Java
(servlets) JSP, 26 27. CGI-
cgi-bin.
24.2. URL
import java.net.*;
import java.io.*;
public class PostURL{
public static void main(String[] args){
String req = "This text is posting to URL";
24. Java
607
try{
// URL CGI-.
URL url = new URL("http://www.bhv.ru/cgi-bin/some.pl");
// uc.
URLConnection uc = url.openConnection();
//
uc.setDoOutput(true);
//
uc.setDoInput(true);
// .
uc.setUseCaches(false);
//
uc.setRequestProperty("content-type", "application/octet-stream");
// .
uc.setRequestProperty("content-length", "" + req.length());
// .
uc.connect();
//
DataOutputStream dos = new DataOutputStream(uc.getOutputStream());
// , URL.
dos.writeBytes(req);
// .
dos.close();
// .
BufferedReader br = new BufferedReader(new InputStreamReader(
uc.getInputStream()));
String res = null;
// .
while ((res = br.readLine()) != null)
System.out.println(res);
br.close();
}catch(MalformedURLException me){
System.err.println(me);
}catch(UnknownHostException he){
System.err.println(he);
}catch(UnknownServiceException se){
System.err.println(se);
}catch(IOException ioe){
System.err.println(ioe);
}
}
}
1. , .
2. , CGI-
.
608
IV. Java
TCP
-, , . - ,
-.
,
, (socket).
"socket" , . ,
220 50 , , , .
(bind) ; , (listen) . .
1. , .
2. , ,
(accept) .
3. , , ,
, .
4. .
,
, .
Java Socket java.net. , .
Socket(String host, int port);
.
. ,
/:
getInputStream() InputStream;
getOutputStream() OutputStream.
HTTP. :
1. "POST filename
HTTP/1.1\n\n", filename .
2. , filename
. filename /, index.html, .
3. "HTTP/1.1 code \n\n",
code , : 200 , ;
400 ; 404 .
4. , .
24. Java
609
5. System.out
System.err.
6. , .
24.3 24.4.
24.3. HTTP-
import java.net.*;
import java.io.*;
import java.util.*;
public class Client{
public static void main(String[] args){
if (args.length != 3){
System.err.println("Usage: Client host port file");
System.exit(0);
}
String host = args[0];
int
port = Integer.parseInt(args[1]);
String file = args[2];
try{
Socket sock = new Socket(host, port);
PrintWriter pw = new PrintWriter(new OutputStreamWriter(
sock.getOutputStream()), true);
pw.println("POST " + file + " HTTP/1.1\n");
BufferedReader br = new BufferedReader(new InputStreamReader(
sock.getInputStream()));
String line = null;
line = br.readLine();
StringTokenizer st = new StringTokenizer(line);
String code = null;
if ((st.countTokens() >= 2) && st.nextToken().equals("POST")){
if ((code = st.nextToken()) != "200"){
System.err.println("File not found, code = " + code);
System.exit(0);
}
}
while ((line = br.readLine()) != null)
System.out.println(line);
sock.close();
}catch(Exception e){
System.err.println(e);
}
}
}
IV. Java
610
/ . , .
java.net ServerSocket.
:
ServerSocket(int port);
, accept(), ,
. , Socket, .
24.4. HTTP-
import java.net.*;
import java.io.*;
import java.util.*;
public class Server{
public static void main(String[] args){
try{
ServerSocket ss = new ServerSocket(Integer.parseInt(args[0]));
while (true)
new HttpConnect(ss.accept());
}catch(ArrayIndexOutOfBoundsException ae){
System.err.println("Usage: Server port");
System.exit(0);
}catch(IOException e){
System.out.println(e);
}
}
}
class HttpConnect extends Thread{
private Socket sock;
HttpConnect(Socket s){
sock = s;
setPriority(NORM_PRIORITY 1);
start();
}
public void run(){
try{
PrintWriter pw = new PrintWriter(new OutputStreamWriter(
sock.getOutputStream()), true);
BufferedReader br = new BufferedReader(new InputStreamReader(
sock.getInputStream()));
String req = br.readLine();
System.out.println("Request: " + req);
24. Java
611
, , :
java Server 8080
, IP- ,
:
java Client localhost 8080 Server.java
Server.java .
.
, .
, TCP/IP, ""
127.0.0.1 localhost. . - . , .
proxy-
proxy-, -
612
IV. Java
IP-. ,
proxy-, JDK 5.0 Socket
Socket(Proxy proxy);
Proxy, proxy-.
Proxy(Proxy.Type type, SocketAddress address);
proxy- :
DIRECT proxy-;
HTTP proxy-, HTTP FTP;
SOCKS proxy-, SOCKS4
SOCKS5.
SocketAddress, , .
InetSocketAddress.
. , proxy, :
Socket sock = new Socket(new Proxy(Proxy.Type.SOCKS,
new InetSocketAddress("socks.domain.com", 1080)));
3. , FTP.
4. proxy- .
UDP
. Java DatagramSocket. :
DatagramSocket()
;
DatagramSocket(int port) port -
;
DatagramSocket(int port, InetAddress addr) -
port; addr .
, , :
send(DatagramPacket pack) , pack;
receive(DatagramPacket pack)
pack.
24. Java
613
, , , .
connect(InetAddress addr, int port);
addr
port , .
disconnect().
UDP , :
String mes = "This is the sending message.";
byte[] data = mes.getBytes();
InetAddress, :
InetAddress addr = InetAddress.getByName(host);
DatagramPacket. , , :
DatagramPacket pack = new DatagramPacket(data, data.length, addr, port);
:
DatagramSocket ds = new DatagramSocket();
:
ds.send(pack);
, -
:
ds.close();
,
send() receive(DatagramPacket pack).
24.5 Sender, ,
, localhost, 1050. Recipient, 24.6, .
24.5. UDP
import java.net.*;
import java.io.*;
public class Sender{
private String host;
private int port;
Sender(String host, int port){
this.host = host;
this.port = port;
}
614
IV. Java
5. .
1. "-"?
2. ?
24. Java
615
3. ?
4. ?
5. ?
6. TCP/IP?
7. IP-?
8. ?
9. ?
10. DNS-?
11. URL?
12. -?
Web- Java
25.
Web- Java
26.
27.
JSP
28.
Java XML
25
Web- Java
Java,
, .
jar
, ,
Java JAR. jar-
, jar. ZIP. JAR (Java ARchive)
TAR (Tape ARchive), UNIX.
jar- zip- , jar- META-INF, .
, 18, , .
-, ,
. <applet>
archive, :
<applet code = "MillAnim.class" archive = "first.jar, second.jar"
width = "100%" height = "100%"></applet>
MillAnim.class -
first.jar second.jar. ,
, , , HTML-. , jar-, zip- .
(applications). , appl.jar.
, jar, :
java jar appl.jar
, main(),
MANIFEST.MF, .
V. Web- Java
620
JDK MS Windows
jar javaw, , :
"C:\jre1.6.0_02\bin\javaw.exe" -jar "%1" %*
, Windows.
.
, , java.util.jar.
Jar- java.util.jar jar.
jar tar.
jar <Enter>,
, , . 25.1.
. 25.1. jar
jar ,
:
jar {ctxui}[vfm0Me] [jar-file] [manifest-file] [entry-point] [-C dir] files...
. , jar : c, t, x, u i.
:
c (create) ;
t (table of contents) ;
621
x (extract) ;
u (update) , .
, , ,
. :
v (verbose) -
;
f (file) jar-file ;
m (manifest) manifest-file -
;
0 () , ;
M (manifest) ;
e (entry) . entrypoint , main(), .
MANIFEST.MF (. ).
-i (index) INDEX.LIST.
.
-
jar-file, , , manifest-file, , ,
entry-point, ,
. , .
. -C dir ,
jar dir.
.
,
. f,
jar-. m, (manifest-file).
, ,
f m.
f , .
m ,
MANIFEST.MF, META-INF ,
.
. 25.2 Base.jar ch3.
ch3. , Base.class classes. ch3. Base.jar. .
, META-INF, MANIFEST.MF.
V. Web- Java
622
. 25.2. jar
MANIFEST.MF
MANIFEST.MF, META-INF , :
, ;
JavaBeans, ;
;
, ;
.
,
manif. jar,
m, :
jar cmf manif Base.jar classes Base.class
623
manif
MANIFEST.MF, .
manif , JAR File Specification. Java SE,
docs/technotes/guides/jar/jar.html.
, Base.class
Base.jar, manif :
Main-Class: Base
, , . .
class. , .
, , '\n'.
, name.gif, (splash screen)
SplashScreen-Image: name.gif
Base.jar, :
java jar Base.jar
INDEX.LIST
INDEX.LIST. . jar
i, :
jar i Base.jar
. 25.3.
624
V. Web- Java
JavaBeans
IDE (Integrated
Development Environment), NetBeans, IntelliJ IDEA, Eclipse, JBuilder .
, .
, . , .
, ,
.
(properties) : , ,
, .
, .
Properties ,
. , .
,
.
, Eclipse, .
, .
(properties), .
getXxx()/setXxx()/isXxx() . IDE, .
, ,
Java JavaBean.
. , jar-
MANIFEST.MF Java-Bean: True.
AWT Swing JavaBeans.
, III, JavaBean. -
JavaBeans, ,
IDE, , NetBeans.
JavaBeans
Java SE, technotes/guides/beans.
JavaBeans JavaBeans API
Specification, :
http://www.oracle.com/technetwork/java/javase/documentation/spec-136004.html.
JavaBeans.
, JavaBeans, ,
. ,
JavaBeans , .
625
.
, JavaBeans
.
JDBC
, .
. , (
) -
.
, .
, ,
?
Microsoft, ODBC (Open
Database Connectivity) , C. , . , ,
ODBC.
ODBC, . , , , .
, ODBC
.
Sun , JDBC, . java.sql, javax.sql ,
Java SE.
"JDBC" , , "Java Database Connectivity".
JDBC , JDBC
. JDBC . JDBC
.
http://developers.sun.com/product/jdbc/drivers http://www.sqlsummit.com/
JDBCVend.htm.
JDBC:
, JDBC ODBC.
(bridge) JDBCODBC.
ODBC, ,
;
, JDBC API .
;
626
V. Web- Java
, JDBC , -
, HTTP. , ,
;
, JDBC .
,
JDBCODBC:
try{
Class dr = sun.jdbc.odbc.JdbcOdbcDriver.class;
}catch(ClassNotFoundException e){
System.err.println("JDBC-ODBC bridge not found " + e);
}
dr , .
25.1.
, .
Connection. , ,
getConnection() DriverManager, :
String url = "jdbc:odbc:mydb";
String login = "admin";
String password = "1nF4vb";
Connection con = DriverManager.getConnection(url, login, password);
, url.
"jdbc:", (subprotocol), JDBCODBC, "odbc:".
(subname) , "mydb".
.
, . , Statement. createStatement(), Connection. :
Statement st = con.createStatement();
(query) execute()
getResultSet().
executeQuery(), :
ResultSet rs = st.executeQuery("SELECT name, code FROM tbl1");
627
while (rs.next()){
emp[i] = rs.getString("name");
num[i] = rs.getInt("code");
i++;
}
ResultSetMetaData , , , rs .
st
Statement st = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
previous(),
first(), last(). rs updateXxx() , . ,
rs rs.getType()
rs.getConcurrency().
Statement PreparedStatement,
, setXxx().
PreparedStatement, , CallableStatement,
.
25.1 Oracle Oracle
Thin. , , .
Oracle, .
.
25.1. , Oracle
import
import
import
import
import
java.awt.*;
java.awt.event.*;
java.applet.*;
java.util.*;
java.sql.*;
628
V. Web- Java
629
while (rs.next()){
String s = " ";
// 1!
for (int i = 1; i <= n; i++)
s += " " + rs.getObject(i);
results.addElement(s);
}
rs.close();
st.close();
con.close();
repaint();
}catch(Exception e){
System.err.println(e);
}
repaint();
}
public void paint(Graphics g){
if (results == null){
g.drawString("Can't execute the query", 5, 30);
return;
}
int y = 30, n = results.size();
for (int i = 0; i < n; i++)
g.drawString((String)results.elementAt(i), 5, y += 20);
}
}
24 , , ,
127.0.0.1 localhost. ,
, . , Web-. Web- 8080, HTML , URL http://localhost:8080/public/
JdbcApplet.html. , Web- , public usr/local/http/public .
, JDBC .
JDBC , JDBC,
: http://java.sun.com/products/jdbc/.
Java SE, technotes/guides/jdbc/,
JDBC.
1. Java JAR?
2. jar- , ?
3. jar-?
630
V. Web- Java
4. jar- ?
5. JavaBeans: , , , ?
6. , JavaBean?
7. JavaBeans?
8. JDBC?
9. JDBC?
10. JDBC?
26
HTTP- : , .
HTTP URL.
- . SSI (Server
Side Include) HTML. HTTP Web-.
. URL , CGI
(Common Gateway Interface), .
URL , , " ", :
http://some.firm.com/cgi-bin/mycgiprog.pl?name=Ivanov&age=27
HTML <form>.
Web-, , CGI- (
mycgiprog.pl), cgi-bin,
"Ivanov" "27" name age.
HTML, Web- .
CGI , . Perl. , CGI. : PHP, ASP, JavaScript.
Java
JSP (JavaServer Pages).
(servlets) Web- , , .
, (servlet container). ""
, , , , , . ,
632
V. Web- Java
Web-
, . Web-.
Web- (web application) , : , JSP, HTML, XML, , , . "Java
Servlet Specification" , .
. 26.1.
, , Web-,
, Web-.
InfoAppl. WEB-INF
. , WEB-INF ,
. " " Web-. ,
WEB-INF, .
WEB-INF XML- web.xml,
Web-: , .
26.
633
Web- ,
WEB-INF, web.xml. ,
web.xml .
WEBINF/classes .
. 26.1. Web-
Web- JAR.
war (Web ARchive). Web- ,
Web- , . Tomcat WAR-
webapps. "" , , .
Tomcat server.xml.
Servlet
Java, "" Servlet.
.
, ,
. , init() , , , , init(), Servlet,
ServletConfig:
public void init(ServletConfig conf);
, ServletConfig, Web- . ,
, Web-.
634
V. Web- Java
(deployment descriptor) ,
Web-: , , JSP, HTML
XML, . Web .
XML web.xml. WEB-INF, Web-, , IDE, NetBeans
Eclipse. -
make-, . ,
make Java , Java: ant, Apache Software Foundation
Jakarta, Maven Apache Software
Foundation, Ivy - Apache.
Tomcat ,
/manager/html. ,
: http://localhost:8080/manager/.
26.1 web.xml,
Tomcat. XML 28, XML .
26.1. web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/j2ee/dtds/web-app_2_3.dtd">
<web-app>
<!- , .
"default" .
-->
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>
org.apache.tomcat.servlets.DefaultServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<!- , ,
"invoker".
-->
<servlet>
<servlet-name>invoker</servlet-name>
26.
<servlet-class>
org.apache.tomcat.servlets.InvokerServlet
</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<!- JSP
JspServlet. "jsp".
-->
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>
org.apache.jasper.runtime.JspServlet
</servlet-class>
<!-- uncomment the following to use Jikes for JSP compilation
, jikes.
<init-param>
<param-name>jspCompilerPlugin</param-name>
<param-value>
org.apache.jasper.compiler.JikesJavaCompiler
</param-value>
</init-param>
-->
<load-on-startup>
-2147483646
</load-on-startup>
</servlet>
<!- - ,
URL .
,
public_html webapps.
URL servlet,
"invoker", . . InvokerServlet.
-->
<servlet-mapping>
<servlet-name>invoker</servlet-name>
<url-pattern>/servlet/*</url-pattern>
</servlet-mapping>
<!- JSP,
"jsp", . . JspServlet.
-->
<servlet-mapping>
<servlet-name>jsp</servlet-name>
635
V. Web- Java
636
<url-pattern>*.jsp</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>30</session-timeout>
</session-config>
<!-
MIME- .
-->
<mime-mapping>
<extension>txt</extension>
<mime-type>text/plain</mime-type>
</mime-mapping>
<mime-mapping>
<extension>html</extension>
<mime-type>text/html</mime-type>
</mime-mapping>
<mime-mapping>
<extension>htm</extension>
<mime-type>text/html</mime-type>
</mime-mapping>
<mime-mapping>
<extension>gif</extension>
<mime-type>image/gif</mime-type>
</mime-mapping>
<!- .
, ,
.
-->
<welcome-file-list>
<welcome-file>index.jsp </welcome-file>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
</welcome-file-list>
</web-app>
26.
637
ServletConfig
ServletConfig ,
<servlet-name> , , <init-param>, ServletContext.
public
public
public
public
String getServletName();
Enumeration getInitParameterNames();
String getInitParameter(String name);
ServletContext getServletContext();
ServletConfig.
web.xml
.
, <param> getParameter() .
26.2 , .
26.2.
package myservlets;
import java.io.*;
import java.util.*;import javax.servlet.*;
public class InfoServlet extends GenericServlet{
private ServletConfig sc;
@Override
public void init(ServletConfig conf)
throws ServletException{
super.init(conf);
sc = conf; }
@Override
public void service(ServletRequest req, ServletResponse resp)
throws ServletException, IOException{
resp.setContentType("text/html; charset=windows-1251");
PrintWriter pw = resp.getWriter();
pw.println("<html><head>");
pw.println("<title> </title>");
pw.println("</head><body><h2> </h2>");
pw.println(" " + sc.getServletName() + "<br>");
pw.println(" : <br>");
Enumeration names = sc.getInitParameterNames();
V. Web- Java
638
while (names.hasMoreElements()){
String name = (String)names.nextElement();
pw.print(name + ": ");
pw.println(sc.getInitParameter(name) + "<br>");
}
pw.println("</body></html>");
pw.flush();
pw.close();
}
public void destroy(){
sc = null;
}
}
26.2 ,
:
init(ServletConfig), init(ServletConfig) -
;
setContentType() -
getWriter(). .
26.2 , InfoServlet.class . ,
, make- ant-.
, webapps, autodeploy, -
. ,
:
http://<servlethost>:8000/InfoAppl/servlet/InfoServlet
HTML, . , , .
, .
.
, Tomcat,
, Web-. Web- ,
. Web- :
http://<servlethost>:8000/InfoAppl/InfoServlet
getServletContext(),
ServletContext, .
26.
639
, Web-, . (context) , Web. , , , , , web.xml , , .
ServletContext. ,
.
getServerInfo() Java EE SDK,
getMajorVersion() getMinorVersion() Servlet API.
, Web-. Web- web.xml
<context-param>.
public Enumeration getInitParameterNames();
public String getInitParameter(String name);
,
Java.
public Enumeration getAttributeNames();
public Object getAttribute(String name);
public void setAttribute(String name, Object value);
public void removeAttribute(String name);
, Web-, , Web-, .
Service
public void service(ServletRequest req, ServletResponse resp);
init()
req ServletRequest, , . req . , service()
resp ServletResponse.
service() , req, resp. resp , Web- . , ServletRequest ServletResponse.
V. Web- Java
640
ServletRequest
ServletRequest, , getXxx(), null,
.
getRemoteAddr(), getRemoteHost() getRemotePort() IP-,
DNS- proxy- ,
getServerName() getServerPort() ,
.
getLocalAddr(), getLocalName() getLocalPort() IP-,
DNS- , , .
getScheme()
getProtocol()
Enumeration getParameterNames();
String getParameter(String name);
String[] getParameterValues(String name);
Map getParameterMap();
- ,
public Enumeration getAttributeNames();
public Object getAttribute(String name);
, : .
ServletInputStream.
ServletInputStream , InputStream.
public int readLine(byte[] buf, int offset, int length);
buf.
offset '\n'
length.
1, .
26.
641
req
public ServletInputStream getInputStream();
BufferedReader, 23.
public BufferedReader getReader();
javax.servlet ServletRequest
ServletRequestWrapper.
public ServletRequestWrapper(ServletRequest req);
ServletRequest. , , , , ServletRequestWrapper.
ServletResponse
service() ServletResponse,
service().
setContentType(String) setLocale(Locale)
MIME- , setContentLength(int)
. , setCharacterEncoding(String).
.
ServletOutputStream
ServletOutputStream OutputStream,
print(xxx) boolean, char, int, long, float, double, String
println(xxx) , "\r\n".
println() "\r\n".
public PrintWriter getWriter();
26.2.
javax.servlet ServletResponse
ServletResponseWrapper.
public ServletResponseWrapper(ServletResponse resp);
ServletResponse. , , , , ServletResponseWrapper.
, , . -
642
V. Web- Java
, , ,
destroy(). .
init(), service(), , ,
, Java.
, .
. (thread),
service(). :
service(), ,
,
;
, , ,
,
init();
, , ,
, destroy(),
.
GenericServlet
GenericServlet Servlet ServletConfig.
init()
. init(ServletConfig),
, :
public void init(ServletConfig config) throws ServletException{
this.config = config;
log("init");
this.init();
}
init() , super.init(config).
GenericServlet service(). , service().
26.2. , init(),
ServletConfig,
GenericServlet. 26.3.
.
26.3.
package myservlets;
import java.io.*;
26.
643
HTTP
HTTP, RFC 2616. ServletRequest ServletResponse
HttpServletRequest HttpServletResponse .
, HTTP.
HttpServletRequest
HttpServletRequest HTTP-.
, HTTP,
, URI . CRLF. , .
V. Web- Java
644
:
GET http://some.firm.com/MyWebAppl/servlet/MyServlet?age=27 HTTP/1.1
, , URI, :
public String getRequestURL() URL http
;
public String getServletPath() ,
.
, ,
public String getContextPath();
URI
public String getQueryString();
- ,
public String getPathInfo();
, ,
public String getPathTranslated();
: Accept, Accept-Charset,
Accept-Language, User-Agent , RFC 2616.
public
public
public
public
public
Enumeration getHeaderNames();
Enumeration getHeaders(String name);
String getHeader(String name);
int getIntHeader(String name);
long getDateHeader(String name);
, cookies, , Cookie
public Cookie[] getCookies();
javax.servlet.http HttpServletRequest
HttpServletRequestWrapper, ServletRequestWrapper.
public HttpServletRequestWrapper(HttpServletRequest req);
HttpServletRequest. ,
, HTTP-,
, HttpServletRequestWrapper.
26.
645
HttpServletResponse
HTTP , HttpServletResponse.
name value. ,
, .
name,
public void addHeader(String name, String value);
public void setIntHeader(String name, int value);
public void addIntHeader(String name, int value);
public void setDateHeader(String name, long date);
public void addIntHeader(String name, int value);
(status code)
public void setStatus(int sc);
,
PrintWriter. sc , SC_OK, 200 ,
SC_BAD_REQUEST 400 . . HttpServletRequest. setStatus()
200299.
public void sendError(int sc, String message);
26.6.
sendError() .
,
IllegalStateException.
, cookie
public void addCookie(Cookie cookie);
javax.servlet.http HttpServletResponse
HttpServletResponseWrapper, ServletResponseWrapper.
public HttpServletResponseWrapper(HttpServletResponse resp);
646
V. Web- Java
HttpServletResponse. ,
, ,
HttpServletResponseWrapper.
HttpServlet
HTTP GenericServlet HttpServlet. , ,
, service(). , , , doGet(), doPost()
, HTTP-
GET, POST .
public void service(ServletRequest req, ServletResponse resp);
req resp.
HttpServletRequest HttpServletResponse. , ServletException .
req resp , getMethod()
HTTP- , HTTP,
protected void doXxx(HttpServletRequest req, HttpServletResponse resp);
HttpServlet,
web.xml,
. web.xml . web.xml ,
, .
, .
javax.servlet.annotation, import. :
import javax.servlet.*;
import javax.servlet.annotation.*;
@WebServlet(name="informer", urlPatterns={"/InfoServlet"},
initParams={
@WebInitParam(name="unit", value="1"),
26.
647
@WebInitParam(name="invoke", value="yes")
})
public class InfoServlet extends HttpServlet{
// ...
}
@WebServlet <servlet>
web.xml. name, , . urlPatterns
value. ,
.
@WebInitParam <init-param>. . @WebServlet initParams, .
HttpServlet
, Web- (). RegPrepServlet
HTML-, , HTML, . 26.4
HTML- . . 26.2.
26.4.
<html><head>
<title></title>
<META http-equiv=Content-Type
content="text/html; charset=windows-1251">
</head>
<body><h2 align="center"> </h2>
<p> :</p>
<br>
<form method="POST"
action=
"http://some.firm.com:8000/WebAppl/servlet/RegPrepServlet">
<pre>
: <input type="text" size="40" name="surname">
: <input type="text" size="40" name="name">
: <input type="text" size="40" name="secname">
E-mail: <input type="text" size="40" name="addr">
<input type="submit" value="">
</pre>
</form>
</body>
</html>
V. Web- Java
648
. 26.2.
. 26.3.
java.io.*;
java.sql.*;
java.util.*;import javax.servlet.http.*;
javax.servlet.annotation.*;
26.
try{
Class.forName(driver);
con = DriverManager.getConnection(
url, user, password);
pst = con.prepareStatement(
"INSERT INTO students (id, name, address) " +
"VALUES(reg_seq.NEXTVAL, ?, ?)");
}catch(Exception e){
System.err.println("From init(): " + e);
}
}
@Override
public void doGet(HttpServletRequest req, HttpServletResponse resp){
doPost(req, resp);
}
@Override
public void doPost(HttpServletRequest req, HttpServletResponse resp){
try{
req.setCharacterEncoding("Cp1251");
String surname = req.getParameter("surname");
String name
= req.getParameter("name");
String secname = req.getParameter("secname");
String addr
= req.getParameter("addr");
resp.setContentType("text/html; charset=windows-1251");
PrintWriter pw = resp.getWriter();
if (surname.length() * name.length() *
secname.length() * addr.length() == 0){
pw.println("<html><head>");
pw.println("<title> </title>");
pw.println("</head><body><h2 align=center>" +
" </h2>");
pw.println("<h3>:</h3>");
pw.println(", , .<br>");
pw.println("</body></html>");
pw.flush();
pw.close();
return;
}
String fullname = surname.trim() + " " + name.trim() +
" " + secname.trim();
pst.setString(1, fullname);
pst.setString(2, addr);
int count = pst.executeUpdate();
Statement st = con.createStatement();
ResultSet rs = st.executeQuery(
"SELECT id, name FROM students ORDER BY id DESC");
649
V. Web- Java
650
rs.next();
int id = rs.getInt(1);
fullname = rs.getString(2);
rs.close();
26.5 .
.
init() , -
26.
651
. ,
init() .
, Oracle, RegPrepServlet, Oracle Application Server
(OAS) Apache/JServ Tomcat.
Oracle AS JDBC
kprb. .
, HTML, , , PDF, , ,
MIME-. 26.6 ,
GIF JPEG ,
.
26.6. ,
package myservlets;
import java.io.*;
import java.util.*;
import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.annotation.*;
@WebServlet()
public class ImageServlet extends HttpServlet{
Vector imFiles = new Vector();
int curIndex;
@Override
public void init() throws ServletException{
File imDir = null;
String imDirName = getInitParameter("imagedir");
if (imDirName != null)
imDir = new File(imDirName);
if ((imDir != null) && imDir.exists() && imDir.isDirectory()){
String[] files = imDir.list();
for (int i = 0; i < files.length; i++)
if (files[i].endsWith(".jpg") ||
files[i].endsWith(".gif")){
File curFile = new File(imDir, files[i]);
imFiles.addElement(curFile);
}
}else log("Cannot find image dir: " + imDirName);
}
V. Web- Java
652
@Override
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException{
int len = imFiles.size();
if (len > 0){
File curFile = (File)imFiles.elementAt(curIndex);
String fileName = curFile.getName();
ServletContext ctxt = getServletConfig().getServletContext();
String ctype = ctxt.getMimeType(fileName);
if (ctype == null) ctype = fileName.endsWith(".jpg") ?
"image/jpeg" : "image/gif";
resp.setContentType(ctype);
try{
BufferedInputStream bis = new BufferedInputStream(
new FileInputStream(curFile));
OutputStream os = resp.getOutputStream();
int cur = 0;
while ((cur = bis.read()) != -1) os.write(cur);
os.close();
bis.close();
}catch(FileNotFoundException e){
resp.sendError(HttpServletResponse.SC_NOT_FOUND);
}catch(Exception e){
resp.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
}
curIndex= (curIndex + 1) % len;
}else resp.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE); }
public long getLastModified(){
return System.currentTimeMillis();
}
}
HTTP , . TCP (persistent HTTP
connection) ,
HTTP .
, Web-, . ,
. , ""
. . 26.5 . -
26.
653
.
. . , .
, , , HTTP.
: cookie, URL HTML-.
cookie . ,
Set-Cookie, " = ",
, URL, cookie,
. , , , 4 , cookie- . ,
cookie- Cookie
" = ". "" .
javax.servlet.http Cookie,
cookie.
public Cookie(String name, String value);
setXxx() ,
getXxx() .
cookie
public void addCookie(Cookie cookie);
HttpServletResponse.
cookie :
String value = "" + id;
Cookie ck = new Cookie("studentid", value);
ck.setMaxAge(60*60*24*183); // Cookie
resp.addCookie(ck);
cookie
public Cookie[] getCookies();
HttpServletRequest.
cookie:
int id = 0;
Cookie[] cks = req.getCookies();
if (cks != null)
for (int i = 0; i < cks.length; i++)
if (cks[i].getName().equals("studentid")){
id = Integer.parseInt(cks[i].getValue());
break;
}
654
V. Web- Java
cookie , ,
cookie-, , - .
URL (rewriting URL) , :
GET /some.com/InfoAppl/index.html?jsessionid=12345678 HTTP/1.1
, , , .
HTML-
<input type="hidden" name="studentid" value="12345678">
.
HTML .
, - ,
Web-, . javax.servlet.http .
. cookies,
URL . .
HttpSession.
HttpSession ,
public HttpSession getSession(boolean create);
HttpServletRequest. HttpSession,
. ,
create false, null, true
.
public HttpSession getSession();
getSession(true).
public boolean isNew();
HttpSession , , (true)
, (false).
,
public long getCreationTime();
public long getLastAccessedTime();
, 1 1970
( UNIX).
26.
655
, .
public String getId();
.
,
Java.
public void setAttribute(String name, Object value);
public Enumeration getAttributeNames();
public Object getAttribute(String name);
,
.
public void removeAttribute(String name);
, . , HttpSessionBindingEvent.
HttpSessionEvent,
Web- , , .
invalidate() . , ,
public void setMaxInactiveInterval(int secs);
public int getMaxInactiveInterval();
ServletRequest ServletResponse. , , , , . . , ,
, , .
,
Web-.
.
, . Filter,
FilterChain FilterConfig. Filter ,
.
656
V. Web- Java
Filter. . Filter :
public void init(FilterConfig cong);
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain);
public void destroy();
,
init(), FilterConfig, ServletConfig. ,
public Enumeration getInitParameterNames();
public String getInitParameter(String name);
, web.xml <filter-name>. -
public String getFilterName();
,
public ServletContext getServletContext(String name);
, ,
, req resp.
. .
MIME- application/x-www-form-urlencoded, , .
Content-Type, :
Content-Type: application/x-www-form-urlencoded;charset=windows-1251
, , Web-.
setCharacterEncoding(String), getParameter(String) Unicode. getCharacterEncoding(),
, Content-Type. 26.7
Tomcat. , ,
Tomcat, "charset" .
26.
657
, ,
"charset".
26.7.
import java.io.*;import javax.servlet.*;
import javax.servlet.annotation.*;
@WebFilter(
urlPatterns={"/*"}, servletNames={""}
initParams={ @WebInitParam(name="simpleParam", value="paramValue") }
)
public class SetCharEncFilter implements Filter{
protected String enc;
protected FilterConfig fc;
@Override
public void init(FilterConfig conf) throws ServletException{
fc = conf;
enc = conf.getInitParameter("encoding");
}
@Override
public void doFilter(ServletRequest req,
ServletResponse resp,
FilterChain chain)
throws IOException, ServletException{
String encoding = selectEncoding(req);
if (encoding != null)
req.setCharacterEncoding(encoding);
chain.doFilter(req, resp);
}
protected String selectEncoding(ServletRequest req){
String charEncoding =
getCharsetFromContentType(req.getContentType());
return (charEncoding == null) ? enc : charEncoding;
}
// From org.apache.tomcat.util.RequestUtil.java
public static String getCharsetFromContentType(String type){
if (type == null) {
return null;
}
int semi = type.indexOf(";");
if (semi == -1) {
return null;
}
658
V. Web- Java
SetCharEncFilter, 26.7, .
req Content-Type getContentType().
, . , "encoding". resp
setCharacterEncoding(String) .
, , selectEncoding(), , :
User-Agent, Accept-Language, Accept-Charset, Content-Language.
req resp. - HttpServletRequestWrapper HttpServletResponseWrapper.
- .
public class MyRequestHandler extends HttpServletRequestWrapper{
public MyRequestHandler(HttpServletRequest req){
super(req);
// ...
}
// ...
}
public class MyResponseHandler extends HttpServletResponseWrapper{
public MyResponseHandler(HttpServletResponse resp){
super(resp);
// ...
}
// ...
}@WebFilter(urlPatterns={"/*"})
public class MyFilter implements Filter{
private MyRequestHandler mreq;
private MyResponseHandler mresp;
26.
659
@Override
public void init(FilterConfig conf){
// ...
}
@Override
public void doFilter(ServletRequest req,
ServletResponse resp,
FilterChain chain){
mreq = new MyRequestHandler((HttpServletRequest)req);
mresp = new MyResponseHandler((HttpServletResponse)resp);
// .
chain.doFilter(mreq, mresp);
// .
}
@Override
public void destroy(){
mreq = null;
mresp = null;
}
}
- , (map) .
IDE, , , . web.xml <filter>.
. <filtermapping> <filter-name> <servlet-name>. :
<filter-mapping>
<filter-name>MyFilter</filter-name>
<servlet-name>RegServlet</servlet-name>
</filter-mapping>
, . <url-pattern>,
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>*.html</url-pattern>
</filter-mapping>
HTML.
<filter-mapping>
web.xml.
,
. .
660
V. Web- Java
, , JSP, HTML, XML
. , , ,
public RequestDispatcher getRequestDispatcher(String path);
ServletRequest. path
. :
RequestDispatcher rd = req.getRequestDispatcher("CourseServlet");
ServletContext,
public RequestDispatcher getRequestDispatcher(String path);
ServletContext. path , . .
/. :
RequestDispatcher rd = conf.getServletContext().
getContext("/product").
getRequestDispatcher("/product/servlet/CourseServlet");
, ,
public RequestDispatcher getNamedDispatcher(String name);
ServletContext.
null, RequestDispatcher.
,
RequestDispatcher. .
,
public void forward(ServletRequest req, ServletResponse resp);
, req
resp. req resp
, resp - .
:
if (rd != null) rd.forward(req, resp);
else resp.sendError(HttpServletResponse.SC_NO_CONTENT);
- forward(), IllegalStateException.
26.
661
- ,
,
public void include(ServletRequest req, ServletResponse resp);
, req
resp.
resp. , .
. , include()
, SSI (Server Side Include).
include() .
, , service() . , ,
.
. , :
,
, .
.
, 3.0.
, , web.xml <async-supported> true
@WebServlet, @WebFilter asyncSupported, ,
@WebServlet(value="/MyAsyncServlet", asyncSupported="true")
isAsyncSupported().
startAsync()
ServletRequest, ServletRequest
ServletResponse. AsyncContext, . ,
, isAsyncStarted().
startAsync() service(), , complete() AsyncContext
, setTimeout().
, AsyncListener .
AsyncListener : onStartAsync(),
onError(),
onTimeout(). ,
.
onComplete()
V. Web- Java
662
.
26.8 .
:
http://localhost:8080/MyAsyncApp/AsyncServlet?id=1
, 10 , .
26.8.
package mypack;
import
import
import
import
import
import
java.io.*;
java.util.concurrent.*;
javax.servlet.*;
javax.servlet.annotation.*;
javax.servlet.http.*;
java.util.Date;
26.
@Override
public void run() {
String reqId = asyncContext.getRequest().getParameter("id");
if (null == reqId || reqId.length() == 0) reqId = "unknown";
Date before = new Date();
String result = longStandingProcess(reqId);
String resp = "Request id: " + reqId +
"<br/> Started at: " + before.toString() +
".<br/> Completed at: " + result + ".<br/>";
asyncContext.getResponse().setContentType("text/html");
try {
PrintWriter out = asyncContext.getResponse().getWriter();
out.println(resp);
} catch(Exception e) {
System.out.println(e.getMessage() + ": " + e);
}
asyncContext.complete();
}
public String longStandingProcess(String reqId) {
try {
Thread.sleep(10000);
} catch (InterruptedException ie) {
System.out.println("Request: " + reqId +
", " + ie.getMessage() + ": " + ie);
}
return new Date().toString();
}
}
@WebListener
public class MyAsyncListener implements AsyncListener {
public MyAsyncListener() { }
public void onComplete(AsyncEvent ae) {
System.out.println("AsyncListener: onComplete for request: " +
ae.getAsyncContext().getRequest().getParameter("id"));
}
public void onTimeout(AsyncEvent ae) {
System.out.println("AsyncListener: onTimeout for request: " +
ae.getAsyncContext().getRequest().getParameter("id"));
}
public void onError(AsyncEvent ae) {
System.out.println("AsyncListener: onError for request: " +
ae.getAsyncContext().getRequest().getParameter("id"));
}
663
664
V. Web- Java
10
longStandingProcess(). longStandingProcess() , run() AsyncProcessor.
longStandingProcess() resp , complete().
doGet()
execute(), doGet() , .
, , , . . , AsyncRequest, Java EE
6 SDK.
1. HTTP- Web-?
2. ?
3. ?
4. ?
5. ?
6. HTML, ?
7. ?
8. , , ?
9. ?
27
JSP
,
HTML, HTML.
. HTML Java, , , Java HTML . , Java.
JSP (JavaServer Pages), HTML
<% _ %>. , Java, ,
Java, JavaBean EJB.
JSP , ,
(custom tags), (tag extensions).
27.1 JSP- "Hello, World!" .
27.1. JSP
<!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN">
<%@ page contentType="text/html;charset=windows-1251" %>
<%@ page import="java.util.*, java.text.*" %>
<html><head><title> JSP </title>
<META http-equiv=Content-Type
content="text/html; charset=windows-1251">
</head><body>
Hello, World!<p>
<%= getFormattedDate() %>
</body></html>
<%!
String getFormattedDate(){
SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy hh:mm");
return sdf.format(new Date());
}
%>
666
V. Web- Java
, , 27.1, . Tomcat
Jasper.
JSP. . , , JSP.
JSP Web- (Web
Components). , JSP,
Web- (Web Container JSP Container). ,
, JSP, , HTML XML,
, , Web- (Web
Application).
HTML, JSP HTML
(template HTML), . . JspWriter, Writer.
8 , buffer
<%@ page>. . .
, JSP,
jsp , HTML,
. JSP
, .
JSP,
XML, 28. JSP
XML
http://java.sun.com/JSP/Page, , , jsp:. JSP, XML, (actions) JSP.
, JSP, 27.1,
XML , 27.2.
27.2. JSP XML
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0">
<jsp:directive.page
contentType="text/html;charset=windows-1251" />
<jsp:directive.page
import="java.util.Date, java.text.SimpleDateFormat" />
<jsp:text>
<![CDATA[
<html><head><title> JSP </title>
<META http-equiv=Content-Type
content="text/html; charset=windows-1251">
</head><body>
Hello, World!<p>
]]>
</jsp:text>
27. JSP
667
<jsp:expression>getFormattedDate()</jsp:expression>
<jsp:text>
<![CDATA[
</body></html> ]]>
</jsp:text>
<jsp:declaration>
String getFormattedDate(){
SimpleDateFormat sdf = new SimpleDateFormat("dd-MMMM-yyyy hh:mm");
return sdf.format(new Date());
}
</jsp:declaration>
</jsp:root>
, :
<jsp: _ ></jsp:>
!
, .
, , , :
<jsp: _ />
XML- ,
, .
"JavaServer Pages Specification" JSP XML. HTML,
<%...%>, JSP (JSP Page), XML
<jsp:.../> JSP (JSP Document).
JSP jsp, JSP jspx.
JSP ,
XML.
http://java.sun.com/JSP/Page
668
V. Web- Java
CDATA. XML,
XML (XML View).
() JSP
JSP .
:
JSP , Java;
, , -
, ;
, .
JSP, XML.
JSP
<%-- --%>
<!-- -->
. , ,
. HTML-. JSP-, , .
Java
<%! %>
<jsp:declaration> </jsp:declaration>
.
Java
<%= %>
<jsp:expression> </jsp:expression>
, . ,
, ,
, .
Java, JSP (scriptlet), , ,
<% %>
<jsp:scriplet> </jsp:scriptlet>
_jspService() , service().
<%@ include file="URL " %>
<jsp:directive.include file="URL " />
27. JSP
669
JSP
<%@ page %>
<jsp:directive.page />
JSP;
session="true false" ,
"true";
"true"; "false",
;
isThreadSafe="true false" -
, "true"; "false",
SingleThreadModel;
info="- " ,
getServletInfo();
, ;
isErrorPage="true false" JSP -
exception, ,
"false".
. , JSP
, , Web-
HTML c .
. errorPage HTML
- exception JSP, . isErrorPage -
"true".
, , JSP:
<html><body>
<%@ page errorPage="myerrpage.jsp" %>
<%
String str = <%= request.getParameter("name") %>;
int n = str.length();
%>
</body></html>
670
V. Web- Java
<%...%> .
XML.
, JSP,
<jsp:include />
.
page=" URL JSP"
URL. getParameter(String).
, ,
flush="true false"
, .
"false".
, include, <jsp:param> (
):
<jsp:include >
<jsp:param>
</jsp:include>
.
<jsp:param name=" "
value=" JSP" />
" JSP" , .
, , ,
.
JSP- , JSP. jspf (JSP Fragment).
27. JSP
671
<jsp:text> . . :
<jsp:text>
while(k < 10) {a[k]++; b[k++] = $1;}
</jsp:text>
, , , JSP , , init() . -
jspInit() :
<jsp:declaration>
public void jspInit(){
//
}
</jsp:declaration>
, jspDestroy()
:
<jsp:declaration>
public void jspDestroy(){
//
}
</jsp:declaration>
EL
JSP Java <%=...%>
XML <jsp:expression>...</jsp:expression>, JSP, 2.0, EL (Expression Language), .
JSP EL JSP "" .
JSP EL ${...}, ${2 + 2}. . , -
672
V. Web- Java
, .
boolean, long, float , . null
.
+, -, *, /, %, ==, !=, <, >, <=, >=, !, &&, || ?:. ,
"", " ", "", "", " ", "
" , eq,
ne, lt, gt, le, ge "equal", "not equal", "less than", "greater", "less than or equal", "greater
or equal". "" ""
XML. div,
mod, not, and or.
, ${name},
, ${pageContext.request.requestURI}. JSP EL :
pageContext PageContext;
pageScope Map, ;
requestScope Map, ;
sessionScope Map, ;
applicationScope Map, -
;
param Map, ,
ServletRequest.getParameter(String name);
paramValues Map, , -
ServletRequest.getParameterValues(String name);
header Map, ,
ServletRequest.getHeader(String name);
headerValues Map, , -
ServletRequest.getHeaders(String name);
initParam Map, , -
ServletContext.getInitParameter(String name);
cookie Map, Cookie.
, JSP EL .
JSP
JSP
, JSP , JSP. request
27. JSP
673
exception.
.
, :
request ServletRequest, HttpServletRequest;
response ServletResponse, HttpServletResponse;
config ServletConfig;
application ServletContext;
session HttpSession;
pageContext PageContext;
out JspWriter;
page Object;
exception Throwable.
27.3 JSP, , .
27.3. JSP,
<%@ page import="java.sql.*"
contentType="text/html;charset=windows-1251" %>
<html><head><title> </title></head>
<body>
<h2>
<%= (request.getRemoteUser() != null ? ", " +
request.getRemoteUser() : "") %>!
</h2><hr><p>
<%
try{
Connection conn =
DriverManager.getConnection(
(String)session.getValue("connStr"), "sdoadmin", "sdoadmin");
Statement st = conn.createStatement ();
ResultSet rs = st.executeQuery ("SELECT name, mark " +
"FROM students ORDER BY name");
if (rs.next()){
%>
<table border=1>
<tr>
<th width=200> <i></i> </th>
<th width=100> <i></i> </th>
</tr>
<tr>
<td> <%= rs.getString(1) %> </td>
674
V. Web- Java
JavaBean
JSP Java,
JavaBeans.
<jsp:useBean id=" "
[ scope="page request session application" ]
/>
27. JSP
675
scope "page", -
PageContext.
scope "request",
ServletRequest.
scope "session",
HttpSession.
, scope "application", -
ServletContext.
id
JavaBean. " "
:
class=" " [ type=" " ]
beanName=" JSP"
type=" "
type=" "
JavaBean .
(property) <jsp:useBean> JavaBean
id="myBean"
<jsp:setProperty name="myBean"
property="" value=" JSP" />
<jsp:setProperty name="myBean"
property="" param=" " />
JavaBean , , param.
<jsp:setProperty name="myBean" property="*" />
, JavaBean
.
JavaBean "myBean"
<jsp:getProperty name="myBean" property=" " />
property .
Java Plug-in,
676
V. Web- Java
, <jsp:plugin> <applet>
HTML. code codebase, .class. codebase
, , JSP.
<applet>:
name=" ";
archive=" URL ";
align="bottom top, middle, left, right";
height=" JSP";
width=" JSP";
hspace=" ";
vspace=" ";
jreversion=" JRE, 1.2";
nspluginurl=" URL, Java Plug-in Netscape
Communicator";
<jsp:params>
<jsp:param name="" value=" JSP" />
</jsp:params>
. , , , .
<jsp:fallback> </jsp:fallback>
JSP : JSP,
HTML.
<jsp:forward page=" URL " />
, . JSP. , ,
<jsp:forward>, .
27. JSP
677
:
<jsp:forward page=" URL " >
<jsp:param name="" value=" JSP" />
</jsp:forward>
JSP () JSP,
, , (custom tags). ,
. XML- tld, TLD (Tag Library Descriptor).
WEB-INF Web- .
Web- JAR-, TLD-, , META-INF
.
27.4 TLD-,
head, HeadTag. XML .
27.4. TLD
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd"
version="2.0">
<tlib-version>1.0</tlib-version>
<short-name></short-name>
<uri>/sdo</uri>
<tag>
<name>head</name>
<tag-class>sdotags.HeadTag</tag-class>
<body-content>JSP</body-content>
<attribute>
<name>size</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
JSP
<%@ taglib uri=" URI "
prefix=" " %>
678
V. Web- Java
, JSP
<%@ taglib uri="/WEB-INF/sdotaglib.tld" prefix="sdo" %>
<sdo:head />.
XML-. XML xmlns <jsp:root>.
, sdo /WEB-INF/sdotaglib.tld :
<jsp:root
xmlns:jsp="http://java.sun.com/JSP/Page"
xmlns:sdo="/WEB-INF/sdotaglib.tld"
version="2.0"
>
JSP
</jsp:root>
<jsp:root>, , XML.
, JSP
jsp. (core) JSP . jsp, jspx, java,
javax, servlet, sun, sunw Sun Microsystems, .
web.xml URI <taglib>, :
<taglib>
<taglib-uri>/sdo</taglib-uri>
<taglib-location>/WEB-INF/sdotaglib.tld</taglib-location>
</taglib>
JSP :
<%@ taglib uri="/sdo" prefix="sdo" %>
27. JSP
679
, ,
, TagSupport,
, , BodyTagSupport.
, , WEB-INF/classes,
JAR- WEB-INF/lib Web-.
Web-, - , common/lib.
, , TLD-, ,
XML- <tag>. , XML- <attribute>,
. :
<tag>
<name>reg</name>
<tag-class>sdotags.RegTag</tag-class>
<body-content>EMPTY</body-content>
<attribute>
<name>name</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
<type>java.lang.String</type>
</attribute>
</tag>
JSP <sdo:reg>, :
<sdo:reg name="%=request.getParameter(\"name\") %" />
JSP EL:
<sdo:reg name="${param.name}" />
RegTag sdotags.
-
, - , ,
, Tag
TagSupport. ,
- BodyTag
BodyTagSupport.
SimpleTag SimpleTagSupport.
Tag
public int doStartTag();
, .
, . Tag, :
EVAL_BODY_INCLUDE ;
SKIP_BODY .
680
V. Web- Java
public int doEndTag();
, .
Tag:
EVAL_PAGE JSP;
SKIP_PAGE JSP.
IterationTag
public int doAfterTag();
.
doEndTag(). doAfterTag() EVAL_BODY_AGAIN
IterationTag, ,
SKIP_BODY .
BodyTag .
, doStartTag() EVAL_BODY_BUFFERED BodyTag.
public void doInitBody();
.
,
PageContext, Web- JSP. Tag BodyTag
getPageContext() JspFactory,
JspFactory getDefaultFactory().
, ,
TagSupport BodyTagSupport.
, , , TagSupport,
BodyTagSupport.
PageContext
pageContext.
TagSupport :
public int doStartTag() throws JspException{
return SKIP_BODY;
}
public int doEndTag() throws JspException{
return EVAL_PAGE;
}
public int doAfterBody() throws JspException{
return SKIP_BODY;
}
27. JSP
681
BodyTagSupport doStartTag() :
public int doStartTag() throws JspException{
return EVAL_BODY_BUFFERED;
}
doInitBody() .
, TagSupport,
doStartTag(). , ,
, :
<sdo:info />
, 27.5.
27.5.
package sdotags;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
public class InfoTag extends TagSupport{
public int doStartTag() throws JspException{
pageContext.getOut().print(" .");
return SKIP_BODY;
}
}
27.5
, . Java : WEB-INF/classes sdotags InfoTag.class.
doTag() SimpleTag,
SimpleTagSupport. , ,
doStartTag() doEndTag().
JavaBean, . . , , getXxx() setXxx().
, (. . " " )
<sdo:reg name="" />
682
V. Web- Java
27.6.
package sdotags;
import javax.servlet.jsp.*;import javax.servlet.jsp.tagext.*;
public class RegTag extends TagSupport{
private String name;
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public int doStartTag() throws JspException{
if (name == null)
name = pageContext.getRequest().getParameter("name");
registrate(name);
return SKIP_BODY;
}
}
, TLD-
<body-content> EMPTY JSP
, JSP .
<body-content> . tagdependent
, JSP, - , SQL. scriptless ,
.
, ,
Tag
TagSupport. doStartTag() EVAL_BODY_INCLUDE,
.
, , sdotaglib.tld head:
<tag>
<name>head</name>
<tag-class>sdotags.HeadTag</tag-class>
<body-content>JSP</body-content>
<attribute>
<name>size</name>
<required>false</required>
27. JSP
683
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
HeadTag, 27.7.
27.7.
package sdotags;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
public class HeadTag extends TagSupport{
private String size = "4";
public String getSize(){
return size;
}
public void setSize(String size){
this.size = size;
}
public int doStartTag(){
try{
JspWriter out = pageContext.getOut();
out.print("<font size=\"" + size + "\">");
}catch(Exception e){
System.err.println(e);
}
return EVAL_BODY_INCLUDE;
}
public int doEndTag(){
try{
JspWriter out = pageContext.getOut();
out.print("</font>");
}catch(Exception e){
System.err.println(e);
}
return EVAL_PAGE;
}
}
JSP
<sdo:head size = "2" >
<jsp:expression>new java.util.Date()</jsp:expression>
</sdo:head>
, , .
684
V. Web- Java
, -
BodyTag BodyTagSupport. doStartTag()
EVAL_BODY_BUFFERED. doStartTag(),
, doInitBody(),
. doAfterBody(),
,
BodyContent.
BodyContent JspWriter, ,
. ,
.
BodyContent doAfterBody(),
.
BodyContent :
public BodyContent getBodyContent();
BodyTagSupport , pageContext, :
BodyContent bc = pageContext.pushBody();
BodyContent :
public Reader getReader();
public String getString();
out
out, ,
BodyContent. :
public JspWriter getPreviousOut();
BodyTagSupport
public JspWriter getEnclosingWriter();
BodyContent.
. query, TLD- sdotaglib.tld :
<tag>
<name>query</name>
<tag-class>sdotags.QueryTag</tag-class>
<body-content>tagdependent</body-content>
<attribute>
<name>size</name>
27. JSP
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
SQL-, :
<sdo:query>
SELECT * FROM students
</sdo:query>
27.8 .
27.8. SQL-
package sdotags;
import java.sql.*;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
public class QueryTag extends BodyTagSupport{
private Connection conn;
private ResultSet rs;
public int doStartTag(){
// . . .
return EVAL_BODY_BUFFERED;
}
public void doInitBody(){
conn = DriverManager.getConnection(. . .);
//
}
public int doAfterBody(){
BodyContent bc = getBodyContent();
if (bc == null) return SKIP_BODY;
String query = bc.getString();
try{
Statement st = conn.createStatement();
rs = st.executeQuery(query);
//
JspWriter out = bc.getEnclosingWriter();
out.print(" ");
}catch(Exception e){
System.err.println(e);
}
685
V. Web- Java
686
return SKIP_BODY;
}
public int doEndTag(){
conn = null;
return EVAL_PAGE;
}
}
, JSP, . , , ,
JSP. . , , HTML <tr>
<table>. <table> <tr>,
. XML.
JSP , . ,
<sdo:connection source=" " >
, source.
, :
<sdo:connection source="SDO" >
<sdo:query >
SELECT * FROM students
</sdo:query>
<sdo:insert>
INSERT INTO students (name) VALUES ('')
</sdo:insert>
</sdo:connection>
, -
. - . ,
TagSupport BodyTagSupport. TLD- , , :
<tag>
<name>connection</name>
<tag-class>sdotags.ConnectionTag</tag-class>
</tag>
<tag>
<name>query</name>
<tag-class>sdotags.QueryTag</tag-class>
</tag>
<tag>
<name>insert</name>
<tag-class>sdotags.InsertTag</tag-class>
</tag>
27. JSP
687
. , "" parent
public void setParent(Tag parent);
public Tag getParent();
public static final Tag findAncestorWithClass(Tag from, Class class);
, . this, Tag .
, .
, ConnectionTag, connection, , 27.9.
27.9.
public class ConnectionTag extends TagSupport{
private Connection conn;
public Connection getConnection(){
return conn;
}
public int doStartTag(){
Connection conn = DriverManager.getConnection(url, user, password);
if (conn == null) return SKIP_BODY;
return EVAL_BODY_INCLUDE;
}
public int doEndTag(){
conn = null;
return EVAL_BODY;
}
}
V. Web- Java
688
public int doStartTag(){
parent = (ConnectionTag)findAncestorWithClass(this,
ConnectionTag.class);
if (parent == null) return SKIP_BODY;
return EVAL_BODY_INCLUDE;
}
public int doAfterBody(){
Connection conn = parent.getConnection();
//
return SKIP_BODY;
}
}
obj - .
public void setAttribute(String name, Object obj);
PageContext. , .
,
public void setAttribute(String name, Object obj, int scope);
.
: PAGE_SCOPE, APPLICATION_SCOPE, REQUEST_SCOPE, SESSION_SCOPE.
public Object getAttribute(String name, int scope);
public Object getAttribute(String name);
PageContext.
,
(scripting variable). .
,
. .
TLD- <variable>, .
:
<name-given> ;
<name-from-attribute> , -
.
:
<variable-class> , String;
<declare> ,
true;
27. JSP
689
<scope> , :
NESTED
doStartTag(), doInitBody(), doEndBody();
AT_BEGIN
AT_END
, . .
;
:
<tag>
<name>tagname</name>
<tag-class>sdotags.SomeTag</tag-class>
<variable>
<name-given>varname</name-given>
<variable-class>java.lang.String</variable-class>
<declare>true</declare>
<scope>AT_END</scope>
</variable>
</tag>
, ,
<variable>. TagExtraInfo.
, :
public class MyTei extends TagExtraInfo{
public VariableInfo[] getVariableInfo(TagData data){
return new VariableInfo[]{
new VariableInfo(data.getAttributeString("id"),
"java.lang.String", true, VariableInfo.AT_END)
};
}
}
, <variable>. TagExtraInfo
TagData, ,
TLD-.
TagExtraInfo
public boolean isValid(TagData info);
JSP.
V. Web- Java
690
, , JSP,
, errorPage <%@ page %>.
, TryCatchFinally.
TryCatchFinally :
public void doCatch(Throwable thr);
public void doFinally();
JSP
JSP ,
Java, ,
Java JSP, .
- JSP tag,
XML, tagx. , -, tagf.
, <sdo:info />, 27.5, , , JSP, tag-
info.tag:
<jsp:root
xmlns:jsp="http://java.sun.com/JSP/Page"
27. JSP
691
version="2.0" >
.
</jsp:root>
<jsp:root> , info.tag
:
.
- JSP,
page.
JSP tag. :
<%@ tag body-content="scriptless">
reg.tag, ,
<%@ attribute name="name"
required="true"
fragment="false"
rtexprvalue="false"
%>
<%@ attribute name="age"
type="java.lang.Integer"
%>
type ,
java.lang.String.
JSP, . . javax.servlet.jsp.tagext.
JspFragment. type rtexprvalue ,
fragment="true".
, ,
"" "25", reg.tag ${name} ${age}.
, variable, <variable>
TLD-, -. :
<%@ variable name-given="x"
variable-class="java.lang.Integer"
scope="NESTED"
declare="true"
%>
692
V. Web- Java
scope, ,
. " "
TLD-.
, JSP,
Web-, tag-.
Web- ,
JSP, tag-
<jsp:invoke>. , , price :
<%@ attribute name="price"
fragment="true"
%>
Web- tag- :
<jsp:invoke fragment="price"/>
JSTL
JSP,
. . , , http://www.servletsuite.com/jsp.htm. Jakarta Struts, http://struts.apache.org/.
, .
Sun Microsystems , JSTL (JSP Standard Tag Library). javax.servlet.jsp.jstl . , , http://www.oracle.com/technetwork/
java/index-jsp-135995.html. , JSTL
27. JSP
693
core
core JSP
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
, . Java, JSP.
<c:out> value
out. , default, , ,
.
:
, <c:out value="${name}"
default="" />!
<c:set> , var,
scope. :
<c:set var="name" scope="session" value="${param.name}"/>
, :
<c:set var="name" scope="session">
${param.name}
</c:set>
<c:remove> , :
<c:remove var="name" scope="session"/>
<c:url> , , URL. :
<c:url var="bhv" value="http://www.bhv.ru"/>
, :
<c:url var="name">
http://www.bhv.ru
</c:url>
bhv , , HTML:
<a href="${bhv}"></a>
URL <c:param>,
:
<c:url var="bhv" value="http://www.bhv.ru">
<c:param name="id" value="${book.id}"/>
694
V. Web- Java
<c:if> , test .
, . :
<c:if test="${age <= 0}">
${name}! , , .
</c:if>
, "if-then-else".
<c:choose>.
<c:choose> <c:when> <c:otherwise> .
:
<c:choose>
<c:when test="${balance < 0}" >
.
</c:when>
<c:when test="${balance == 0}" >
.
</c:when>
<c:when test="${balance > 0}" >
.
</c:when>
<c:otherwise>
.
</c:otherwise>
</c:choose>
27.11 ,
<c:choose>. , . , , .
27.11. , JSTL
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head><title> </title></head>
<body>
<c:choose>
<c:when test="${user != null}">
, ${user.name}!
</c:when>
<c:otherwise>
<form method="POST" action="/sdo/jsp/user.jsp">
:
<input type="text" name="name">
: <input type="password" name="pswd">
<input type="submit" name="ok" value="">
</form>
27. JSP
695
</c:otherwise>
</c:choose>
</body>
</html>
<c:forEach> . ,
Collection Map, items.
, var.
.
:
<c:forEach var="item" items="${sessionScope.cart.items}">
<td>
${item.quantity}
</td>
</c:forEach>
<c:forEach> ,
, var, ,
begin, , end,
step. :
<c:forEach var="k" begin="0" step="1" end="${n}" >
<td>
${k}-
</td>
</c:forEach>
696
V. Web- Java
. doEndTag() SKIP_PAGE. :
<c:redirect url="/books/list.html" context="/lib" />
context .
<c:redirect>, <c:url>, <c:param>, .
xml
xml,
<%@ taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="x" %>
fmt
fmt , JSP.
:
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
, value,
Number Date , n d pattern.
DecimalFormat SimpleDateFormat java.text
, Java SE.
27. JSP
697
sql
, sql,
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
: <sql:setDataSource>, <sql:query>,
<sql:update> <sql:transaction>. JDBC
JDBC, :
<sql:setDataSource driver="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@localhost:1521:ORCL"
user="scott"
password="tiger"
/>
<sql:query var="depts" >
select * from DEPT
</sql:query>
<sql:transaction>
<sql:update>
insert into DEPT values(50, 'XXX', 'YYY')
</sql:update>
</sql:transaction>
fn
, fn, .
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
Frameworks
Web-, . MVC (Model-View-Controller)
(. 3). , , . , ,
698
V. Web- Java
JavaServer Faces
Framework JSF (JavaServer Faces) ,
HTML. Java EE,
JSF
Java EE. JSF.
, GlassFish,
http://javaserverfaces.dev.java.net/.
Apache MyFaces, http://myfaces.apache.org/.
JSF . - , JSF .
. JSF JAR- jsf-api.jar jsf-impl.jar lib, Web- CLASSPATH. JSF JSTL,
, Web- JAR-, jstl-1.2.jar.
JSF MVC (Model-View-Controller),
3.
JSF FacesServlet. ,
web.xml.
:
<web-app>
. . . . .
<servlet>
27. JSP
699
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
</servlet>
. . . . .
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.faces</url-pattern>
</servlet-mapping>
. . . . .
</web-app>
JSF c
http://localhost:8080/MyAppl/index.faces,
http://localhost:8080/MyAppl/login.faces
<servlet-mapping> -:
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
JSF :
http://localhost:8080/MyAppl/faces/index.jsp,
http://localhost:8080/MyAppl/faces/login.jsp
, index.jsp login.jsp.
faces JSF,
. index.faces, JSF index.jsp.
JSF . JSF
: core html. JSP
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
V. Web- Java
700
html , . ,
, , (custom components), JSF.
JSF, .
html ,
, . JSF ,
JavaScript
JSF. - . ,
<v:valueChangeListener>, 27.12. ,
html Swing, ,
, . , JSF , IDE. "" , ,
Java Studio Creator.
27. JSP
701
, .
- JSF .
XML- faces-config.xml,
WEB-INF web.xml. 27.14.
27.14. JSF
<?xml version='1.0' encoding='UTF-8'?>
<faces-config xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd"
version="1.2">
<managed-bean>
<description>
V. Web- Java
702
-
</description>
<managed-bean-name>cashier</managed-bean-name>
<managed-bean-class>myjsf.Cashier</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<navigation-rule>
<from-view-id>/index.jsp</from-view-id>
<navigation-case>
<description>
welcome.jsp
</description>
<from-outcome>success</from-outcome>
<to-view-id>/welcome.jsp</to-view-id>
</navigation-case>
<navigation-case>
<description>
index.jsp
</description>
<from-outcome>failure</from-outcome>
<to-view-id>/index.jsp</to-view-id>
</navigation-case>
</navigation-rule>
</faces-config>
JSF .
JSF http://jsfcentral.com/. JSF http://www.jsftutorials.net/. .
27. JSP
703
1. JSP?
2. JSP HTML ?
3. Java JSP?
4. JSP ?
5. JSP ?
6. JSP?
7. Java, -
?
8. Java, JSP?
9. JSP?
28
Java XML
Web- HTML (HyperText Markup
Language) . , , HTML. ,
HTML, ,
.
! ,
"", ,
, .
, ""
HTML. HTML,
.
HTML , Web-.
, ,
, .
HTML , "". HTML . ,
. CSS (Cascading Style Sheet)
SSI (Server Side Include)
. , - , .
. 1986 SGML (Standard Generalized Markup Language), HTML. SGML , , . , SGML, DTD
(Document Type Definition) , . -
705
SGML- .
, .
. , : , , . ., , , , , , . , , ,
- , . , .
SGML , .
, .
, man- Solaris Operational Environment SGML.
SGML HTML XML (eXtensible Markup
Language) . SGML, , Web-
. XML , , , .
XML,
. . , ,
. , , , , ,
, , , , , : . ,
, 28.1.
28.1. XML-
<?xml version="1.0" encoding="Windows-1251"?>
<!DOCTYPE notebook SYSTEM "ntb.dtd">
<notebook>
<person>
<name>
<first-name></first-name>
<second-name></second-name>
<surname></surname>
</name>
<birthday>25.03.1977</birthday>
<address>
<street>, 2315</street>
V. Web- Java
706
<city></city>
<zip>123456</zip>
</address>
<phone-list>
<work-phone>2654321</work-phone>
<work-phone>2654023</work-phone>
<home-phone>3456781</home-phone>
</phone-list>
</person>
<person>
<name>
<first-name></first-name>
<second-name></second-name>
<surname></surname>
</name>
<birthday>17.05.1969</birthday>
<address>
<street>, 17</street>
<city></city>
<zip>234561</zip>
</address>
<phone-list>
<home-phone>2334455</home-phone>
</phone-list>
</person>
</notebook>
XML , .
XML (XML declaration),
28.1, XML, , XML
(standalone="yes"/"no"). UTF-8.
XML
(root element), 28.1 <notebook>. , (document type declaration). (
DTD!) DOCTYPE.
28.1.
DOCTYPE DTD:
<!DOCYPE notebook [ DTD ]>
DTD XML.
. DTD -
707
,
: SYSTEM PUBLIC. SYSTEM URI DTD,
PUBLIC, , .
XML . , , :
< > </ >
, .
XML, HTML,
. (empty ),
"/>", :
<br />
!
, XML, HTML, .
28.1 , XML . , ,
. , , , .
. . 28.1 , 28.1.
. 28.1. XML
HTML XML .
. , , , . .
, <work-phone> <homephone>, <phone-list>, <phone-
V. Web- Java
708
list>. , <name> , , ,
. <name>
"/>". 28.2 .
28.2. XML-
<?xml version="1.0" encoding="Windows-1251"?>
<!DOCTYPE notebook SYSTEM "ntb.dtd">
<notebook>
<person>
<name first="" second="" surname="" />
<birthday>25.03.1977</birthday>
<address>
<street>, 2315</street>
<city></city>
<zip>123456</zip>
</address>
<phone-list>
<work-phone>2654321</work-phone>
<work-phone>2654023</work-phone>
<home-phone>3456781</home-phone>
</phone-list>
</person>
<person>
<name first="" second="" surname="" />
<birthday>17.05.1969</birthday>
<address>
<street>, 17</street>
<city></city>
<zip>234561</zip>
</address>
<phone-list>
<home-phone>2334455</home-phone>
</phone-list>
</person>
</notebook>
. ,
, , .
709
<city> type, : , , . :
<city type=""></city>
<notebook>,
<person>, <name>, <address>, <street>, <city>, <zip>, <phone-list>, <work-phone>, <home-phone>
, . . .
<notebook> ,
<person> .
<person> <name>, , -
<address> <phone-list>.
<name> .
<name> : first, second, surname,
.
<address> <street>, <city> <zip>.
<street> <city> .
<zip> .
<city> type,
: , . .
<phone-list> , -
<work-phone> <home-phone>.
<work-phone> <home-phone> ,
.
, XML, . : DTD,
XML SGML, XSD (XML Schema Definition
Language).
DTD
DTD 28.3.
28.3. DTD XML
<!ELEMENT notebook (person)*>
<!ELEMENT person (name, birthday?, address*, phone-list?)>
<!ELEMENT name EMPTY>
<!ATTLIST name
first CDATA #IMPLIED
second CDATA #IMPLIED
surname CDATA #REQUIRED>
<!ELEMENT birthday (#PCDATA)>
710
V. Web- Java
, DTD . . ELEMENT , . .
. EMPTY 28.3
.
ATTLIST .
, .
, CDATA (Character DATA), Unicode, .
type <city>, : ,
. .
:
#REQUIRED ;
#IMPLIED ;
#FIXED , DTD.
711
DTD XML ,
, .
(validating
parsers). , XML, .
Sun Microsystems
JAXP (Java API for XML Processing), Java SE. ,
http://jaxp.java.net/.
Microsoft MSXML (Microsoft XML
Parser), http://msdn.microsoft.com/xml/.
, , , Apache Xerces2, XML, . http://xerces.apache.org/
xerces2-j/.
DTD
XML. , DTD , . , 28.3
DTD , <birthday> . DTD XML.
XSD.
XML (XML Schema).
, XML, XML .
XML
XML
, ,
XML , -
. Java , , a,
, - com.mydomain.myhost.mypack.MyClass.a.
, .
XML : .
,
, URI.
- , . ,
, , , http://some.firm.com/
2008/ntbml.
(namespace).
,
. Java import. XML .
712
V. Web- Java
, . xmlns :
<ntb:notebook xmlns:ntb = "http://some.firm.com/2008/ntbml">
, ntb ,
ntb:notebook.
, http://some.firm.com/2008/ntbml, ntb, :
<ntb:city ntb:type=""></ntb:city>
, ntb:city,
(Qualified Name, QName).
URI,
http://some.firm.com/2008/ntbml, XML , , .
Web- .
,
, http://www.w3.org/TR/RECxml-names, , DNS-
, . URI
, .
URL , XML,
XML.
, ,
. , http://some.firm.com/2008/Ntbml
XML-, http://some.firm.com/
2008/ntbml, , .
SGML XML , ,
. , DTD .
. , Xerces
setNamespaceAware(true).
xmlns, , XML,
.
, xmlns, .
, :
<ntb:notebook xmlns:ntb = "http://some.firm.com/2008/ntbml"
xmlns:bk = "http://some.firm.com/2008/bookml">
, ,
, (default namespace).
, XHTML HTML XML . , title.
HTML, :
713
XHTML, http://www.w3.org/1999/xhtml, ,
, .
.
, , .
. , -
<nb:notebook xmlns:nb = "http://some.firm.com/2008/ntbml">
nb:
<nb:city nb:type=""></nb:city>
,
, , .
, ,
XML.
XML
2001 W3C
XML XSD (XML Schema Definition Language).
XML (XML Schema), XML.
XML XML. (components), XML.
<schema>. XML . XML,
, http://www.w3.org/XML/Schema.html,
13 , ,
, .
XSD XML. (simple) XML ,
714
V. Web- Java
. , (complex) / . XML
, .
.
.
XSD
XSD , , , ,
, URI. .
XSD : decimal, float double.
decimal , :
123.45, 0.1234567689345 . . : . XSD , , 18 . java.math.BigDecimal, 4.
float double IEEE754-85 Java.
.
integer decimal,
. : 34567,
123456789012345 . . java.math.BigInteger,
4.
long, int, short byte Java.
integer, : byte short, int
. .
nonPositiveInteger negativeInteger integer .
nonNegativeInteger positiveInteger integer .
nonNegativeInteger unsignedLong,
unsignedInt, unsignedShort unsignedByte.
string Unicode.
java.lang.String.
normalizedString string , '\n', '\r' '\t'.
715
token normalizedString , ,
.
token . language
RFC 1766, : ru, en, de, fr. NMTOKEN
. name
XML , , , , , , ( X, x,
M, m, L, l ) . name .
name NCName (Non-Colonized Name) , , , , : ID, ENTITY, IDREF, XML, .
duration , P1Y2M3DT10H30M45S (1Y), (2M), (3D), (10H), (30M)
(45S). , P120M
120 , T120M 120 .
dateTime CCYYMMDDThh:mm:ss, 200804
2509:30:05. - .
time hh:mm:ss.
date CCYYMMDD.
gYearMonth CCYYMM.
gMonthDay MMDD.
gYear CCYY, gMonth MM, gDay
DD.
: 0B2F, 356C0A . ., hexBinary, Base64,
base64Binary.
,
XML.
URI anyURI.
(qualified name), . . , , QName.
NOTATION DTD XML.
, , ,
.
716
V. Web- Java
XML . (restriction)
, (list) (union)
.
<simpleType>, :
<xsd:simpleType name=" "> </xsd:simpleType>
<restriction>,
base , ,
. , zip
:
<xsd:simpleType name="zip">
<xsd:restriction base="xsd:string">
<xsd:pattern value="[0-9]{6}" />
</xsd:restriction>
</xsd:simpleType>
zip ,
100 000 999 999:
<xsd:simpleType name="zip">
<xsd:restriction base="xsd:positiveInteger">
<xsd:minInclusive value="100000" />
<xsd:maxInclusive value="999999" />
</xsd:restriction>
</xsd:simpleType>
decimal;
<fractionDigits> ;
<length> ;
<maxLength> ;
717
<minLength> ;
<enumeration> ;
<pattern> [8];
<whiteSpace> string -
replace
collapse
,
.
- , (fundamental facets):
ordered ,
:
false
partial
total
bounded true
false;
cardinality finite
countably infinite;
- , , ,
. , XML , :
<days>21 34 55 46</days>
<list>, itemType
.
<list>. , XML <days>
:
<xsd:element name="days" type="listOfInteger" />
V. Web- Java
718
listOfInteger
:
<xsd:simpleType name="listOfInteger">
<xsd:restriction>
<xsd:simpleType>
<xsd:list itemType="xsd:integer" />
</xsd:simpleType>
<xsd:maxLength value="5" />
</xsd:restriction>
</xsd:simpleType>
- <union>,
memberTypes . :
<xsd:union memberTypes="xsd:string xsd:integer listOfInteger" />
<union> , . :
<xsd:attribute name="size">
<xsd:simpleType>
<xsd:union>
<xsd:simpleType>
<xsd:restriction base="xsd:positiveInteger">
<xsd:minInclusive value="8"/>
<xsd:maxInclusive value="72"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType>
<xsd:restriction base="xsd:NMTOKEN">
<xsd:enumeration value="small"/>
<xsd:enumeration value="medium"/>
<xsd:enumeration value="large"/>
</xsd:restriction>
</xsd:simpleType>
719
</xsd:union>
</xsd:simpleType>
</xsd:attribute>
size , , :
<font size='large'> 28</font>
<font size='12'> </font>
, XML, <element>:
<xsd:element name=" " type=" "
minOccurs=" "
maxOccurs=" " />
minOccurs maxOccurs 1.
, ,
XML .
<element>:
<xsd:element name=" " >
</xsd:element>
:
<xsd:attribute name=" " type=" "
use=" " default=" " />
use :
optional ( );
required ;
prohibited . -
, .
, default .
<attribute>:
<xsd:attribute name=" ">
</xsd:attribute>
, ,
/ .
720
V. Web- Java
<complexType>, :
<xsd:complexType name=" " > </xsd:complexType>
name , <complexType> , , / .
,
, .
.
, , . , , <name>
28.2. <attribute>, :
<xsd:complexType name="imageType">
<xsd:attribute name="href" type="xsd:anyURI" />
</xsd:complexType>
<image> imageType:
<xsd:element name="image" type="imageType" />
XML :
<image href="http://some.com/images/myface.gif" />
,
.
<simpleContent>.
<restriction>, <extension>, base
() .
<extension>
. , :
<xsd:complexType name="calcResultType">
<xsd:simpleContent>
<xsd:extension base="xsd:decimal">
<xsd:attribute name="unit" type="xsd:string" />
<xsd:attribute name="precision"
type="xsd:nonNegativeInteger" />
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
721
<result> :
<xsd:element name="result" type="calcResultType" />
XML
<result unit="" precision="2">123.25</result>
<restriction>
/ , , base. :
<xsd:complexType name="calcResultType">
<xsd:simpleContent>
<xsd:restriction base="xsd:decimal">
<xsd:totalDigits value="8" />
<xsd:attribute name="unit" type="xsd:string" />
<xsd:attribute name="precision"
type="xsd:nonNegativeInteger" />
</xsd:restriction>
</xsd:simpleContent>
</xsd:complexType>
, , , , <address>, <phone-list> 28.2,
(model
group) . , , , ,
, , .
.
: <sequence>, <all> <choice>.
<sequence> , . , ,
. :
<xsd:complexType name="bookType">
<xsd:sequence maxOccurs="unbounded">
<xsd:element name="author" type="xsd:normalizedString"
minOccurs="0" />
<xsd:element name="title" type="xsd:normalizedString" />
<xsd:element name="pages" type="xsd:positiveInteger"
minOccurs="0" />
<xsd:element name="publisher" type="xsd:normalizedString"
minOccurs="0" />
</xsd:sequence>
</xsd:complexType>
V. Web- Java
722
:
<xsd:element name="book" type="bookType" />
<xsd:sequence> <xsd:all>,
<author>, <title>, <pages> <publisher> .
<choice> ,
. , , <publisher>, . :
<xsd:complexType name="bookType">
<xsd:sequence maxOccurs="unbounded">
<xsd:element name="author" type="xsd:normalizedString"
minOccurs="0" />
<xsd:element name="title" type="xsd:normalizedString" />
<xsd:element name="pages" type="xsd:positiveInteger"
minOccurs="0" />
<xsd:choice>
<xsd:element name="publisher" type="xsd:normalizedString"
minOccurs="0" />
<xsd:element name="magazine" type="xsd:normalizedString"
minOccurs="0" />
</xsd:choice>
</xsd:sequence>
</xsd:complexType>
, <choice>
<sequence>. , , <sequence> <choice>. . ,
, . . <choice>
maxOccurs="unbounded".
<all> <sequence> <choice>.
<all> <sequence> <choice>. , <sequence> <choice> <all>. , <all>, , . .
maxOccurs .
723
, ,
, , ,
. <complexContent>.
, <simpleContent>,
<extension>, , <restriction>,
. base,
<simpleContent>, , !
, , bookType, <year>:
<xsd:complexType name="newBookType">
<xsd:complexContent>
<xsd:extension base="bookType">
<xsd:sequence>
<xsd:element name="year" type="xsd:gYear">
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
<restriction> ,
. , newbookType
bookType:
<xsd:complexType name="newBookType">
<xsd:complexContent>
<xsd:restriction base="bookType">
<xsd:sequence>
<xsd:element name="author" type="xsd:normalizedString"
minOccurs="0" />
<xsd:element name="title" type="xsd:normalizedString" />
</xsd:sequence>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
. , ? ?
, XSD - , .
,
. XSD anyType.
V. Web- Java
724
. , Java
Object, .
anyType anySimpleType .
, anyType.
, bookType,
, :
<xsd:complexType name="bookType">
<xsd:complexContent>
<xsd:restriction base="xsd:anyType">
<xsd:sequence maxOccurs="unbounded">
<xsd:element name="author" type="xsd:normalizedString"
minOccurs="0" />
<xsd:element name="title" type="xsd:normalizedString" />
<xsd:element name="pages" type="xsd:positiveInteger"
minOccurs="0" />
<xsd:element name="publisher" type="xsd:normalizedString"
minOccurs="0" />
</xsd:sequence>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
:
28.4 , 28.2.
28.4. XML
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:ntb="http://some.firm.com/2011/ntbNames"
targetNamespace="http://some.firm.com/2011/ntbNames">
<xsd:element name="notebook" type="ntb:notebookType" />
<xsd:complexType name="notebookType">
<xsd:element name="person" type="ntb:personType"
minOccurs="0" maxOccurs="unbounded" />
</xsd:complexType>
725
726
V. Web- Java
<xsd:simpleType name="ruDate">
<xsd:restriction base="xsd:string">
<xsd:pattern value="[0-9]{2}.[0-9]{2}.[0-9]{4}" />
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>
28.4 . . XML, , . .
28.4 name. 28.5
.
28.5. XML
<?xml version='1.0'?>
<xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema'
targetNamespace=http://some.firm.com/2011/ntbNames>
727
V. Web- Java
728
<xsd:element name='home-phone' type='xsd:string'
minOccurs='0' maxOccurs='unbounded' />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
, . , XML.
XSD
, , http://www.w3.org/2001/XMLSchema. , , xs xsd, 28.4 28.5.
"" "" .
,
.
28.6 XML
http://www.w3.org/2001/XMLSchema
. , ,
ntb, .
28.6. XML
<?xml version='1.0'?>
<schema xmlns='http://www.w3.org/2001/XMLSchema'
targetNamespace='http://some.firm.com/2011/ntbNames'
xmlns:ntb='http://some.firm.com/2011/ntbNames'>
<element name='notebook'>
<complexType>
<sequence>
<element name='person' maxOccurs='unbounded'>
<complexType>
<sequence>
729
<element name='name'>
<complexType>
<attribute name='first'
type='string' use='optional' />
<attribute name='second' type='string' use='optional' />
<attribute name='surname' type='string' use='required' />
</complexType>
</element>
<element name='birthday'>
<simpleType>
<restriction base='string'>
<pattern value='[0-9]{2}.[0-9]{2}.[0-9]{4}' />
</restriction>
</simpleType>
</element>
<element name='address' maxOccurs='unbounded'>
<complexType>
<sequence>
<element name='street' type='string' />
<element name='city'
type='string' />
<element name='zip'
type='positiveInteger' />
</sequence>
</complexType>
</element>
<element name='phone-list'>
<complexType>
<sequence>
<element name='work-phone' type='string'
minOccurs='0' maxOccurs='unbounded'/>
<element name='home-phone' type='string'
minOccurs='0' maxOccurs='unbounded'/>
</sequence>
</complexType>
</element>
</sequence>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
28.6
http://www.w3.org/2001/XMLSchema, xsd .
, , <schema>. , -
730
V. Web- Java
. 28.6 <notebook>.
name, address - .
XML
. XSD : type, nil,
schemaLocation, noNamespaceSchemaLocation, ,
XML, (XML schema instance).
http://www.w3.org/2001/XMLSchema-instance.
xsi, :
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
, .
: <include> <import>. :
<xsd:include xsi:schemaLocation="names.xsd" />
xsi:schemaLocation.
, names.xsd.
,
, , . . targetNamespace. , names.xsd .
, names.xsd <include>.
, .
<redefine>, :
<xsd:redefine schemaLocation="names.xsd">
<xsd:simpleType name="nameType">
<xsd:restriction base="xsd:string">
<xsd:maxLength value="40"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:redefine>
, <import>. , A.xsd
:
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://some.firm.com/someNames">
731
B.xsd
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://some.firm.com/anotherNames">
C.xsd. :
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://some.firm.com/yetAnotherNames"
xmlns:pr1="http://some.firm.com/someNames"
xmlns:pr2="http://some.firm.com/anotherNames">
<xsd:import namespace="http://some.firm.com/someNames"
xsi:schemaLocation="A.xsd" />
<xsd:import namespace="http://some.firm.com/anotherNames"
xsi:schemaLocation="B.xsd" />
C.xsd , A.xsd
B.xsd, pr1 pr2 .
<include> <import> .
xsi:schemaLocation URI, .
XML
-, XML ,
- ( ), .
. -,
. , , XSV (XML Schema
Validator) ftp://ftp.cogsci.ed.ac.uk/pub/XSV/:
$ xsv ntb.xml ntb1.xsd ntb2.xsd
-, ,
setProperty(), . ,
, Xerces.
,
. , XML. .
-
,
URI:
noNamespaceSchemaLocation,
<notebook xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="ntb.xsd">
732
V. Web- Java
, . .
targetNamespace.
, -
schemaLocation, ,
. , :
<notebook xmlns="http://some.firm.com/2003/ntbNames"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"http://some.firm.com/someNames A.xsd
http://some.firm.com/anotherNames B.xsd"
xmlns:pr1="http://some.firm.com/someNames"
xmlns:pr2="http://some.firm.com/anotherNames">
, A.xsd
B.xsd, pr1 pr2 .
XSD ,
. ,
. .
, XML. :
Schematron http://www.ascc.net/xml/resource/schematron/;
RELAX NG (Regular Language Description for XML, New Generation), -
http://www.w3.org/TR/NOTE-ddml.
DCD (Document Content Description), SOX (One's Schema
for Object-Oriented XML), XDR (XML-Data Reduced).
. , XSD, , .
XML (processing
instructions). -
. :
<? ?>
733
XML
(lexical parsing) XML.
(tokens),
, , , . . (scanners).
java.util.StringTokenizer java.io.StreamTokenizer Java SE
JDK, .
(grammar parsing). , , , , , , ,
. -, (parsers).
.
XML , XML-. Java. .
, , , (tree-based parsing). . , ,
XML . .
, ,
(event-based parsing). ,
. XML:
, , .
: startElement(),
endElement(), characters() . . , , .
SAX (Simple API for
XML), (David Megginson).
http://www.saxproject.org/.
, SAX2. SAX2 , Xerces2.
734
V. Web- Java
(stream parsers), ,
, , .
getName(), getText(),
getAttributeName(), getAttributeValue() . ., .
Java Standard Edition Enterprise Edition XML, JAXP (Java API for XML Processing). ,
DOM API (Document Object Model API),
, . JAXP, SAX API, SAX-. JAXP,
, StAX (Streaming API for XML).
XML
SAX2
SAX2 org.xml.sax, org.xml.sax.ext,
.
org.xml.sax.helpers, javax.xml.parsers.
SAX2 org.xml.sax.ContentHandler,
: , ,
, , .
SAX2 - , , .
, .
public void startDocument();
.
"<", ,
public void startElement(String uri, String name,
String qname, Attributes attrs);
, : uri, name
qname, attrs,
. ,
null. , attrs.
"</", ,
public void endElement(String uri, String name, String qname);
public void characters(char[] ch, int start, int length);
ch, start
length.
735
public void processingInstruction(String target, String data);
- target
data.
, ,
ch , start length.
org.xml.sax.ContentHandler org.xml.sax.helpers.DefaultHandler.
.
, .
SAX2 .
XML ,
- .
XML ,
JDO (Java Data Objects).
(data binding) JDO.
Java.
Java ( 28.7 28.8),
.
28.7. ,
public class Address{
private String street, city, zip, type = "";
public Address(){}
public String getStreet(){ return street; }
public void setStreet(String street){ this.street = street; }
public String getCity(){ return city; }
public void setCity(String city){ this.city = city; }
public String getZip(){ return zip; }
public void setZip(String zip){ this.zip = zip; }
public String getType(){ return type; }
public void setType(String type){ this.type = type; }
public String toString(){
return "Address: " + street + " " + city + " " + zip;
}
}
V. Web- Java
736
28.8. ,
public class Person{
private
private
private
private
public Person(){}
public Person(String firstName, String secondName, String surname){
this.firstName = firstName;
this.secondName = secondName;
this.surname = surname;
}
public String getFirstName(){ return firstName; }
public void setFirstName(String firstName){
this.firstName = firstName;
}
public String getSecondName(){ return secondName; }
public void setSecondName(String secondName){
this.secondName = secondName;
}
public String getSurname(){ return surname; }
public void setSurname(String surname){
this.surname = surname;
}
public String getBirthday(){ return birthday; }
public void setBirthday(String birthday){
this.birthday = birthday;
}
public void addAddress(Address addr){
if (address == null) address = new Vector();
address.add(addr);
}
public Vector<Address> getAddress(){ return address; }
public void removeAddress(Address addr){
if (address != null) address.remove(addr);
}
public void addWorkPhone(String phone){
if (workPhone == null) workPhone = new Vector();
workPhone.add(new Integer(phone));
}
public Vector<Integer> getWorkPhone(){ return workPhone; }
737
Java,
, ,
Java.
28.9 - NotebookHandler
, 28.2. NotebookHandler ,
Person, 28.8.
28.9. - XML SAX2
import
import
import
import
import
org.xml.sax.*;
org.xml.sax.helpers.*;
javax.xml.parsers.*;
java.util.*;
java.io.*;
Person person;
Address address;
static Vector<Person> pers = new Vector<>();
inBirthday, inStreet, inCity, inZip,
inWorkPhone, inHomePhone;
V. Web- Java
738
throws SAXException{
switch (qname){
case "name":
person = new Person(attrs.getValue("first"),
attrs.getValue("second"), attrs.getValue("surname"));
break;
case "birthday":
inBirthday = true; break;
case "address":
address = new Address(); break;
case "street":
inStreet = true; break;
case "city":
inCity = true;
if (attrs != null) address.setType(attrs.getValue("type"));
break;
case "zip":
inZip = true; break;
case "work-phone":
inWorkPhone = true; break;
case "home-phone":
inHomePhone = true;
}
public void characters(char[] buf, int offset, int len)
throws SAXException{
String s = new String(buf, offset, len);
if (inBirthday){
person.setBirthday(s);
inBirthday = false;
}else if (inStreet){
address.setStreet(s);
inStreet = false;
}else if (inCity){
address.setCity(s);
inCity = false;
}else if (inZip){
address.setZip(s);
inZip = false;
}else if (inWorkPhone){
person.addWorkPhone(s);
inWorkPhone = false;
}else if (inHomePhone){
person.addHomePhone(s);
inHomePhone = false;
}
}
public void endElement(String uri, String name, String qname)
throws SAXException{
739
V. Web- Java
740
System.err.println("line = " + ex.getLineNumber() +
" col = " + ex.getColumnNumber());
}
public void fatalError(SAXParseException ex){
System.err.println("Fatal error: " + ex);
System.err.println("line = " + ex.getLineNumber() +
" col = " + ex.getColumnNumber());
}
}
- , .
main() 28.9.
, SAX SAXParser , newSAXParser().
-, , newInstance().
, . ,
fact.setFeature("http://xml.org/sax/features/namespace-prefixes", true);
, fact, .
Java API
SAX http://www.saxproject.org/. ,
.
org.xml.sax
-
void setValidating(true);
28.9, ,
.
void setNamespaceAware(true);
- , .
- , parse(),
- .
javax.xml.parsers.SAXParser parse().
parse(File, DefaultHandler), 28.9, ,
InputStream,
InputSource, URI InputSource.
setProperty() . 28.9
, XSD. , . .
setValidating(true), .
ErrorHandler. ,
741
,
:
public void warning(SAXParserException ex);
public void error(SAXParserException ex);
public void fatalError(SAXParserException ex);
DefaultHandler .
ErrorHandler. 28.9.
SAXParserException ,
. getLineNumber() getColumnNumber(),
28.9.
XML StAX
StAX javax.xml.stream, javax.xml.stream.events,
javax.xml.stream.util, .
XMLStreamReader. , ,
next(). next()
, XMLStreamConstants,
, : START_DOCUMENT, START_ELEMENT,
END_ELEMENT, CHARACTERS . . XMLStreamReader
. ,
, START_ELEMENT, getLocalName(), getAttributeCount(), k- getAttributeName(k) getAttributeValue(k).
, CHARACTERS,
getText().
28.10 StAX ,
, 28.9.
28.10. - XML StAX
import javax.xml.stream.*;
import java.util.*;
import java.io.*;
public class NotebookHandlerStAX implements XMLStreamConstants{
private Person person;
private Address address;
private static Vector<Person> pers = new Vector<>();
boolean inBirthday, inStreet, inCity, inZip,
inWorkPhone, inHomePhone;
742
V. Web- Java
743
XML Java
Address Person, XML. XML , XML Java .
Sun Microsystems JAXB (Java
Architecture for XML Binding), . Java SE, http://
jaxb.dev.java.net/. JAXB XML XSD.
JAXB xjc (XML-Java Compiler).
XSD Java , Java. ,
$ xjc roots notebook ntb.xsd d sources
744
V. Web- Java
JDO
Java
XML, , , .
Sun Microsystems JDO, 3.0, JDO. JDO ,
XML, ,
(Enterprise Information System, EIS).
:
JDO SPI (JDO Service Provider Interface) ,
, , , ,
;
javax.jdo.spi;
JDO API (JDO Application Programming Interface) ,
, , ; javax.jdo.
JDO.
Apache Software Foundition Apache JDO.
http://db.apache.org/jdo/index.html.
DataNucleus, http://www.datanucleus.org/, Access Platform,
JPOX.
SolarMetric, http://www.solarmetric.com/, JDO Kodo JDO.
WebLogic, WebSphere, JBoss.
JDO,
. ,
Castor. http://www.castor.org/.
Castor . , Java XML,
, :
Person person = (Person)Unmarshaller.unmarshal(
Person.class, new FileReader("person.xml"));
745
, Java XML :
Marshaller.marshall(person, new FileWriter("person.xml"));
parse()
Document. DocumentBuilder parse(), URL, , File
InputSource.
Document, Node, . Node
. Element, , XML. , , . Attr.
CDATASection, Comment, Text, Entity, EntityReference, ProcessingInstruction,
Notation XML.
. 28.2 , , 28.2. , , , .
.
V. Web- Java
746
. 28.2.
XML
Node
Node :
ATTRIBUTE_NODE Attr, ;
CDATA_SECTION_NODE CDADASection, CDATA;
COMMENT_NODE Comment, ;
DOCUMENT_FRAGMENT_NODE DocumentFragment ;
DOCUMENT_NODE Document;
DOCUMENT_TYPE_NODE Document;
ELEMENT_NODE Element;
ENTITY_NODE Entity ENTITY;
ENTITY_REFERENCE_NODE EntityReference ;
NOTATION_NODE Notation;
PROCESSING_INSTRUCTION_NODE ProcessingInstruction,
;
TEXT_NODE Text .
Node :
public short getNodeType() ;
public String getNodeName() ;
747
XML, NamedNodeMap,
Element;
public NamedNodeMap getAttributes() ; null,
;
public boolean hasChildNodes() , -;
public NodeList getChildNodes() -
NodeList;
public Node getFirstChild() -;
public Node getLastChild() -;
public Node getParentNode() ;
public Node getPreviousSibling() ,
, ;
public Node getNextSibling() , -
, ;
public Document getOwnerDocument() .
:
public Node appendChild(Node newChild) - newChild;
public Node insertBefore(Node newChild, Node refChild) -
newChild refChild;
public Node replaceChild(Node newChild, Node oldChild) -
oldChild
newChild;
Document
Document Node :
public DocumentType getDocType()
DocumentType;
getName(), getEntitied(), getNotations() DocumentType -
;
public Element getDocumentElement() ;
public NodeList getElementsByTagName(String name);
public NodeList getElementsByTagNameNS(String uri, String qname);
public Element getElementById(String id)
tag ,
, ID.
V. Web- Java
748
:
public Element createElement(String name)
;
public Element createElementNS(String uri, String name) -
;
public CDATASection createCDATASection(String name) CDATA_SECTION_
NODE;
PROCESSING_INSTRUCTION_NODE;
public TextNode createTextNode(String name) TEXT_NODE;
public Attr createAttribute(String name) - name;
public Attr createAttributeNS(String uri, String name) ;
public Comment createComment(String comment) -;
public DocumentFragment createDocumentFragment() -
;
public Node importNode(Node importedNode, boolean deep) ,
, , .
. true,
.
Element
Element Node
XML ,
.
public String getTagName();
, .
name,
uri,
URI; name , .
Attr
name
public
public
public
public
749
public Attr removeAttributeNode(Attr name);
public void removeAttribute(String name);
public void removeAttributeNS(String uri, String name);
public void setAttribute(String name, String value);
public void setAttributeNS(String uri, String name, String value);
public Attr setAttributeNode(String name);
public Attr setAttributeNodeNS(Attr name);
-:
public NodeList getElrmentsByTagName(String name);
public NodeList getElrmentsByTagNameNS(String uri, String name);
, ,
, , ,
.
, XML. 28.2 . 28.11.
28.11. DOM API
import org.w3c.dom.*;
import javax.xml.parsers.*;
import org.xml.sax.*;
class ErrHand implements ErrorHandler{
public void warning(SAXParseException ex){
System.err.println("Warning: " + ex);
System.err.println("line = " + ex.getLineNumber() +
" col = " + ex.getColumnNumber());
}
public void error(SAXParseException ex){
System.err.println("Error: " + ex);
System.err.println("line = " + ex.getLineNumber() +
" col = " + ex.getColumnNumber());
}
public void fatalError(SAXParseException ex){
System.err.println("Fatal error: " + ex);
System.err.println("line = " + ex.getLineNumber() +
" col = " + ex.getColumnNumber());
}
}
V. Web- Java
750
public class TreeProcessDOM{
DocumentBuilderFactory.newInstance();
fact.setNamespaceAware(true);
fact.setValidating(true);
try{
fact.setAttribute(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA);
}catch(IllegalArgumentException x){
System.err.println(" : " +
JAXP_SCHEMA_LANGUAGE);
System.exit(-1);
}
DocumentBuilder builder = fact.newDocumentBuilder();
builder.setErrorHandler(new ErrHand());
Document doc = builder.parse(args[0]);
NodeList list = doc.getElementsByTagName("notebook");
int n = list.getLength();
if (n == 0){
System.err.println(" .");
System.exit(-1);
}
Node thisNode = null;
for (int k = 0; k < n; k++){
thisNode = list.item(k);
String elemName = null;
if (thisNode.getFirstChild() instanceof Element){
elemName = (thisNode.getFirstChild()).getNodeName();
if (elemName.equals("name")){
if (!thisNode.hasAttributes()){
System.err.println(" " + elemName);
751
System.exit(1);
}
NamedNodeMap attrs = thisNode.getAttributes();
Node attr = attrs.getNamedItem("surname");
if (attr instanceof Attr)
if (((Attr)attr).getValue().equals("")) break;
}
}
}
NodeList topics = ((Element)thisNode)
.getElementsByTagName("phone-list");
Node newNode;
if (args[1].equals("work"))
newNode = doc.createElement("work-phone");
else newNode = doc.createElement("home-phone");
Text textNode = doc.createTextNode(args[2]);
newNode.appendChild(textNode);
thisNode.appendChild(newNode);
}
}
, ,
JTree Swing.
. 28.2. DomEcho "Web
Services Tutorial". ,
, http://java.sun.com/webservices/
tutorial.html. Xerces
samples/ui/ TreeView,
JTree Swing.
DOM-
DOM OMG (Object
Management Group) IDL (Interface Definition Language) Java. Java W3C
, org.w3c.dom. , ,
DOM API
.
.
JDOM DOM, , JDOM.
,
http://www.jdom.org/. XML Java.
752
V. Web- Java
XML
, DOM . XML, HTML, PDF .
JAXP
javax.xml.transform, javax.xml.transform.dom, javax.xml.transform.sax, javax.xml.
transform.stream, XSLT (XML Stylesheet Language for Transformations) Java.
XSLT W3 ,
XSL (XML Stylesheet Language). XSL
http://www.w3.org/Style/XSL/.
, javax.xml.transform.*, XSLT, Xalan, Apache Software Foundation, http://xml.apache.org/xalan-j/.
Source. Source :
public String getSystemId();
public void setSystemId(String id);
753
newInstance() transFactory .
public void setAttrbute(String name, String value);
TransformerFactory .
.
-
Transformer. , , XSL.
Transformer
public void setParameter(String name, String value);
,
public void setOutputProperties(Properties out);
public void setOutputProperty(String name, String value);
. name
, OutputKeys, . :
CDATA_SECTION_ELEMENTS CDATA ;
DOCTYPE_PUBLIC PUBLIC ;
DOCTYPE_SYSTEM SYSTEM ;
ENCODING ,
encoding XML;
INDENT .
"yes" "no";
MEDIA_TYPE MIME- ;
METHOD , : "xml", "html" "text";
OMIT_XML_DECLARATION XML. "yes" "no";
STANDALONE , standalone
,
:
transformer.setOutputProperty(OutputKeys.ENCODING, "Windows-1251");
document Node
DOMSource .
Node, ,
754
V. Web- Java
, - , DOMSource .
, result,
newCourses.xml, transform().
XSL.
XSL
HTML CSS (Cascading Style Sheet),
HTML: , , . .
XML, ,
. XML XML, XSL (XML Stylesheet Language). XSL http://www.w3.org/1999/XSL/Transform. xsl. ,
XSL <xsl:stylesheet>.
, 28.12.
28.12. XSL
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="CP866"/>
</xsl:stylesheet>
xsl ,
"" , text ( html
xml), CP866.
MS Windows. Transformer, 28.12, , XML, . .
, .
, , simple.xsl. XML :
<?xml version="1.0" encoding="Windows-1251"?>
<?xml-stylesheet type="text/xsl" href="simple.xsl"?>
<notebook>
<!-- -->
XML-, , , XSLT-,
, simple.xsl.
-,
, , 28.13.
755
28.13. XML
import java.io.*;
import javax.xml.transform.*;
import javax.xml.transform.stream.*;
public class SimpleTransform{
public static void main(String[] args) throws TransformerException{
if (args.length != 2){
System.out.println("Usage: " +
"java SimpleTransform xmlFileName xsltFileName");
System.exit(1);
}
File xmlFile = new File(args[0]);
File xsltFile = new File(args[1]);
Source xmlSource = new StreamSource(xmlFile);
Source xsltSource = new StreamSource(xsltFile);
Result result = new StreamResult(System.out);
TransformerFactory transFact = TransformerFactory.newInstance();
Transformer trans = transFact.newTransformer(xsltSource);
trans.transform(xmlSource, result);
}
}
java SimpleTransform ntb.xml simple.xsl
ntb.xml.
. ,
, Transformer , 28.14.
28.14.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="CP866" />
<xsl:template match="person">
<xsl:apply-templates />
</xsl:template>
<xsl:template match="name">
<xsl:value-of select="@first" /> <xsl:text> </xsl:text>
<xsl:value-of select="@second" /> <xsl:text> </xsl:text>
756
V. Web- Java
XML HTML
XSL Transformer XML HTML. .
28.15 , 28.2.
28.15. XML HTML
<?xml version="1.0" encoding="Windows-1251"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="Windows-1251"/>
<xsl:template match="/">
<html><head><title> </title></head>
<body><h2>, </h2>
<xsl:apply-templates />
</body></html>
</xsl:template>
<xsl:template match="name">
<p />
<xsl:value-of select="@first" /> <xsl:text> </xsl:text>
<xsl:value-of select="@second" /> <xsl:text> </xsl:text>
<xsl:value-of select="@surname" /> <br />
</xsl:template>
<xsl:template match="address">
<br />
757
, , ntb.xsl,
XML, :
<?xml version="1.0" encoding="Windows-1251"?>
<?xml-stylesheet type="text/xsl" href="ntb.xsl"?>
<notebook>
<!-- -->
HTML- ntb.html.
1. XML?
2. XML?
3. XML?
4. XML?
5. XML DTD, XSD
- ?
6. XML?
7. XML,
, ?
8. XML ?
9. XML XSL, CSS?
10. -?
11. , ?
Java , ,
.
, , . Java .
,
.
1. ., . Java 2. . . 1, 2. .: , 2010. 816 ., 992 .
2. . Java. . 4- . .: , 2009. 640 .
3. . - : . .
.: , 1997. 464 .
4. . - : . . 3- . .: , 2010. 720 .
5. ., ., . . , : . . .: , 1999. 446 .
6. . ++: . . 3- . .: ,
.: , 2008. 1104 .
7. ., ., ., . - . . .: , 2005.
368 .
8. ., . Java. :
. . .: , 2002. 576 .
9. Bruce Eckel. Thinking in Patterns with Java. 2004.
http://mindview.net/Books/TIPatterns/.
10. . UML 2.0 : . . .:
, 2009. 736 .
11. . : . . .: ,
2008. 352 .
759
A
Abstract method 90
Abstract Window Toolkit (AWT) 216, 296
Access methods 82
Accessibility 296
Anonymous classes 103
Applet 466
Application 466
Arguments 38
Array 46
Ascent 236
Associative array 190
B
Baseline 231
Bitwise 52
Bridge 625
Bytecodes 24
C
Callback 413
Capacity 169, 174
Caret 253, 268
Cascading Style Sheet (CSS) 475, 704
Castor 744
CIEXYZ 228
Class 38, 46, 77
Class body 38
Class constructor 93
Class fields 77
Class methods 77, 96
Class modifiers 84
Class variables 94
Clipboard 345
CMYK 228
Code Conventions 39
Color model 228
Common Desktop Environment (CDE) 451
Component 217, 713
Compound assignment operators 55
Concatenation 162
Container 217
Content pane 398
Context 639
Context menu 292
Contract 81
Controller 126
Convolution 509
Cookie 653
Core API 26
Critical section 552
CSS 754
Custom tags 665
D
Daemon 558
Dangling else 60
Data binding 735
Data processing 563
Data sink 563
Daylight Savings Time (DST) 208
DCD 732
DDML 732
Declaration 67
Default access 109
Default constructor 93
Default namespace 712
Delegation 301, 414
Deployment 632
Deployment descriptor 634
Deprecated 21
Descent 236
Deserialization 587
Design pattern 125, 312
Dictionary 190
Document Object Model (DOM) 745
Document type declaration 706
Document Type Definition (DTD) 704, 709
DOM API 734
Dom4j 752
Double buffering 381, 512
Drop-down menu 287
Dynamic binding 24
E
EIS 744
Empty element 707
Enumeration 121
Epoch 208
Event 412
Event source 412
Exception 529
Expression 56
Expression statement 59
Extension 80
F
Facets 716
Fall through labels 66
FAQ 19
Feel 451
First In First Out (FIFO) 188
Floating-point types 46
Font face name 232
Font height 236
Font name 232
Fully qualified name 109
Fundamental facets 717
G
Gap 373
Get method 82
Glass pane 398
Glue 388
Glyph 231
Grammar parsing 733
Graphical User Interface (GUI) 296
Graphics context 226
761
H
Handlers 413
Heavy component 216
High cohesion 83
Hint 254
HSB 228
HyperText Markup Language (HTML) 704
I
Identifier 45, 413
Immediate mode model 501
Implementation 118
Incapsulation 74
Inheritance 80
Initialization 68
Inner class 103
Input focus 261
Input Method Framework 296
Input stream 560
Instance 78
Instance initialization 103
Instance methods 96
Instance variables 94
Instantation 67
Integral types 46
Interface 46, 118
Item 265
J
Java 2 26
Java 2 Standard Edition (J2SE) 39
Java 2D 296
Java Foundation Classes (JFC) 296
Java L&F 299
Java Look and Feel 298
Java Plug-in 31, 296
Java XML Pack 711
JavaServer Pages (JSP) 665
JAXB 743
JAXP 711, 734, 745, 752
JBoss 744
JDK 25
JDO 735, 744
JDOM 751
JFC 216
JIT- 24
JLS 37
JRE 27
JSP Container 666
JSP Document 667
762
K
Kodo JDO 744
L
L&F 298
Last In First Out (LIFO) 178
Layered pane 396
Layout manager 261, 372
Leading 236
Lexical parsing 733
Lightweight component 216
List 716
Listener 413
Local class 103
Locale 158
Location 335
Logical font names 231
Look 451
Look and feel 298
Look and feel defaults 452
Low coupling 82
M
Map 190
Mapping file 745
Member classes 103
Menu bar 287
Message 80
Method 38
Modal 400
Modal window 279
Model 126
Model group 721
Model-View-Controller 300
Modifiers 38
Modularity 81
MSXML 711
Multiple inheritance 117
MVC 126, 300
N
Names 45
Namespace 109, 711
Narrowing 51
Native methods 25
O
Object-oriented programming 75
Offset 335
OOD 76
OOP 75
Output stream 560
Overloading 88
Overriding 88
P
Package 109
Parser 172, 733
Parsing 172
Peer- 216
Pen 239
Pipe 561, 585
PL&F 298, 453
PLAF 298, 453
Pluggable Look and Feel 298, 453
Polymorphism 81
Popup menu 292, 325
Position 335
Primitive types 45
Private 91
Process 542
Processing instructions 732
Producer-consumer 495
Promotion 50
Protocol 601
Pure Java 31
Q
QName 712
Qualified name 45, 712, 715
R
Radio buttons 263
Reference 67
Reference types 45
Relax 732
RELAX NG 732
Rendering 254
Responsibility 81
Restriction 716
S
Sandbox 480
SAX 733, 740
SAX API 734
SAX2 733, 734, 741
Schematron 732
Scope 101
Scriptlet 668
Sequence 185
Serialization 561, 587
Server Side Include (SSI) 661, 704
Servlet 631
Session 601
Set 186
Set method 82
Signature 87
Simple assignment operator 55
Size 174
Slider 272
Socket 608
SOX 732
Splash window 399
Stack 178
Standard Generalized Markup Language
(SGML) 704
Statement 58
Status bar 469
Stderr 560
Stdin 560
Stdout 560
Stream 560
Strut 388
Style 336
Style sheets 339
Subclass 80
Subpackage 109
Subprotocol 626
Superclass 80
Swing 296
System defaults 451
T
Tag 467
Tear-off menu 289
Theme 462
763
Thread 543
Throws 533
Time zone 208
TLD 677
Token 733
TREX 732
Trusted applet 481
U
Union 716
Unnamed package 110
User defaults 452
V
Validating parser 711
View 126
Virtual key codes 425
VMS 24
W
Web Application 666
Web Components 666
Web Container 666
WebLogic 744
WebSphere 744
Web- 666
Web- 666
Web- 666
Widening 51
Window manager 466
Wrapper 133
X
Xalan 752
XDR 732
Xerces 711, 712, 731, 751
XHTML 712
XML 705
XML declaration 706
XML Schema 711, 713
XML Schema Definition Language (XSD) 709
XML schema instance 730
XML View 668
XSchema 732
XSD 723
XSL 752, 754
XSLT 752
XSV 731
764
91
76
227
466
53
190
730
707
231
723
- 24
53
103
110
103
96
Java 45
345
175
174, 176
176
177
174, 176
175
177
54
254
Java 24
425
103
103
292, 325
170
163
250
287
56
729
733
226
381, 512
e 301, 414
558
587
47
24
67
162
170
481
334
JSP 667
52
49
ODBC 625
169
24
665
83
707
81
168
167
168
45
413
79
45
XML 715
232
68
74
732
236
118
744
47
534
529
412
24
561, 585
475
38, 77
- 133
- 413
- 413
- 103
40
217, 451, 713
"" 216, 285
"" 216
AWT
263
262
263
272
262
269
265
266
269
Swing
318
318
306
306
302
316
316
308
310
311
314
171
42, 43, 91
93
217, 261
631
639
765
292
81
634
47
706
552
253, 259, 341
733
208
231
47
53
158, 206
103
67, 211
261, 372
BorderLayout 374
BoxLayout 387
BoxLayout 389
CardLayout 377
FlowLayout 372
GridBagLayout 379
GridLayout 376
64
38
main 99
82
77, 96
96
117
186, 187, 191, 200
721
501
-- 300
38
84
74
81
625
80
80
766
101
413
716
735
-
75
-
76
- 76
24
XML 706
67
706
"" 399
402
279, 400
400
399
409
466
91
76
75
58
break 65
continue 64
65
55, 59
509
62
67
81
707
82
190
47
289
188
109
109
397
398
396
398
172, 733
172
88
94
94
88
121
239
239
239
239
239
480
52
52
52
52
50
80
109
626
543
543
558
335
167
166
77
272
81, 119
109
65
65
185
- 495
560
301
210
XML 668
240
215
KISS 83, 541
711
373
714
713
109
712
601
73
542
707
404
263
164
343, 344
80
51
712
118
243
25
Swing 333
452
452
451
83
735
53
53
601
631
561, 587
601
601
601
87
43, 231
172
668
190
714
714
211
413
412
157
608
48
48
767
55
Java 24
195, 716
164
67
560
560
560
95
95
178
336
JSP 667
44
287
469
74
716
51
80
710
709
XML 711, 713
MVC 126
162
339
351
467
349
38
707
462
45
46
46
45
46
46
46
171
171
768
56
59
632
712
716, 717
232
261
228
50
208
77
78
730
XML 707