0% found this document useful (0 votes)
825 views1,080 pages

Realhowto Java

Realhowto Java

Uploaded by

alipiodepaula
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
825 views1,080 pages

Realhowto Java

Realhowto Java

Uploaded by

alipiodepaula
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 1080

Real's HowTo PDF version.

This is the PDF version of the Real's HowTo Web site ( http://www.rgagnon.com/howto.html ).
For uptodate content, please refer to the Web site.
There are 4 files : Real's Java , Real's Javascript, Real's Powerbuilder and Real's VBS and Misc
Prog HowTo.
Please don't make PDF versions available on the internet (it's ok in intranet)
From the PDF, you can't run the examples and the links to other Howto's are not working.
If you feel that effort has been useful to you, perhaps you will consider giving something back?
You can make a donation through PayPal at https://www.paypal.com , make you donation to
[email protected]
Contributions via PayPal are accepted in any amount using a credit card or checking account.
(Donations of any size gladly accepted)
Real's Howto copyright notice ( [email protected] )
Redistribution and use in source and binary forms,
with or without modification, are permitted provided
that the following conditions is met:
* the source code is used in a development project
Redistributions of source code or site content
(even partially) in any publications (electronic or paper)
is forbidden without permission.
DISCLAIMER
THIS SOFTWARE IS PROVIDED BY Real Gagnon "AS IS" AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
Real Gagnon BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

Real's [email protected]
1 Applet...............................................................................................................................................1
1.1 javaapplet........................................................................................................................1
1.2 Goto to a new URL from an AppletTag(s): Applet.............................................................1
1.3 Determine the host from where the Applet is loadedTag(s): Applet..................................3
1.4 Have a scrolling status lineTag(s): Applet..........................................................................3
1.5 Use a search engineTag(s): Applet...................................................................................5
1.6 Have an onscreen clockTag(s): Applet............................................................................6
1.7 Have Applets on the same page communicate with each otherTag(s): Applet.................8
1.8 Have Applets on different frames communicates with each otherTag(s): Applet..............9
1.9 Send a message from an Applet to another Applet on a different pageTag(s): Applet....11
1.10 Have an applet launch an other appletTag(s): Applet....................................................13
1.11 Get the user nameTag(s): Applet Security.....................................................................14
1.12 Access parameters passed in the URLTag(s): Applet...................................................15
1.13 Convert an Applet to Application Tag(s): Applet............................................................17
1.14 Change the mouse cursor in AppletTag(s): Applet........................................................18
1.15 Use an Image as the Applet backgroundTag(s): Applet AWT.......................................19
1.16 Handle the new Control Activation mechanism in IETag(s): Applet...............................20
1.16.1 Solution #1............................................................................................................20
1.16.2 Solution #2............................................................................................................21
1.16.3 Solution #3............................................................................................................22
1.17 Pass parameters to the Applet JVM (WIN)Tag(s): Applet.............................................23
1.18 See the Java Console Window Log (Java plugin)Tag(s): Applet Environment..............24
1.19 Display debugging infos for an AppletTag(s): Applet.....................................................24
1.20 Have an invisible Applet Tag(s): Applet.........................................................................25
1.21 Keep the JVM loadedTag(s): Applet..............................................................................25
1.22 Detect browser type from an AppletTag(s): Applet Environment Javascript
interaction.............................................................................................................................25
1.23 Call a Javascript from the Applet...................................................................................26
1.24 Get the value from the serverside................................................................................27
2 Date and Time...............................................................................................................................28
2.1 javadate.........................................................................................................................28
2.2 Have year on 4 digits from a Date objectTag(s): Date and Time.....................................28
2.3 Get the current Date and TimeTag(s): Date and Time....................................................28
2.4 Compute days between 2 datesTag(s): Date and Time..................................................29
2.5 Get the number of days in a monthTag(s): Date and Time..............................................31
2.6 Validate a dateTag(s): Date and Time.............................................................................31
2.6.1 Using DateFormat...................................................................................................31
2.6.2 Using GregorianCalendar.......................................................................................33
2.7 Determine to day of the weekTag(s): Date and Time......................................................33
2.8 Add/Substract Day/Month/Year to a DateTag(s): Date and Time....................................34
2.9 Get the correct TimeZone on DateFormatTag(s): Date and Time...................................35
2.10 Simply format a date as "YYYYMMDD"Tag(s): Date and Time.....................................35
2.11 Compare 2 datesTag(s): Date and Time.......................................................................36
2.12 Parse a String to obtain a Date/GregorianCalendar objectTag(s): Date and Time........37
2.13 Use System time to generate unique IDTag(s): Date and Time Date and Time
Varia.......................................................................................................................................38
2.14 Get the day nameTag(s): Date and Time......................................................................38
2.15 Find the current date formatTag(s): Date and Time.......................................................39
2.16 Get a julian dateTag(s): Date and Time.........................................................................40

2.17 Calculate the ageTag(s): Date and Time

Real's [email protected]
2 Date and Time
2.17 Calculate the ageTag(s): Date and Time.......................................................................43
2.18 Format a duration in milliseconds into a humanreadable formatTag(s): Date and
Time......................................................................................................................................43
2.19 Get the atomic timeTag(s): Date and Time....................................................................46
2.20 Get a date intervalTag(s): Date and Time......................................................................48
2.21 Determine if an hour is between an intervalTag(s): Date and Time...............................50
2.22 Set the computer clockTag(s): Date and Time JNI........................................................51
2.23 Use System time to generate unique IDTag(s): Date and Time Date and Time
Varia.......................................................................................................................................52
2.24 Get the month (or day) name (localized)Tag(s): Date and Time Internationalization....52
2.25 Detect a leap yearTag(s): Date and Time......................................................................53
3 AWT................................................................................................................................................55
3.1 javaawt...........................................................................................................................55
3.2 Use The CardLayout managerTag(s): AWT....................................................................55
3.3 Detect which card is visible with a CardLayoutTag(s): AWT...........................................57
3.4 Use PopupsTag(s): AWT.................................................................................................58
3.5 Use a File DialogTag(s): AWT.........................................................................................60
3.6 Use TrueType fontTag(s): AWT.......................................................................................61
3.7 Display available fontsTag(s): AWT.................................................................................62
3.8 Font with 3D effectTag(s): AWT.......................................................................................62
3.9 Use the System ClipboardTag(s): AWT...........................................................................63
3.10 Maximize a FrameTag(s): AWT.....................................................................................64
3.11 Center a Frame/DialogTag(s): AWT..............................................................................65
3.12 Close a FrameTag(s): AWT...........................................................................................66
3.13 Call events on a Frame from a PanelTag(s): AWT........................................................68
3.14 Set the small topleft icon on a FrameTag(s): AWT......................................................70
3.15 Prevent a Frame to be resizedTag(s): AWT..................................................................70
3.16 Embed an image into a FrameTag(s): AWT AWT.........................................................72
3.17 Display a message boxTag(s): AWT.............................................................................74
3.18 Display a Splash screenTag(s): AWT............................................................................75
3.19 Vibrate a WindowTag(s): AWT......................................................................................77
3.20 Limit TextField input to numeric valueTag(s): AWT.......................................................79
3.21 Limit TextField input to a maximum lengthTag(s): AWT................................................81
3.22 React to the ENTER key in a TextfieldTag(s): AWT......................................................82
3.23 Make the ENTER key act like the TAB keyTag(s): AWT...............................................83
3.24 Reset all textfields in one shotTag(s): AWT...................................................................83
3.25 Limit a TextField to UppercaseTag(s): AWT..................................................................84
3.26 Have an ImageButtonTag(s): AWT................................................................................85
3.27 Reset a checkbox groupTag(s): AWT............................................................................88
3.28 Set the listbox widthTag(s): AWT...................................................................................89
3.29 Align the column in a ListTag(s): AWT...........................................................................90
3.30 Have a srolling text displayTag(s): AWT........................................................................90
3.31 Label dynamic resizingTag(s): AWT..............................................................................91
3.32 Make a TextArea "wordwrap"Tag(s): AWT..................................................................93
3.33 Synchronize a TextArea vs a ChoiceTag(s): AWT........................................................93
3.34 Display underlined textTag(s): AWT..............................................................................94
3.35 Display vertical textTag(s): AWT....................................................................................94
3.36 Have Label with many linesTag(s): AWT.......................................................................95

Real's [email protected]
3 AWT
3.37 Have a Label with underlined text Tag(s): AWT............................................................99
3.38 Have a Label acting as HTML HREF (URLLabel)Tag(s): AWT...................................100
3.39 Display a GIF in a CanvasTag(s): AWT.......................................................................102
3.40 Embed an image into a FrameTag(s): AWT AWT.......................................................103
3.41 Load several images from a single GIFTag(s): AWT...................................................105
3.42 Load an Image from a JAR fileTag(s): AWT................................................................106
3.43 Load an Icon from a jar (again)Tag(s): AWT...............................................................107
3.44 Scale an ImageTag(s): AWT........................................................................................107
3.45 Fade an imageTag(s): AWT.........................................................................................109
3.46 Rotate an imageTag(s): AWT......................................................................................111
3.47 Create a scrollable canvasTag(s): AWT......................................................................113
3.48 Use an Image as the Applet backgroundTag(s): Applet AWT.....................................117
3.49 Have a simple Image browserTag(s): AWT.................................................................118
3.50 Simulate a "mouse over" event to toggle an imageTag(s): AWT.................................121
3.51 Hide the mouse cursorTag(s): AWT............................................................................123
3.52 Make a color transparentTag(s): AWT.........................................................................123
3.53 Save an Image as a GIF or JPEG fileTag(s): AWT.....................................................124
3.54 Use the same background color as the browserTag(s): AWT.....................................126
3.55 Do simple animation using ImagesTag(s): AWT..........................................................126
3.56 Do simple animation to show "work in progress"Tag(s): AWT.....................................128
3.57 Get the color of a specific pixelTag(s): AWT................................................................129
3.58 Do "rubberband" drawingTag(s): AWT......................................................................130
3.59 Convert RGB value to Hexadecimal (to be used in HTML for example)Tag(s):
AWT....................................................................................................................................132
3.60 Draw a line or set a pixel in my own imageTag(s): AWT.............................................133
3.61 Draw a dashed lineTag(s): AWT..................................................................................133
3.62 Draw a line with a thicknessTag(s): AWT....................................................................134
3.63 Draw a pie chartTag(s): AWT......................................................................................136
3.64 Draw faster rectanglesTag(s): AWT.............................................................................138
3.65 Get a screen capture and save it as a JPEGTag(s): AWT..........................................139
3.66 Detect a double click vs simple clickTag(s): AWT.......................................................140
3.67 Detect the mouse button used when clickingTag(s): AWT..........................................141
3.68 Exit an application from a menuTag(s): AWT..............................................................142
3.69 Trigger a click on a ButtonTag(s): AWT Swing............................................................143
3.70 Display a TIFTag(s): AWT...........................................................................................144
3.71 Convert a multipage TIF into singlepage TIFTag(s): AWT......................................146
3.72 Convert many singlepage TIF into one multipage TIF Tag(s): AWT.......................147
3.73 Convert an Image to a BufferedImageTag(s): AWT....................................................148
3.74 Detect if a TIF is blank Tag(s): AWT............................................................................149
3.75 Convert TIF to PDFTag(s): AWT IO IO Open Source..................................................152
3.76 Convert a TIF to a JPGTag(s): AWT............................................................................153
4 Environment................................................................................................................................155
4.1 javaenv........................................................................................................................155
4.2 Read environment variables from an applicationTag(s): Environment..........................155
4.3 Retrieve environment variables (JDK1.5)Tag(s): Environment......................................159
4.4 Retrieve environment variable (JNI)Tag(s): Environment JNI.......................................159
4.5 Use a MAKE fileTag(s): Environment............................................................................160
4.6 Detect the browser/JVM type (deprecated)Tag(s): Environment DEPRECATED.........161

4.7 Fix the "Wrong magic number" error messageTag(s): Environment

Real's [email protected]
4 Environment
4.7 Fix the "Wrong magic number" error messageTag(s): Environment.............................163
4.8 Use a precompiler " la C" with JavaTag(s): Environment............................................164
4.9 Open source packages..................................................................................................164
4.10 Ant................................................................................................................................164
4.11 Simple boolean flag.....................................................................................................165
4.12 Determine what are the classes actually used in a Java Applet or application
Tag(s): Environment............................................................................................................165
4.13 Set the memory available to the JVMTag(s): Environment..........................................166
4.14 Generate the Javadoc "en franais"Tag(s): Environment Environment
Internationalization...............................................................................................................166
4.15 Use JDK1.5 new featuresTag(s): Environment............................................................167
4.16 Check the class versionTag(s): Environment..............................................................168
4.17 Get the system properties or the JVM uptimeTag(s): Environment.............................169
4.18 Detect if running in a 64bit JVMTag(s): Environment..................................................170
4.19 Set the default JVM typeTag(s): Environment.............................................................171
4.20 Select a particular JRE from the command lineTag(s): Environment..........................172
4.21 Get the PID (pure Java solution)Tag(s): Environment.................................................173
4.22 Get the PIDTag(s): Environment JNI...........................................................................174
4.23 Set default value for java property (system wide)Tag(s): Environment.......................175
4.24 Detect if running in a debug modeTag(s): Environment..............................................176
4.25 Capture the output of JAVACTag(s): Environment......................................................176
4.26 Freeze the JVIEW window in MS VJ++Tag(s): Environment.......................................177
4.27 Wrap a Java beans in a COM objectTag(s): Environment...........................................177
4.28 Know details about the JAVA at runtimeTag(s): Environment...................................179
4.29 Detect the Microsoft JVM version installedTag(s): Environment.................................180
4.30 Run JAVA as a Windows serviceTag(s): Environment Open Source..........................181
4.31 Execute a class from Windows ExplorerTag(s): Environment.....................................181
4.32 Create an icon to launch java apps for Windows?Tag(s): Environment......................183
4.33 Fix the "out of environment" error when setting a new CLASSPATHTag(s):
Environment........................................................................................................................183
4.34 Query Windows registryTag(s): Environment..............................................................184
4.35 Read/Write the Registry (Windows)Tag(s): Environment............................................186
4.36 Quickly retrieve available Java JVM on a workstation (Windows)Tag(s):
Environment........................................................................................................................194
4.37 Using regedit................................................................................................................194
4.38 Using a CMD file..........................................................................................................195
4.39 Get a return code from a VBSTag(s): IO Environment................................................196
4.40 List currently running processes (Windows)Tag(s): Environment................................197
4.40.1 Using TASKLIST.EXE.........................................................................................197
4.40.2 Using a VBS........................................................................................................198
4.41 Check if a program or process is running (Windows)Tag(s): Environment..................199
4.42 Detect if a process is running using WMIC Tag(s): Misc Prog HowTo Java
Environment........................................................................................................................201
4.43 Windows registry vs. Java JDK/JRE installationTag(s): Environment.........................202
4.44 Get the current Java version from a BAT fileTag(s): Environment..............................203
4.45 Get the Windows "My Documents" pathTag(s): Environment.....................................204
4.46 Get the Windows Desktop pathTag(s): Environment...................................................204
4.47 Get the Windows Special FoldersTag(s): Environment...............................................206
4.48 Create an Internet Shortcut (Windows)Tag(s): Environment.......................................207

Real's [email protected]
4 Environment
4.49 Detect if running in remote session (Windows)Tag(s): Environment...........................208
4.50 Detect if running a Citrix session (Windows)Tag(s): IO...............................................210
4.51 Create a Taglet to document database access (Javadoc)Tag(s): Environment..........210
4.51.1 newMethod.........................................................................................................211
4.52 Generate the Javadoc "en franais"Tag(s): Environment Environment
Internationalization...............................................................................................................214
4.53 Document a package using Javadoc Tag(s): Environment.........................................215
4.54 Display a comment in a JavadocTag(s): Environment.................................................216
4.55 Display XML in a javadocTag(s): Environment............................................................217
4.56 Add a copyright notice to a JavadocTag(s): Environment...........................................218
4.57 Use a Log fileTag(s): Environment..............................................................................218
4.58 Trace the executionTag(s): Environment.....................................................................221
4.59 Time the executionTag(s): Environment......................................................................222
4.60 Log information efficiently (with Log4J)Tag(s): Environment.......................................223
4.61 Change the logging level onthefly (Log4J)Tag(s): Environment..............................224
4.62 Enable debug log level on OpenSource package(Apache Commons Logging)
Tag(s): Environment............................................................................................................225
4.63 Use a JAR/ZIP/CAB file with an AppletTag(s): Environment.......................................226
4.64 Make ZIP/JAR file always accessible from appletTag(s): Environment.......................228
4.65 Make a JAR executableTag(s): Environment..............................................................228
4.66 Accessing jars from within a jarTag(s): Environment...................................................230
4.67 Access a JAR outside the CLASSPATHTag(s): Environment.....................................230
4.68 Extract a file from a JarTag(s): IO Environment...........................................................231
4.69 Determine if running from JARTag(s): Environment....................................................232
4.70 Get list of classes in package (in a Jar)Tag(s): Environment.......................................234
4.71 Add version to Jar packagingTag(s): Environment......................................................235
4.72 Use ANT to Build a JAR with version/build numberTag(s): Environment....................237
4.73 Include all jars in the classpath definitionTag(s): Environment....................................241
4.74 Windows batch file.......................................................................................................241
4.75 JDK6............................................................................................................................242
4.76 JAR (and ANT).............................................................................................................242
4.77 Detect browser type from an AppletTag(s): Applet Environment Javascript
interaction...........................................................................................................................244
4.78 Call a Javascript from the Applet.................................................................................244
4.79 Get the value from the serverside..............................................................................245
4.80 Detect if Java is enabled from HTMLTag(s): Environment..........................................245
4.81 See the Java Console Window Log (Java plugin)Tag(s): Applet Environment............246
5 Internationalization.....................................................................................................................247
5.1 javainter.......................................................................................................................247
5.2 Load resources based upon client environment at startupTag(s):
Internationalization..............................................................................................................247
5.3 Load resources dynamicallyTag(s): Internationalization................................................250
5.4 Load resources via a resources fileTag(s): Internationalization.....................................253
5.5 Display "special character" using UnicodeTag(s): Internationalization..........................257
5.6 Display chinese/japanese charactersTag(s): Internationalization..................................258
5.7 Localize a JOptionPane dialogTag(s): Internationalization Swing.................................258
5.8 Validate/Convert a number using the current Locale()Tag(s): Internationalization
String/Number......................................................................................................................260

5.9 Localize a JFileChooserTag(s): Internationalization Swing

Real's [email protected]
5 Internationalization
5.9 Localize a JFileChooserTag(s): Internationalization Swing...........................................261
5.10 Disable localizationTag(s): Internationalization............................................................264
5.11 Generate the Javadoc "en franais"Tag(s): Environment Environment
Internationalization...............................................................................................................264
5.12 Sort a String arrayTag(s): Internationalization Varia....................................................266
5.13 Accentuated characters in Properties/ResourceBundle fileTag(s):
Internationalization Language.............................................................................................268
5.14 Compare accentuated lettersTag(s): Internationalization String/Number....................268
5.15 Unaccent lettersTag(s): Internationalization String/Number........................................270
5.15.1 Using java.text.Normalizer..................................................................................270
5.15.2 Using String.replaceAll().....................................................................................271
5.15.3 The String.indexOf()............................................................................................271
5.16 Output accentuated characters to the consoleTag(s): IO Internationalization.............273
5.17 Java 1.6 or more..........................................................................................................273
5.18 Java 1.5 or less............................................................................................................274
5.19 Get the default character set of the JVMTag(s): IO Internationalization......................274
5.20 Convert OEM (DOS) file to Ansi (Windows)Tag(s): IO Internationalization.................275
5.21 Detect nonASCII character in a StringTag(s): Internationalization String/Number....276
5.22 Get the month (or day) name (localized)Tag(s): Date and Time
Internationalization...............................................................................................................277
6 IO..................................................................................................................................................279
6.1 javaio...........................................................................................................................279
6.2 Redirect output(stdout/stderr) to a frameTag(s): IO.......................................................279
6.3 Redirect printStackTrace() to a StringTag(s): IO...........................................................280
6.4 Redirect to a NULL deviceTag(s): IO.............................................................................281
6.5 Print a text file using the javax.print APITag(s): IO........................................................282
6.6 Print a String to a printer Tag(s): IO...............................................................................284
6.7 Print text to a printer easilyTag(s): IO............................................................................285
6.8 Print without a DialogTag(s): IO.....................................................................................286
6.9 Initialize and write to a serial portTag(s): IO..................................................................286
6.10 Open or close a CD/DVD driveTag(s): IO....................................................................287
6.11 Get the volume labelTag(s): IO....................................................................................288
6.12 Detect the storage device typeTag(s): IO....................................................................289
6.13 Turn on MQ Debug mode Tag(s): IO...........................................................................290
6.14 Get faster console output (System.out.println() replacement)Tag(s): IO.....................291
6.15 Simple input from the keyboardTag(s): IO...................................................................292
6.16 Output accentuated characters to the consoleTag(s): IO Internationalization.............294
6.17 Java 1.6 or more..........................................................................................................294
6.18 Java 1.5 or less............................................................................................................294
6.19 Clear the console and control attributesTag(s): IO Open Source................................295
6.20 Jansi.............................................................................................................................295
6.21 JCurses........................................................................................................................296
6.22 Easy keyboard input (JDK1.5)Tag(s): IO.....................................................................297
6.23 Force keyboard input in CAPS LOCK onTag(s): IO.....................................................298
6.24 Automatic conversion of System.out output Tag(s): IO...............................................299
6.25 Execute an external programTag(s): IO.......................................................................301
6.26 Using Runtime.exec()..................................................................................................301
6.27 Launch a Windows CMD (or BAT) file and retrieve the errorlevel or exitcode.............302

Real's [email protected]
6 IO
6.28 Launch a Unix script....................................................................................................303
6.29 Using the ProcessBuilder.............................................................................................303
6.30 Windows rundll32 utility...............................................................................................303
6.31 PDF (Windows only)....................................................................................................304
6.32 PDF (Mac only)............................................................................................................304
6.33 Path to executable with spaces in them.......................................................................304
6.34 VBSCRIPT...................................................................................................................305
6.35 HTML Help (Windows only).........................................................................................305
6.36 Start Excel....................................................................................................................305
6.37 Start a Windows application under another account....................................................306
6.38 Windows : execute something in Program Files..........................................................306
6.39 Launch the application associated with a file extensionTag(s): IO..............................307
6.40 Launch an application from another applicationTag(s): IO Language.........................308
6.41 Start the default browser from an applicationTag(s): IO..............................................310
6.42 Execute a Windows Shortcut (.lnk)Tag(s): IO..............................................................312
6.43 Create a file association with a Java programTag(s): IO Misc Prog HowTo................312
6.44 Capture the output from a VBSTag(s): IO....................................................................314
6.45 Get a return code from a VBSTag(s): IO Environment................................................315
6.46 Execute a CMD file stored in a JARTag(s): IO............................................................316
6.47 Open the default file explorerTag(s): IO.......................................................................318
6.48 Read the content of a fileTag(s): IO.............................................................................318
6.49 From a Java application...............................................................................................318
6.50 From a Java applet......................................................................................................319
6.51 Read a text file from a jarTag(s): IO.............................................................................321
6.52 Read a file from the internet Tag(s): Networking IO....................................................323
6.53 Extract a file from a JarTag(s): IO Environment...........................................................324
6.54 Read a data file with floatsTag(s): IO...........................................................................325
6.55 Write to the end of a fileTag(s): IO...............................................................................326
6.56 Write "real" ascii fileTag(s): IO.....................................................................................327
6.57 Copy a fileTag(s): IO....................................................................................................328
6.58 Use a "log file"Tag(s): IO.............................................................................................330
6.59 Delete files with a certain extensionTag(s): IO............................................................332
6.60 Insert a line in a fileTag(s): IO......................................................................................333
6.61 Read a file into a variable in one shotTag(s): IO..........................................................334
6.62 Serialize an object to a fileTag(s): IO...........................................................................334
6.63 Redirect stdout to a fileTag(s): IO................................................................................336
6.64 Get the "last modified" date from a fileTag(s): IO........................................................336
6.65 Check if a file existsTag(s): IO.....................................................................................337
6.66 Detect file modificationTag(s): IO.................................................................................337
6.67 File/directory polling to detect changeTag(s): IO Open Source...................................340
6.68 jpoller (directory poller)................................................................................................340
6.69 JNotify..........................................................................................................................340
6.70 Java Native Access (JNA)...........................................................................................340
6.71 Call native methods in a DLL from Java (NativeCall)..................................................341
6.72 Java 7..........................................................................................................................341
6.73 The simple (and naive!) approach...............................................................................341
6.74 Get the current directoryTag(s): IO..............................................................................341
6.75 Get the "root" of an applicationTag(s): IO....................................................................342
6.76 Get the content of a directory with a FilterTag(s): IO...................................................342

6.77 Get the content of a directory with subdirectoriesTag(s): IO

Real's [email protected]
6 IO
6.77 Get the content of a directory with subdirectoriesTag(s): IO........................................345
6.78 Get directory content faster with many files Tag(s): IO................................................346
6.79 Make a directoryTag(s): IO..........................................................................................348
6.80 Create a fixedlength fileTag(s): IO.............................................................................348
6.81 Delete a nonempty directoryTag(s): IO......................................................................349
6.82 Create a temporary fileTag(s): IO................................................................................349
6.83 Get the default character set of the JVMTag(s): IO Internationalization......................350
6.84 Parse a pathnameTag(s): IO.......................................................................................351
6.85 Handle CSV fileTag(s): IO Open Source.....................................................................352
6.86 com.Ostermiller.util CSV Utils......................................................................................352
6.87 opencsv........................................................................................................................352
6.88 ServingXML.................................................................................................................352
6.89 Super CSV...................................................................................................................352
6.90 csvreader.....................................................................................................................352
6.91 CSVFile........................................................................................................................352
6.92 FlatPack.......................................................................................................................352
6.93 CSVJDBC....................................................................................................................353
6.94 FFP..............................................................................................................................353
6.95 Convert OEM (DOS) file to Ansi (Windows)Tag(s): IO Internationalization.................353
6.96 Close a stream in a try/catch blockTag(s): IO..............................................................354
6.97 Rename a file extensionTag(s): IO..............................................................................355
6.98 Remove file extension Tag(s): IO................................................................................357
6.99 Remove HTML tags from a file to extract only the TEXTTag(s): IO String/Number
Networking...........................................................................................................................357
6.100 Using regular expression...........................................................................................357
6.101 Using javax.swing.text.html.HTMLEditorKit...............................................................358
6.102 Using an HTML parser...............................................................................................358
6.103 Using Apache Tika.....................................................................................................359
6.104 Get the Mime Type from a FileTag(s): IO..................................................................360
6.104.1 Using Java 7.....................................................................................................360
6.104.2 Using javax.activation.MimetypesFileTypeMap................................................360
6.104.3 Using java.net.URL...........................................................................................361
6.104.4 Using Apache Tika............................................................................................362
6.104.5 Using JMimeMagic............................................................................................363
6.104.6 Using mimeutil................................................................................................363
6.104.7 Using Droid.......................................................................................................363
6.104.8 Aperture framework...........................................................................................364
6.105 Sort a directory listing (based on the last modified timestamp)Tag(s): IO.................364
6.106 Sort files by the extensionTag(s): IO..........................................................................365
6.107 Filter a directory listing by dateTag(s): IO..................................................................367
6.108 Convert wildcard to a regex expressionTag(s): IO.....................................................368
6.109 Shorten a long pathTag(s): IO String/Number...........................................................369
6.110 Force a valid Windows filenameTag(s): IO................................................................373
6.111 Check if filename is validTag(s): IO...........................................................................374
6.112 Dump a file to a HEX fileTag(s): IO............................................................................375
6.113 List all files in the classpath or in a JarTag(s): IO......................................................376
6.114 Handle UTF8 file with BOMTag(s): IO.......................................................................377
6.115 Touch a file Tag(s): IO...............................................................................................380
6.116 Handle Excel filesTag(s): IO JDBC Open Source......................................................380

Real's [email protected]
6 IO
6.117 JDBCODBC Excel driver.........................................................................................381
6.118 JExcel........................................................................................................................381
6.119 POI.............................................................................................................................382
6.120 JXLS..........................................................................................................................382
6.121 xlSQL.........................................................................................................................383
6.122 JCOM.........................................................................................................................383
6.123 OpenXLS Java Spreadsheet SDK.............................................................................385
6.124 Create an Excel fileTag(s): IO....................................................................................387
6.125 Detect if a XLS Excel file contains a macro (using POI)Tag(s): IO............................387
6.126 Create or process a PDF fileTag(s): IO Open Source...............................................388
6.127 Create a PDFTag(s): IO Open Source.......................................................................390
6.128 iText...........................................................................................................................390
6.129 Split a PDF file (using iText)Tag(s): IO Open Source................................................392
6.130 Concatenate PDF files (using iText)Tag(s): IO Open Source....................................393
6.131 Convert TIF to PDFTag(s): AWT IO IO Open Source................................................394
6.132 Convert HTML to PDF using iTextTag(s): IO Open Source.......................................396
6.133 Convert HTML to PDF using YAHP Tag(s): IO OpenSource.....................................398
6.134 Convert a png/jpg/gif file to PDF using iTextTag(s): IO Open Source.......................400
6.135 Print a PDFTag(s): IO Open Source..........................................................................401
6.136 Extract text from a PDF (with Apache Tika) Tag(s): IO OpenSource........................402
6.137 Create a compressed (ZIP) fileTag(s): IO..................................................................402
6.138 Display compressed (ZIP) file contentTag(s): IO.......................................................403
6.139 Expand the compressed (ZIP) fileTag(s): IO.............................................................405
6.140 Emit a beepTag(s): IO................................................................................................405
6.141 Emit a ToneTag(s): IO...............................................................................................406
6.142 Play an audio file from an applicationTag(s): IO........................................................407
6.143 Produce special sound effectTag(s): IO.....................................................................409
6.144 Use the Java Speech API (JSPAPI)Tag(s): IO..........................................................412
6.145 Play a Windows sound Tag(s): IO.............................................................................414
7 JDBC............................................................................................................................................416
7.1 javajdbc........................................................................................................................416
7.2 Get JDBC driver for major database vendorsTag(s): JDBC..........................................416
7.3 Connect to a database via JDBCODBCTag(s): JDBC.................................................416
7.4 SELECT data from a tableTag(s): JDBC.......................................................................417
7.5 INSERT data into a tableTag(s): JDBC.........................................................................419
7.6 Tag(s): JDBC.................................................................................................................420
7.7 Tag(s): JDBC.................................................................................................................421
7.8 Test for an empty ResultSetTag(s): JDBC.....................................................................421
7.9 Get a record count with a SQL StatementTag(s): JDBC...............................................422
7.10 Store and retrieve an object from a tableTag(s): JDBC...............................................422
7.11 Retrieve an ImageTag(s): JDBC..................................................................................424
7.12 Insert an ImageTag(s): JDBC......................................................................................425
7.13 Call a stored procedureTag(s): JDBC..........................................................................425
7.14 Stored procedure with Input/Output parms and a ResultSetTag(s): JDBC..................426
7.15 Fix incomplete field returned by the ResultSetTag(s): JDBC.......................................427
7.16 Transfer a ResultSet to a JTableTag(s): JDBC Swing.................................................427
7.17 Detect SQL errors or warningsTag(s): JDBC...............................................................428
7.18 Using DSNless connectionTag(s): JDBC...................................................................430

7.19 Specify a CharSet when connecting to a DBMSTag(s): JDBC

Real's [email protected]
7 JDBC
7.19 Specify a CharSet when connecting to a DBMSTag(s): JDBC....................................430
7.20 List tables in a databaseTag(s): JDBC........................................................................431
7.21 Enable JDBC loggingTag(s): JDBC.............................................................................432
7.22 Detect if a table existsTag(s): JDBC............................................................................433
7.23 Convert a ResultSet to XMLTag(s): JDBC XML..........................................................434
7.24 Display ResultSet data in an HTML Table in ServletTag(s): JDBC Servlet/JSP.........436
7.25 Escape special character in a LIKE clauseTag(s): JDBC............................................436
7.26 Log the SQL StatementsTag(s): JDBC........................................................................437
7.27 Plain JDBC Logging.....................................................................................................437
7.28 P6Spy..........................................................................................................................437
7.29 Proxool.........................................................................................................................438
7.30 JDBC Logger...............................................................................................................438
7.31 Log4JDBC....................................................................................................................438
7.32 Oracle JDBC................................................................................................................438
7.33 Insert data in batch modeTag(s): JDBC.......................................................................438
7.34 Retrieve large ResultSetTag(s): JDBC........................................................................440
7.35 Handle datesTag(s): JDBC..........................................................................................442
7.36 Get current date using JDBCTag(s): JDBC.................................................................443
7.37 Insert the current dateTag(s): JDBC............................................................................444
7.38 Read data from Excel worksheetTag(s): JDBC...........................................................444
7.39 Handle Excel filesTag(s): IO JDBC Open Source........................................................446
7.40 JDBCODBC Excel driver...........................................................................................446
7.41 JExcel..........................................................................................................................446
7.42 POI...............................................................................................................................447
7.43 JXLS............................................................................................................................448
7.44 xlSQL...........................................................................................................................449
7.45 JCOM...........................................................................................................................449
7.46 OpenXLS Java Spreadsheet SDK...............................................................................450
7.47 Connect to an Oracle database with JDBCTag(s): JDBC............................................452
7.48 Connect to Oracle using a connection poolTag(s): JDBC...........................................454
7.49 Retrieve the generated keys (JDBC Oracle)Tag(s): JDBC..........................................457
7.50 Debug Oracle JDBC connectionTag(s): JDBC............................................................458
7.51 Connect to an Oracle database using KerberosTag(s): JDBC....................................460
7.52 Identify the connected program to an Oracle databaseTag(s): JDBC.........................461
7.53 Use a CHAR field in the WHERE clause in a PreparedStatementTag(s): JDBC........463
8 JNI................................................................................................................................................465
8.1 javajni...........................................................................................................................465
8.2 Use native code through JNITag(s): JNI........................................................................465
8.3 Pass a string to/from Java to/from CTag(s): JNI............................................................465
8.4 Set the computer clockTag(s): Date and Time JNI........................................................467
8.5 Determine the signature of a methodTag(s): JNI...........................................................468
8.6 Use arraysTag(s): JNI....................................................................................................469
8.7 Load a DLLTag(s): JNI...................................................................................................471
8.8 Use the MouseWheelTag(s): JNI...................................................................................471
8.9 Throw an Exception (from JNI code)Tag(s): JNI............................................................472
8.10 Throw my own Exception (from JNI code)Tag(s): JNI.................................................472
8.11 JNI from a packageTag(s): JNI....................................................................................473
8.12 Make a Window "stay on top"Tag(s): JNI....................................................................474

Real's [email protected]
8 JNI
8.13 Start a JVM from CTag(s): JNI.....................................................................................474
8.14 Retrieve environment variable (JNI)Tag(s): Environment JNI.....................................475
8.15 Get the PIDTag(s): Environment JNI...........................................................................476
8.16 Clear the console, set color and cursor position (JNI)Tag(s): JNI...............................477
8.17 Call Windows API (Open source solution)Tag(s): JNI Open Source...........................480
8.18 Detect if a program is running (JNA)Tag(s): JNI/JNA..................................................480
8.19 Get Windows Special Folders (JNA) Tag(s): JNI/JNA.................................................481
9 Javascript interaction.................................................................................................................483
9.1 javajs............................................................................................................................483
9.2 * Read me *Tag(s): Javascript interaction.....................................................................483
9.3 Wakeup a Java appletTag(s): Javascript interaction...................................................483
9.4 Call a Java method from JavascriptTag(s): Javascript interaction.................................486
9.5 Calling Java applets methods using DOM and JavaScriptTag(s): Javascript
interaction...........................................................................................................................487
9.6 Access Java variables from JavascriptTag(s): Javascript interaction............................488
9.7 Call Javascript from a Java appletTag(s): Javascript interaction...................................489
9.8 Using the javascript: protocol.........................................................................................489
9.9 Using the netscape.javascript.JSObject package..........................................................490
9.10 Create dynamic HTML from a Java appletTag(s): Javascript interaction....................491
9.11 Have Applets on different frames communicates with each otherTag(s):
Javascript interaction..........................................................................................................492
9.12 Send a message from an Applet to another Applet on a different pageTag(s):
Javascript interaction..........................................................................................................494
9.13 Retrieve values from a Java applet for HTML form (CGI)Tag(s): Javascript
interaction...........................................................................................................................496
9.14 Detect if an Applet is readyTag(s): Javascript interaction............................................497
9.15 Read/Write HTML field values from JAVATag(s): Javascript interaction.....................498
9.16 Detect if Java is enabledTag(s): Javascript interaction................................................500
9.17 Detect if Java 1.1 (with event delegation) is availableTag(s): Javascript interaction...500
9.18 Access Cookies from a Java AppletTag(s): Javascript interaction..............................501
9.19 Set Applet PARAM VALUE from javascriptTag(s): Javascript interaction...................503
9.20 Pass an Array between Java and JavascriptTag(s): Javascript interaction.................504
9.21 Interaction without LiveConnectTag(s): Javascript interaction.....................................507
9.22 Directory listing on the Web server in a Java AppletTag(s): Javascript interaction.....512
9.23 Have a Java button close the browser windowTag(s): Javascript interaction..............514
9.24 Detect if cookies are enabledTag(s): Javascript interaction........................................515
9.25 Display a page after all applets are loadedTag(s): Javascript interaction....................516
9.26 Detect browser type from an AppletTag(s): Applet Environment Javascript
interaction...........................................................................................................................516
9.27 Call a Javascript from the Applet.................................................................................516
9.28 Get the value from the serverside..............................................................................518
10 Servlet/JSP................................................................................................................................519
10.1 javajsp........................................................................................................................519
10.2 Read meTag(s): Servlet/JSP.......................................................................................519
10.3 Get parameters passed to a servletTag(s): Servlet/JSP..............................................519
10.4 Detect no argument condition in a ServletTag(s): Servlet/JSP....................................520
10.5 Set a Cookie from a servletTag(s): Servlet/JSP..........................................................521

10.6 Read a Cookie from a servletTag(s): Servlet/JSP

Real's [email protected]
10 Servlet/JSP
10.6 Read a Cookie from a servletTag(s): Servlet/JSP.......................................................521
10.7 Delete (or expire) a Cookie from a servletTag(s): Servlet/JSP....................................522
10.8 Ask for a password from a ServletTag(s): Servlet/JSP................................................522
10.9 Talk to a CGI/ServletTag(s): Networking Servlet/JSP.................................................523
10.10 Test for CookiesTag(s): Servlet/JSP..........................................................................524
10.11 Display ResultSet data in an HTML Table in ServletTag(s): JDBC Servlet/JSP.......524
10.12 Specify the filename to be used for a file sent by a ServletTag(s): Servlet/JSP........525
10.13 Pass information to another servlet/jspTag(s): Servlet/JSP.......................................526
10.14 Handle PDF outputTag(s): Servlet/JSP.....................................................................526
10.15 Detect if the connection is via a secure channelTag(s): Servlet/JSP.........................527
10.16 In a Servlet, check if Form Field is presentTag(s): Servlet/JSP.................................527
10.17 Get the root dir of a web appTag(s): Servlet/JSP Servlet/JSP..................................527
10.18 Get client IP address from JSPTag(s): Servlet/JSP...................................................528
10.19 Output a binary stream from a JSPTag(s): Servlet/JSP............................................528
10.20 Use a connection cache from JSPTag(s): Servlet/JSP Jaguar/EAServer.................529
10.21 Read a Web Application propertyTag(s): Servlet/JSP...............................................531
10.22 Use EJB from JSPTag(s): Servlet/JSP......................................................................531
10.23 Define a method in a JSP pageTag(s): Servlet/JSP..................................................532
10.24 Precompile JSP pagesTag(s): Servlet/JSP...............................................................532
10.25 Get a list of directories for JSPTag(s): Servlet/JSP...................................................533
10.26 Use and share a class in JSP pages Tag(s): Servlet/JSP.........................................534
10.27 Get the root dir of a web appTag(s): Servlet/JSP Servlet/JSP..................................535
10.28 Launch an applet from a JSPTag(s): Servlet/JSP.....................................................536
10.29 Prevent caching of a JSP outputTag(s): Servlet/JSP................................................536
10.30 Launch an external program, capture its output and display it in a JSPTag(s):
Servlet/JSP.........................................................................................................................537
10.31 Call another EJBTag(s): Servlet/JSP Jaguar/EAServer............................................539
10.32 Keep java files generated from JSP (BEA WLS)Tag(s): Servlet/JSP........................539
10.33 Get the server version (BEA WLS)Tag(s): Servlet/JSP.............................................539
10.34 Quickly create a Web application with BEA WLSTag(s): Servlet/JSP.......................540
10.35 Nicely display WEB.XML informationsTag(s): Servlet/JSP XML Jaguar/EAServer...540
10.36 Reverse the CLASSLOADER order (BEA)Tag(s): Servlet/JSP.................................542
10.37 Detect change in JSP and recompile (BEA)Tag(s): Servlet/JSP...............................543
10.38 Obtain a remote connection to a DataSource or EJB (Weblogic)Tag(s):
Servlet/JSP.........................................................................................................................543
11 Language...................................................................................................................................546
11.1 javalanguage.............................................................................................................546
11.2 * Read me *Tag(s): Language String/Number.............................................................546
11.3 Obtain from where a Class is loadedTag(s): Language Varia.....................................547
11.4 Get the class name in a static methodTag(s): Language............................................548
11.5 Get the current method nameTag(s): Language..........................................................549
11.6 JDK1.4.........................................................................................................................549
11.7 JDK1.5.........................................................................................................................549
11.8 Call a method dynamically (Reflection)Tag(s): Language...........................................550
11.9 Detect if a package is availableTag(s): Language.......................................................552
11.10 Create an object from a stringTag(s): Language.......................................................553
11.11 Get a variable value from the variable nameTag(s): Language.................................554
11.12 Make methods that have unspecified number of parametersTag(s): Language........555

Real's [email protected]
11 Language
11.13 Create a java source dynamically, compile and callTag(s): Language......................556
11.14 Java 1.6.....................................................................................................................556
11.15 Java 1.5 or less..........................................................................................................557
11.16 Launch an application from another applicationTag(s): IO Language.......................558
11.17 Access the enclosing class from an inner classTag(s): Language............................560
11.18 Access inner class from outsideTag(s): Language....................................................561
11.19 Use globally defined constantsTag(s): Language......................................................562
11.20 Serialize an ObjectTag(s): Language........................................................................563
11.21 Serialize an Object over a socketTag(s): Language..................................................565
11.22 Easily remove my debugging codeTag(s): Language................................................565
11.23 Have a singletonTag(s): Language............................................................................566
11.24 Multiple expressions in for loopsTag(s): Language...................................................566
11.25 Handle the List conflictTag(s): Language..................................................................567
11.26 Use a generic toString()Tag(s): Language.................................................................567
11.27 Use Object.clone()Tag(s): Language.........................................................................569
11.28 Static field, constructor and exceptionTag(s): Language...........................................570
11.29 Use a Label breakTag(s): Language.........................................................................571
11.30 Put printStackTrace() into a StringTag(s): Language................................................572
11.31 Iterate enum valuesTag(s): Language.......................................................................573
11.32 Get fields and values from an Object Tag(s): Language...........................................573
11.33 Use a HashtableTag(s): Language............................................................................575
11.34 Scan the content of a hashtableTag(s): Language....................................................575
11.35 Sort an arrayTag(s): Language Varia........................................................................575
11.36 Initialize multidimensional arrayTag(s): Language.....................................................577
11.37 Get array upperboundTag(s): Language...................................................................578
11.38 Convert a String to an array or an array to a stringTag(s): Language.......................578
11.38.1 String to Array...................................................................................................578
11.38.2 Array to String...................................................................................................579
11.39 Sort in reverse orderTag(s): Language......................................................................580
11.40 Resize an arrayTag(s): Language.............................................................................580
11.41 Dump array contentTag(s): Language.......................................................................582
11.42 Initialize a static arrayTag(s): Language....................................................................583
11.43 Sort an HashtableTag(s): Language..........................................................................583
11.44 Eliminate "[unchecked] unchecked call ..." compiler warning Tag(s): Language.......585
12 ANT............................................................................................................................................587
12.1 Sort on many fieldsTag(s): Language..........................................................................587
12.2 Optimize Collection usageTag(s): Language...............................................................589
12.3 Sort an HashMapTag(s): Language.............................................................................591
12.4 Get keys corresponding to a value from a MapTag(s): Language...............................592
12.5 Iterate a Collection and remove an itemTag(s): Language..........................................594
12.6 Count distinct elements in a VectorTag(s): Language.................................................595
12.7 Dump the content of a Collection (JDK 1.5)Tag(s): Language....................................596
12.7.1 List......................................................................................................................596
12.7.2 Map.....................................................................................................................597
12.8 Initialize a CollectionTag(s): Language........................................................................597
12.9 Merge (or add) two arrays into oneTag(s): Language.................................................600
12.10 Define an array (or Map, or ENUM) of functionsTag(s): Language...........................601
12.10.1 Using an interface.............................................................................................601

12.10.2 Using an enum

Real's [email protected]
12 ANT
12.10.2 Using an enum..................................................................................................602
12.11 Join a List as a StringTag(s): Language....................................................................603
12.12 Remove duplicates from a List Tag(s): Language.....................................................604
12.13 Convert a Map to a Properties (or vice versa)Tag(s): Language...............................605
12.14 Use an INI file (properties)Tag(s): Language.............................................................606
12.15 Open Source packages.............................................................................................606
12.16 Using Properties........................................................................................................606
12.17 Load a properties fileTag(s): Language.....................................................................608
12.18 Accentuated characters in Properties/ResourceBundle fileTag(s):
Internationalization Language.............................................................................................609
12.19 Have a multiline value in a properties fileTag(s): Language....................................609
12.20 Use XML with PropertiesTag(s): Language XML.......................................................610
12.21 Use the Registry to store informations (Preferences API)Tag(s): Language.............611
12.22 Sort Properties when savingTag(s): Language..........................................................612
13 Networking................................................................................................................................614
13.1 javanet.......................................................................................................................614
13.2 Extract network card addressTag(s): Networking........................................................614
13.3 Get the workstation name/ipTag(s): Networking..........................................................617
13.4 Find port number not in useTag(s): Networking...........................................................618
13.5 Disable DNS cachingTag(s): Networking.....................................................................619
13.6 Allow user:password in URLTag(s): Networking Security Common problems
WinAPI/Registry...................................................................................................................620
13.7 Encode/Decode to/from Base64Tag(s): String/Number Networking...........................621
13.8 Using javax.mail.internet.MimeUtility...........................................................................621
13.9 Using Apache Commons Codec..................................................................................622
13.10 MiGBase64................................................................................................................622
13.11 Lookup using MX record to validate mail serverTag(s): Networking..........................622
13.12 Send an email using the SMTP protocolTag(s): Networking.....................................631
13.13 Check if there is mail waitingTag(s): Networking.......................................................632
13.14 Receive emailTag(s): Networking..............................................................................634
13.15 Send email with an attachmentTag(s): Networking...................................................636
13.16 Send email with JavaMailTag(s): Networking............................................................641
13.17 Send email with authenticationTag(s): Networking....................................................644
13.18 Send HTML mail with images (Javamail)Tag(s): Networking....................................645
13.19 Debug a JavaMail ProgramTag(s): Networking.........................................................647
13.20 JavaMail Debug mode...............................................................................................647
13.21 Verify connectivity to the MailServer with Telnet :.....................................................648
13.22 Use a JavaMail server mockup to act as "inmemory" mail server.........................648
13.23 Send email with SMTPS (eg. Google GMail) (Javamail)Tag(s): Networking.............648
13.23.1 Settings for well known mail providers..............................................................650
13.24 Mix plain text and HTML content in a mailTag(s): Networking...................................650
13.25 Read an Outlook MSG fileTag(s): Networking Open Source.....................................651
13.26 Apache POI HSMF....................................................................................................651
13.27 msgparser..................................................................................................................653
13.28 jmbox.........................................................................................................................654
13.29 Handle EML file with JavaMailTag(s): Networking.....................................................654
13.30 Loading an .EML file..................................................................................................654
13.31 Saving an email to .EML file......................................................................................655

Real's [email protected]
13 Networking
13.32 Receive email using IMAPTag(s): Networking...........................................................656
13.33 Receive email using POP3Tag(s): Networking..........................................................659
13.34 Check if a file was modified on the serverTag(s): Networking...................................661
13.35 Check if a page existsTag(s): Networking.................................................................661
13.36 Connect through a ProxyTag(s): Networking Networking..........................................663
13.36.1 The Networking Properties................................................................................663
13.36.2 Proxy and Username/Password........................................................................664
13.36.3 Bypass a Proxy.................................................................................................666
13.37 Identify yourself using HTTP AuthentificationTag(s): Networking..............................666
13.38 Talk to a CGI/ServletTag(s): Networking Servlet/JSP...............................................668
13.39 Write/Read cookies using HTTPTag(s): Networking.................................................669
13.40 Read a file from the internet Tag(s): Networking IO..................................................671
13.41 Read a GIF or CLASS from an URL save it locallyTag(s): Networking.....................672
13.42 Resolve a relative URLTag(s): Networking................................................................674
13.43 File size from URLTag(s): Networking.......................................................................674
13.44 Use the HTTPS protocolTag(s): Networking..............................................................675
13.45 Fix certificate problem in HTTPSTag(s): Networking.................................................675
13.46 Fetch a page from GoogleTag(s): Networking...........................................................677
13.47 Upload a file to a serverTag(s): Networking...............................................................678
13.48 Remove HTML tags from a file to extract only the TEXTTag(s): IO
String/Number Networking...................................................................................................679
13.49 Using regular expression...........................................................................................679
13.50 Using javax.swing.text.html.HTMLEditorKit...............................................................679
13.51 Using an HTML parser...............................................................................................680
13.52 Using Apache Tika.....................................................................................................681
13.53 Extract links from an HTML pageTag(s): String/Number Networking........................682
13.54 Using javax.swing.text.html.HTMLEditorKit...............................................................682
13.55 Using an HTML parser...............................................................................................682
13.56 Call a web service (generated with BEA ServiceGen)Tag(s): Networking................683
13.57 Do basic authentication when calling a webservice Tag(s): Networking...................685
13.58 WS authentication from Weblogic..............................................................................686
13.59 Have a simple HTTP serverTag(s): Networking........................................................686
13.60 Connect through a ProxyTag(s): Networking Networking..........................................688
13.60.1 The Networking Properties................................................................................688
13.60.2 Proxy and Username/Password........................................................................690
13.60.3 Bypass a Proxy.................................................................................................691
13.61 Have timeout on socket connectionTag(s): Networking.............................................691
13.62 Ping a serverTag(s): Networking...............................................................................692
13.63 Get the Date from serverTag(s): Networking.............................................................693
13.64 Use the java.net.Socket.setSoLinger methodTag(s): Networking.............................694
13.65 Use the java.net.Socket.setTcpNoDelay methodTag(s): Networking........................694
13.66 Find out who is accessing my ServerSocketTag(s): Networking...............................695
13.67 Transfer a file via SocketTag(s): Networking.............................................................695
14 Security......................................................................................................................................698
14.1 javasecurity................................................................................................................698
14.2 Encrypt a passwordTag(s): Security............................................................................698
14.3 Transmit a password with MessageDigest..................................................................698
14.4 Store a password in a properties file............................................................................699

14.5 Create a checksumTag(s): Security

Real's [email protected]
14 Security
14.5 Create a checksumTag(s): Security.............................................................................702
14.6 Get the user nameTag(s): Applet Security...................................................................706
14.7 Get username using NT Challenge (NTLM)Tag(s): Security.......................................707
14.8 Check if the current user belongs a specific Windows group/roleTag(s): Security
Powerscript..........................................................................................................................709
14.9 Allow user:password in URLTag(s): Networking Security Common problems
WinAPI/Registry...................................................................................................................709
14.10 Prompt for password from the consoleTag(s): Security.............................................710
14.11 Prevent XSS exploitTag(s): Security..........................................................................711
14.12 Sanitize the input by removing suspicious tags.........................................................711
14.13 Sanitize the input based on a policy file.....................................................................712
14.14 Sanitize the output by removing suspicious characters.............................................712
14.15 Display a simple username/password Dialog from an AppletTag(s): Security..........713
15 Swing.........................................................................................................................................716
15.1 javaswing...................................................................................................................716
15.2 * Read me *Tag(s): Swing...........................................................................................716
15.3 Change component default fontTag(s): Swing.............................................................716
15.4 Repaint problem under the mouse cursor (JDK1.2)Tag(s): Swing..............................717
15.5 Set the LookAndFeelTag(s): Swing.............................................................................717
15.6 Use any LookAndFeel on any plateformTag(s): Swing................................................718
15.7 Use a TimerTag(s): Swing...........................................................................................719
15.8 Share ActionEvent handlerTag(s): Swing....................................................................719
15.9 Get default values for Swingbased user interfaceTag(s): Swing...............................721
15.10 Have a systray icon (Windows)Tag(s): Swing...........................................................722
15.11 Close a JFrame under conditionTag(s): Swing..........................................................724
15.12 Maximize a JFrameTag(s): Swing.............................................................................725
15.13 Capture System.out into a JFrameTag(s): Swing......................................................725
15.14 Remove the titlebar of JInternalFrameTag(s): Swing................................................728
15.15 Have borders on a JWindow/JFrameTag(s): Swing..................................................728
15.16 Display HTML in a JScrollPaneTag(s): Swing...........................................................729
15.17 Use a JOptionPaneTag(s): Swing..............................................................................730
15.18 Localize a JOptionPane dialogTag(s): Internationalization Swing.............................731
15.19 Customize JOptionPane buttonsTag(s): Swing.........................................................733
15.20 Localize a JFileChooserTag(s): Internationalization Swing.......................................733
15.21 Select a directory with a JFileChooserTag(s): Swing................................................736
15.22 Disable the JFileChooser's "New folder" buttonTag(s): Swing..................................737
15.23 Validate a filename from a JFileChooserTag(s): Swing.............................................739
15.24 Make a JFrame looks like a JDialogTag(s): Swing....................................................740
15.25 Make a JFrame always visibleTag(s): Swing.............................................................741
15.26 Show a JFrame on a specific screen in a dual monitor configuration Tag(s):
Swing..................................................................................................................................742
15.27 Make a JFrame not visible in the the TaskBar Tag(s): Swing....................................742
15.28 Based on JTextField content, enable or disable a JButtonTag(s): Swing..................743
15.29 Apply special filter to a JtextFieldTag(s): Swing........................................................744
15.30 Limit JTextField input to a maximum lengthTag(s): Swing........................................747
15.31 Validate a value on the lostFocus eventTag(s): Swing..............................................748
15.32 Make sure that my jTextfield has the focus when a JFrame is createdTag(s):
Swing..................................................................................................................................751

Real's [email protected]
15 Swing
15.33 Stop the beep on JFormattedTextFieldTag(s): Swing...............................................752
15.34 Right justified JTextfield contentTag(s): Swing..........................................................752
15.35 Set the focus on a particuliar JTextFieldTag(s): Swing..............................................752
15.36 Make JTextField unselectableTag(s): Swing.............................................................753
15.37 Disable copy paste functionality on JTextFieldTag(s): Swing....................................754
15.38 Use a JTree to navigate in a siteTag(s): Swing.........................................................755
15.39 Expand or collapse a JTreeTag(s): Swing.................................................................761
15.40 Have a popup attached to a JTreeTag(s): Swing......................................................763
15.41 Traverse a JTreeTag(s): Swing.................................................................................765
15.42 Show dotted lines in a JTreeTag(s): Swing...............................................................767
15.43 Explore directories with a JTreeTag(s): Swing..........................................................768
15.44 Prevent JTree collapsingTag(s): Swing.....................................................................769
15.45 Single selection in a JTreeTag(s): Swing...................................................................769
15.46 Reduce JTree children indentationTag(s): Swing......................................................770
15.47 Use + or for JTree IconsTag(s): Swing...................................................................770
15.48 Change the JTable header colorTag(s): Swing.........................................................772
15.49 Double click on a JTableTag(s): Swing......................................................................773
15.50 Read a data file into a JTableTag(s): Swing..............................................................775
15.51 Disable row selection in a JTableTag(s): Swing........................................................777
15.52 Read a data file into a JTable and reload if data file have changedTag(s): Swing....777
15.53 Hide a column in JTableTag(s): Swing......................................................................780
15.54 Scroll a JTable to the last rowTag(s): Swing..............................................................781
15.55 Transfer a ResultSet to a JTableTag(s): JDBC Swing...............................................782
15.56 Have on a JScrollPane/JTable an horizontal JScrollbarTag(s): Swing......................782
15.57 Make a JList select an item on doubleclick or the ENTER keyTag(s): Swing............783
15.58 Make a JList like a scrolling text displayTag(s): Swing..............................................784
15.59 Have images in a JListTag(s): Swing.........................................................................785
15.60 Add a row and clear a JListTag(s): Swing.................................................................787
15.61 Sort a JListTag(s): Swing...........................................................................................788
15.62 Double click on a JListTag(s): Swing.........................................................................790
15.63 Have a PopUp on a JListTag(s): Swing.....................................................................791
15.64 Make a JLabel selectable with the mouseTag(s): Swing...........................................792
15.65 Change JLabel background colorTag(s): Swing........................................................793
15.66 Bold / Unbold a JLabelTag(s): Swing.........................................................................794
15.67 Multiline JLabelTag(s): Swing..................................................................................794
15.68 Underline a stringTag(s): Swing.................................................................................794
15.69 Update a JLabelTag(s): Swing...................................................................................795
15.70 Display a blinking JLabelTag(s): Swing.....................................................................796
15.71 Set the cursor position in a JTextAreaTag(s): Swing.................................................797
15.72 Have Multiline string in a JToolTipTag(s): Swing.....................................................798
15.73 Change Tooltip colorTag(s): Swing............................................................................798
15.74 Change a JTooltip fontTag(s): Swing.........................................................................798
15.75 Keep a JTooltip visibleTag(s): Swing.........................................................................799
15.76 Display icon associated with an executableTag(s): Swing........................................800
15.77 Have items in JMenubar at rightmost positionTag(s): Swing.....................................802
15.78 Have an JButton with an ImageTag(s): Swing...........................................................803
15.79 Trigger a click on a ButtonTag(s): AWT Swing..........................................................804

16 Thread

Real's [email protected]
16 Thread........................................................................................................................................806
16.1 javathread..................................................................................................................806
16.2 Pipe the output of a thread to the input of another oneTag(s): Thread........................806
16.3 Pipe the output of a thread to the input of other threadsTag(s): Thread......................808
16.4 Wait the for the completion of a threadTag(s): Thread................................................810
16.5 Control a thread from outsideTag(s): Thread...............................................................811
16.6 Create a Timer objectTag(s): Thread...........................................................................812
16.7 Pause the executionTag(s): Thread.............................................................................813
16.8 Execute a method at a specified time intervalTag(s): Thread......................................814
16.9 Execute a process at regular intervalTag(s): Thread...................................................815
16.10 Handle concurrent read/writeTag(s): Thread.............................................................816
16.11 Communicate between threads using a QueueTag(s): Thread.................................818
16.12 Get a unique identifierTag(s): String/Number Thread Varia......................................823
16.13 Using java.rmi.dgc.VMID...........................................................................................823
16.14 Using java.util.UUID...................................................................................................823
16.15 Using Apache commons............................................................................................824
16.16 Using java.util.concurrent.AtomicLong.......................................................................824
17 Varia...........................................................................................................................................825
17.1 javavaria....................................................................................................................825
17.2 Use System time to generate unique IDTag(s): Date and Time Date and Time
Varia.....................................................................................................................................825
17.3 Get a unique identifierTag(s): String/Number Thread Varia........................................825
17.4 Using java.rmi.dgc.VMID.............................................................................................825
17.5 Using java.util.UUID.....................................................................................................826
17.6 Using Apache commons..............................................................................................826
17.7 Using java.util.concurrent.AtomicLong.........................................................................826
17.8 Get the hard disk serial number or Motherboard serial numberTag(s): Varia..............827
17.9 Motherboard serial number..........................................................................................827
17.10 Hard disk serial number.............................................................................................828
17.11 Sort an arrayTag(s): Language Varia........................................................................829
17.12 Sort a String arrayTag(s): Internationalization Varia..................................................831
17.13 Do a selection sortTag(s): Varia................................................................................833
17.14 Validate a Social Security Number (canadian)Tag(s): Varia......................................834
17.15 Validate a Credit Card NumberTag(s): Varia.............................................................835
17.16 Obtain from where a Class is loadedTag(s): Language Varia...................................838
17.17 Get the class name with or without the packageTag(s): Varia...................................839
17.18 See the generated bytecodeTag(s): Varia.................................................................841
17.19 Self replicating programsTag(s): Varia......................................................................843
17.20 A curiosity (strange Java code)Tag(s): Varia.............................................................844
17.21 Classic bugsTag(s): Varia..........................................................................................846
17.22 Number of the beast!Tag(s): Varia.............................................................................846
17.23 Use Java scripting engine (JDK 1.6)Tag(s): Varia.....................................................847
17.24 Pass or retrieve values from a scripting engine (jdk1.6)Tag(s): Varia.......................848
17.25 Preventing multiple instances of an applicationTag(s): Varia....................................850
17.26 Trap JVM shutdownTag(s): Varia..............................................................................854
17.27 Minimize all programs on Windows to show the DesktopTag(s): Varia.....................854
17.28 Display a progress indicator in the consoleTag(s): Varia...........................................855

Real's [email protected]
18 XML............................................................................................................................................857
18.1 javaxml.......................................................................................................................857
18.2 Read meTag(s): XML...................................................................................................857
18.3 Display XML using plain HTMLTag(s): XML................................................................858
18.4 Transform XML into HTML using XSLTTag(s): XML...................................................859
18.5 Parse using SAX or DOMTag(s): XML........................................................................860
18.6 Parse an XML stringTag(s): XML.................................................................................863
18.7 Create an XML document with DOMTag(s): XML.......................................................864
18.8 Attach a stylesheet to an XML fileTag(s): XML............................................................865
18.9 Create an XML file and attach an XSLTag(s): XML XML............................................866
18.10 Nicely display WEB.XML informationsTag(s): Servlet/JSP XML Jaguar/EAServer...869
18.11 Serialize an object using XMLTag(s): XML................................................................871
18.12 Convert a flat file to XML (SAX)Tag(s): XML.............................................................872
18.13 Convert a flat file to XML (DOM)Tag(s): XML............................................................874
18.14 Convert a ResultSet to XMLTag(s): JDBC XML........................................................876
18.15 Parse with XPathTag(s): XML....................................................................................878
18.16 Strip extra spaces in a XML stringTag(s): XML.........................................................882
18.17 Create an XML file and attach an XSLTag(s): XML XML..........................................882
18.18 Use XML with PropertiesTag(s): Language XML.......................................................885
18.19 Change a particular node in XMLTag(s): XML...........................................................886
18.20 Validate XML using a DTDTag(s): XML.....................................................................887
18.21 Validate XML using a XSD (XML Schema)Tag(s): XML............................................891
18.22 Sanitize XML String Tag(s): XML...............................................................................896
18.23 Produce HTML entities when using XSLTTag(s): XML.............................................897
18.24 Create a RSS feed (part 1)Tag(s): XML....................................................................897
18.24.1 RSS 2.0.............................................................................................................898
18.24.2 Atom..................................................................................................................899
18.24.3 Creating a feed..................................................................................................900
18.24.4 Creating a feed with Apache Commons Digester.............................................900
18.24.5 Creating a feed with Rome................................................................................901
18.25 Creating an RSS Feed (part 2)Tag(s): XML..............................................................903
18.26 Parse a RSS XML fileTag(s): XML............................................................................908
18.26.1 Parsing a feed with Apache Commons Digester...............................................909
18.26.2 Parsing a feed with ROME................................................................................910
18.26.3 RSSUTIL.TLD.................................................................................................910
18.27 Add a Live bookmarkTag(s): XML.............................................................................911
18.28 Validate a RSS feedTag(s): XML...............................................................................911
18.29 Attach a CSS to RSS feedTag(s): XML.....................................................................911
19 DEPRECATED...........................................................................................................................914
19.1 javadeprecated..........................................................................................................914
19.2 * Read me * (this howto is deprecated)Tag(s): DEPRECATED.................................914
19.3 Keep the console open after execution (this howto is deprecated)Tag(s):
DEPRECATED...................................................................................................................914
19.4 Read the Registry (this howto is deprecated)Tag(s): DEPRECATED.........................915
19.5 Call a Win API (this howto is deprecated)Tag(s): DEPRECATED...............................916
19.6 Display a BMP image (this howto is deprecated)Tag(s): DEPRECATED...................917
19.7 Play a WAV audio file (this howto is deprecated)Tag(s): DEPRECATED...................918
19.8 Detect if the MS JVM is used (this howto is deprecated)Tag(s): DEPRECATED........919
19.9 Get the latest MS JVM (this howto is deprecated)Tag(s): DEPRECATED..................919

19.10 Uninstalling the MS JVM (this howto is deprecated)Tag(s): DEPRECATED

Real's [email protected]
19 DEPRECATED
19.10 Uninstalling the MS JVM (this howto is deprecated)Tag(s): DEPRECATED.............919
19.11 Wrap a Java class in a COM object (this howto is deprecated)Tag(s):
DEPRECATED...................................................................................................................920
19.12 Sign an applet (this howto is deprecated)Tag(s): DEPRECATED.............................921
19.13 Bypass the need for a certificate (this howto is deprecated)Tag(s):
DEPRECATED...................................................................................................................922
19.14 Start an executable on the client (this howto is deprecated)Tag(s):
DEPRECATED...................................................................................................................923
19.15 Get rid of the message "Warning unsigned applet window" (this howto is
deprecated)Tag(s): DEPRECATED....................................................................................924
19.16 Read/write a local file from an Applet (this howto is deprecated)Tag(s):
DEPRECATED...................................................................................................................924
19.17 Write "otherbrowserfriendly" code when using the Netscape Capabilities
package (this howto is deprecated)Tag(s): DEPRECATED...............................................926
19.18 Disable the JIT compiler in Netscape or IE (this howto is deprecated)Tag(s):
DEPRECATED...................................................................................................................926
19.19 Start automatically JAVA when opening Netscape (this howto is deprecated)
Tag(s): DEPRECATED........................................................................................................927
19.20 Use Netscape Java Console hidden commands (this howto is deprecated)
Tag(s): DEPRECATED........................................................................................................927
19.21 Avoid the Netscape "Couldn't connect to '' with origin from
'localclasspathclasses'" message. (this howto is deprecated)Tag(s): DEPRECATED...928
19.22 Get the client IP address (deprecated)Tag(s): DEPRECATED.................................928
19.23 Detect the browser/JVM type (deprecated)Tag(s): Environment DEPRECATED.....929
19.24 Post a message on a newsserver using NNTP protocol (this howto is
deprecated)Tag(s): DEPRECATED....................................................................................931
19.25 Read messages from a newsserver (this howto is deprecated)Tag(s):
DEPRECATED...................................................................................................................932
19.26 Get a list of headers from a newsgroup (this howto is deprecated)Tag(s):
DEPRECATED...................................................................................................................933
19.27 Get a list of all available newsgroup from a newsserver (this howto is
deprecated)Tag(s): DEPRECATED....................................................................................934
19.28 Detect if Swing is installed (this howto is deprecated)Tag(s): DEPRECATED..........935
19.29 Make Swing always available from Netscape (this howto is deprecated)Tag(s):
DEPRECATED...................................................................................................................935
19.30 Send email with attachment (DEPRECATED)Tag(s): DEPRECATED......................936
20 String/Number...........................................................................................................................937
20.1 javastringnumber.......................................................................................................937
20.2 * Read me *Tag(s): Language String/Number.............................................................937
20.3 Convert from type X to type YTag(s): String/Number String/Number..........................938
20.4 Strip certain characters from a StringTag(s): String/Number.......................................940
20.5 Replace/remove character in a StringTag(s): String/Number......................................941
20.6 Replace every occurences of a string within a stringTag(s): String/Number...............943
20.7 "Tokenize" a stringTag(s): String/Number...................................................................944
20.8 Split a string using String.split()Tag(s): String/Number................................................949
20.9 Optimize String operationsTag(s): String/Number.......................................................952
20.9.1 StringBuilder (JDK1.5)........................................................................................954
20.10 Remove spaces from a stringTag(s): String/Number.................................................954

Real's [email protected]
20 String/Number
20.11 Test if a String starts with a digit or uppercase letterTag(s): String/Number.............955
20.12 Get InputStream from a StringTag(s): String/Number...............................................956
20.13 Easy String paddingTag(s): String/Number...............................................................956
20.14 Replace \r\n with the <br> tagTag(s): String/Number................................................958
20.15 Unaccent lettersTag(s): Internationalization String/Number......................................958
20.15.1 Using java.text.Normalizer................................................................................959
20.15.2 Using String.replaceAll()...................................................................................959
20.15.3 The String.indexOf()..........................................................................................960
20.16 Apply a mask to StringTag(s): String/Number...........................................................962
20.17 Format a String (JDK1.5)Tag(s): String/Number.......................................................963
20.18 Replace a "\" by "\\"Tag(s): String/Number................................................................964
20.19 Substitute tokens in a StringTag(s): String/Number...................................................965
20.20 Compare accentuated lettersTag(s): Internationalization String/Number..................965
20.21 Create a String with fixed length and filled with a specific characterTag(s):
String/Number.....................................................................................................................967
20.22 Unquote a StringTag(s): String/Number....................................................................967
20.23 Escape HTML special characters from a StringTag(s): String/Number.....................968
20.24 Unescape HTML special characters from a StringTag(s): String/Number.................970
20.25 Using HashMap.........................................................................................................970
20.26 Using Array................................................................................................................972
20.27 Detect nonASCII character in a StringTag(s): Internationalization
String/Number......................................................................................................................974
20.28 Remove HTML tags from a file to extract only the TEXTTag(s): IO
String/Number Networking...................................................................................................975
20.29 Using regular expression...........................................................................................975
20.30 Using javax.swing.text.html.HTMLEditorKit...............................................................976
20.31 Using an HTML parser...............................................................................................977
20.32 Using Apache Tika.....................................................................................................977
20.33 Extract links from an HTML pageTag(s): String/Number Networking........................978
20.34 Using javax.swing.text.html.HTMLEditorKit...............................................................978
20.35 Using an HTML parser...............................................................................................979
20.36 Convert a byte array to a Hex stringTag(s): String/Number.......................................980
20.37 Apply proper uppercase and lowercase on a StringTag(s): String/Number...............981
20.38 Encode/Decode to/from Base64Tag(s): String/Number Networking.........................982
20.39 Using javax.mail.internet.MimeUtility.........................................................................982
20.40 Using Apache Commons Codec................................................................................983
20.41 MiGBase64................................................................................................................984
20.42 Justify a string with wordwrapTag(s): String/Number................................................984
20.43 Shorten a long pathTag(s): IO String/Number...........................................................985
20.44 Ellipse a StringTag(s): String/Number.......................................................................989
20.45 Display Ascii Banner Tag(s): String...........................................................................990
20.46 Convert from type X to type YTag(s): String/Number String/Number........................991
20.47 Type conversion (JDK1.5)Tag(s): String/Number......................................................993
20.48 Round a doubleTag(s): String/Number......................................................................994
20.49 Display numbers with commasTag(s): String/Number...............................................995
20.50 Display numbers in scientific notationTag(s): String/Number....................................996
20.51 Display numbers with leading zeroesTag(s): String/Number.....................................997
20.52 Get a random numberTag(s): String/Number............................................................999
20.53 Convert an UNSIGNED byte to a JAVA typeTag(s): String/Number.........................999

20.54 Deal with bigendian and littleendian orderTag(s): String/Number

Real's [email protected]
20 String/Number
20.54 Deal with bigendian and littleendian orderTag(s): String/Number.......................1000
20.55 Pass an integer by referenceTag(s): String/Number...............................................1001
20.56 Pass floats as string literals to a methodTag(s): String/Number..............................1001
20.57 Get random numbersTag(s): String/Number...........................................................1002
20.58 Convert number into wordsTag(s): String/Number..................................................1002
20.59 Arithmetic with doubleTag(s): String/Number..........................................................1011
20.60 Detect even/odd numberTag(s): String/Number......................................................1011
20.61 Convert bytes to megabytesTag(s): String/Number.................................................1012
20.62 Validate a numberTag(s): String/Number................................................................1012
20.63 Get a unique identifierTag(s): String/Number Thread Varia....................................1013
20.64 Using java.rmi.dgc.VMID.........................................................................................1013
20.65 Using java.util.UUID.................................................................................................1014
20.66 Using Apache commons..........................................................................................1014
20.67 Using java.util.concurrent.AtomicLong.....................................................................1014
20.68 Validate/Convert a number using the current Locale()Tag(s):
Internationalization String/Number....................................................................................1015
20.69 Convert a fraction to a DoubleTag(s): String/Number..............................................1016
21 Open Source...........................................................................................................................1018
21.1 javaos......................................................................................................................1018
21.2 Call Windows API (Open source solution)Tag(s): JNI Open Source.........................1018
21.3 Call COM objectTag(s): Open Source.......................................................................1018
21.4 com4j.........................................................................................................................1018
21.5 jinterop.....................................................................................................................1019
21.6 jxchange..................................................................................................................1019
21.7 Run JAVA as a Windows serviceTag(s): Environment Open Source........................1019
21.8 Create entityrelation diagramTag(s): Open Source Open Source...........................1020
21.9 Java Remote desktop toolTag(s): Open Source........................................................1020
21.10 Create entityrelation diagramTag(s): Open Source Open Source.........................1021
21.11 Launch a java program as a Windows EXE fileTag(s): Open Source.....................1021
21.12 WinRun4J................................................................................................................1021
21.13 JSmooth...................................................................................................................1022
21.14 Launch4J.................................................................................................................1022
21.15 Handle CSV fileTag(s): IO Open Source.................................................................1022
21.16 com.Ostermiller.util CSV Utils..................................................................................1023
21.17 opencsv....................................................................................................................1023
21.18 ServingXML.............................................................................................................1023
21.19 Super CSV...............................................................................................................1023
21.20 csvreader.................................................................................................................1023
21.21 CSVFile....................................................................................................................1023
21.22 FlatPack...................................................................................................................1023
21.23 CSVJDBC................................................................................................................1023
21.24 FFP..........................................................................................................................1023
21.25 Handle Excel filesTag(s): IO JDBC Open Source....................................................1024
21.26 JDBCODBC Excel driver.......................................................................................1024
21.27 JExcel......................................................................................................................1024
21.28 POI...........................................................................................................................1025
21.29 JXLS........................................................................................................................1025
21.30 xlSQL.......................................................................................................................1026

Real's [email protected]
21 Open Source
21.31 JCOM.......................................................................................................................1027
21.32 OpenXLS Java Spreadsheet SDK...........................................................................1028
21.33 Browse a Queue (JMS/MQ)Tag(s): Open Source...................................................1030
21.34 Convert a .class to .java file (decompiler)Tag(s): Open Source..............................1030
21.35 Jad...........................................................................................................................1030
21.36 JadClipse.................................................................................................................1031
21.37 JD Java decompiler..............................................................................................1031
21.38 JarPlug.....................................................................................................................1031
21.39 Deploy an application as only 1 jarTag(s): Open Source.........................................1032
21.40 OneJar...................................................................................................................1032
21.41 Fat Jar......................................................................................................................1032
21.42 Read an Outlook MSG fileTag(s): Networking Open Source...................................1032
21.43 Apache POI HSMF..................................................................................................1033
21.44 msgparser................................................................................................................1035
21.45 jmbox.......................................................................................................................1035
21.46 File/directory polling to detect changeTag(s): IO Open Source...............................1036
21.47 jpoller (directory poller)............................................................................................1036
21.48 JNotify......................................................................................................................1036
21.49 Java Native Access (JNA).......................................................................................1036
21.50 Call native methods in a DLL from Java (NativeCall)..............................................1036
21.51 Java 7......................................................................................................................1037
21.52 The simple (and naive!) approach...........................................................................1037
21.53 Clear the console and control attributesTag(s): IO Open Source............................1037
21.54 Jansi.........................................................................................................................1037
21.55 JCurses....................................................................................................................1038
21.56 Disable Checkstyle from code Tag(s): OpenSource................................................1039
21.57 Create or process a PDF fileTag(s): IO Open Source.............................................1040
21.58 Create a PDFTag(s): IO Open Source.....................................................................1042
21.59 iText.........................................................................................................................1042
21.60 Split a PDF file (using iText)Tag(s): IO Open Source..............................................1043
21.61 Concatenate PDF files (using iText)Tag(s): IO Open Source..................................1045
21.62 Convert TIF to PDFTag(s): AWT IO IO Open Source..............................................1046
21.63 Convert HTML to PDF using iTextTag(s): IO Open Source.....................................1048
21.64 Convert HTML to PDF using YAHP Tag(s): IO OpenSource...................................1050
21.65 Convert a png/jpg/gif file to PDF using iTextTag(s): IO Open Source.....................1052
21.66 Print a PDFTag(s): IO Open Source........................................................................1053
21.67 Extract text from a PDF (with Apache Tika) Tag(s): IO OpenSource......................1053
21.68 Detect and remove blank page in pdf (iText)Tag(s): PDF.......................................1054

1 Applet
1.1 javaapplet

1.2 Goto to a new URL from an AppletTag(s): Applet


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0002.html
You have to use
getAppletContext().showDocument
(new URL("http://www.whatever.com"));

or
getAppletContext().showDocument
(new URL("http://www.whatever.com"),"HTML FRAME ID");

If "HTML frame ID" do not exists then a new browser window will be opened. The following "HTML
frame ID" have special meanings :
"_self"
"_parent"
"_top"
"_blank"

current frame
parent frame
base frame
new window

For example, we want to display lowres.html page if resolution is 640x480 else the hires.html is
used.
import java.applet.*;
import java.awt.*;
import java.net.*;
public class whatres extends Applet {
public void init() {
Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
if (dim.width==640 &dim.height==480) {
try {
getAppletContext().showDocument
(new URL(getCodeBase()+"lowres.html"),"_top");
}
catch (Exception ex) {}
}
else {
try {
getAppletContext().showDocument
(new URL(getCodeBase()+"hires.html"),"_top");
}
catch (Exception ex) {}
}

1 Applet

}
}
NOTE: The previous example works only so long as the document was retrieved without specifying an actual document name, since
getDocumentBase() returns the full URL including the name of the document. If the document name was specified, you should try something
like this or specify the complete URL (thanks to Rob Judd): :

try {
String docString = getDocumentBase().toString();
if (docString.endsWith("/")) {
getAppletContext().showDocument
(new URL(getDocumentBase()+"lowres.html"), "_top");
}
else {
getAppletContext().showDocument
(new URL(getDocumentBase()+"/../lowres.html"), "_top");
}
}
catch (Exception e) {}

Another example, type a new URL in a textfield, and press a button to go to that page.
import
import
import
import

java.applet.*;
java.awt.*;
java.awt.event.*;
java.net.*;

public class GotoURLButton extends Applet implements


ActionListener {
Button b;
TextField t;
public void init() {
t = new TextField(20);
t.setText("http://www.google.com");
add(t);
b = new Button("Go to this URL");
add(b);
b.addActionListener(this);
}
public void actionPerformed(ActionEvent ae) {
if (ae.getSource() == b) {
try {
getAppletContext().showDocument(new URL(t.getText()));
}
catch (Exception e) {
e.printStackTrace();
}
}
}
}

Try it here.

1 Applet

1.3 Determine the host from where the Applet is loadedTag(s):


Applet
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0003.html
import java.applet.*;
import java.awt.*;
public class FromWhere extends Applet {
public void init() {
Label label = new Label(getCodeBase().toString());
add(label);
//
// you can check the value of getCodeBase()
// to implements a simple copy protection
// scheme. If it's not equals to your
// URL then quit.
// NOTE : This is not a very strong protection!
//
}
}

Try it here

1.4 Have a scrolling status lineTag(s): Applet


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0010.html
/*
ScrollStatus.java
Optional parameters: message, width
Default values:
message = "Isn't scrolling text in the status line annoying? "
width = 36
Example usage:
<applet code="ScrollStatus.class"
width=0 height=0>
<param name="message" value="Hello World!">
<param name="width" value="24">
</applet>
*/
import java.util.*;
import java.applet.Applet;
public class ScrollStatus extends Applet implements Runnable {
Thread thread;
String message;
StringBuffer buffer;
int at;

1.3 Determine the host from where the Applet is loadedTag(s): Applet

int width;
public void init(){
message = getParameter("message");
if(message == null)
message = " Isn't scrolling text in the status line annoying? ";
String ws = getParameter("width");
if(ws == null) {
width = 36;
}
else{
width = Integer.valueOf(ws).intValue();
}
if(width < 5 || width > 180) {
width = 36;
}
buffer = new StringBuffer(width);
buffer.setLength(width);
at = 0;
if(message.length() < width) {
char buf[] = new char[width];
for(int i = 0; i < width; ++i) {
buf[i] = ' ';
}
message.getChars
(0, message.length(), buf, (width message.length()) / 2);
message = new String(buf);
}
}
public void start(){
thread = new Thread(this);
thread.start();
}
public void stop(){
thread.stop();
}
public void scroll(){
int ml = message.length();
int k = at;
for(int i = 0; i < width; ++i, ++k){
if(k >= ml) {
k = 0;
}
buffer.setCharAt(i, message.charAt(k));
}
getAppletContext().showStatus(buffer.toString());
at++;
if(at >= ml) {
at = 0;
}
}
public void run(){
while(true){
scroll();
try{
Thread.sleep(25); // wait 25 ms

1.3 Determine the host from where the Applet is loadedTag(s): Applet

}
catch(InterruptedException e){
break;
}
}
}
}

Try it here.

1.5 Use a search engineTag(s): Applet


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0011.html
import java.applet.Applet;
import java.net.*;
import java.awt.*;
public class SearchApplet extends Applet {
TextField searchParameter;
Choice
searchEngine;
Button
searchButton;
public void init() {
setBackground(Color.white);
searchParameter = new TextField(20);
add(searchParameter);
searchEngine = new Choice();
searchEngine.addItem("AltaVista");
searchEngine.addItem("WebCrawler");
searchEngine.addItem("Yahoo");
searchEngine.select(0);
add(searchEngine);
searchButton = new Button("Search");
add(searchButton);
}
// JDK1.02 style event handling
public boolean action(Event e, Object o) {
if (e.target.equals(searchButton)) {
try {
sendSearch();
}
catch (Exception e1) {
showStatus("Exception caught:" + e1.toString());
}
}
return true;
}
public void sendSearch() throws Exception {
String url;

1.5 Use a search engineTag(s): Applet

String searchString = searchParameter.getText();


if (searchString.equals("")) {
showStatus("Must enter a search string");
return;
}
switch (searchEngine.getSelectedIndex()) {
case 0: url =
"http://www.altavista.com/web/results?q=";
break;
case 1: url =
"http://msxml.webcrawler.com/info.wbcrwl/search/web/";
break;
case 2: url =
"http://search.yahoo.com/bin/search?p=";
break;
default: showStatus("Invalid search engine selected.");
return;
}
// encode the search data
url += URLEncoder.encode(searchString);
// launch the search engine
showStatus("Connecting to search location " + url);
getAppletContext().showDocument(new URL(url), "_top");
}
}

Try it here.
It's not easy to call Google from an Applet but you can do it in application as seen in this HowTo.

1.6 Have an onscreen clockTag(s): Applet


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0012.html
import
import
import
import

java.applet.*;
java.awt.*;
java.util.*;
java.text.*;

public class MyClock extends Applet {


MyPanel mp;
public void init() {
mp = new MyPanel(getParameter("format"));
add(mp);
}
}
class MyPanel extends Panel {
MyClockThread mct;
Color b, f;

1.6 Have an onscreen clockTag(s): Applet

SimpleDateFormat formatter;
String previousDateText = "";
String dateText;
MyPanel(String df) {
super();
formatter = new SimpleDateFormat(df);
validate();
setBackground(new Color(0).black);
setForeground(new Color(0).yellow);
b = this.getBackground();
f = this.getForeground();
mct = new MyClockThread(this);
mct.start();
}
public Dimension getPreferredSize() {
return new Dimension
(this.getFontMetrics(this.getFont()).stringWidth(getNow()) + 25, 30);
}
public void paint(Graphics g) {
if (g != null) {
g.setColor(b);
g.drawString(previousDateText,10,15);
g.setColor(f);
dateText = getNow();
g.drawString(dateText,10,15);
previousDateText = dateText;
}
}
public String getNow() {
return formatter.format(new Date());
}
}
class MyClockThread extends Thread {
MyPanel mp;
public MyClockThread(MyPanel a) {
mp = a;
}
public void run() {
while (true) {
try {
mp.repaint();
this.sleep(1000);
}
catch(InterruptedException e) { }
}
}
}
<HTML><HEAD></HEAD><BODY>
<APPLET CODE="MyClock.class"
HEIGHT=25 WIDTH=200>
<PARAM NAME="format" VALUE="yyyyMMdd hh:mm:ss">
</APPLET><P>
<APPLET CODE="MyClock.class"
HEIGHT=25 WIDTH=200>
<PARAM NAME="format" VALUE="h:mm a">

1.6 Have an onscreen clockTag(s): Applet

</APPLET><P>
<APPLET CODE="MyClock.class"
HEIGHT=25 WIDTH=200>
<PARAM NAME="format" VALUE="yyyy.MMMMM.dd GGG hh:mm aaa">
</APPLET><P>
<APPLET CODE="MyClock.class"
HEIGHT=25 WIDTH=200>
<PARAM NAME="format" VALUE="H:mm:ss:SSS">
</APPLET><P>
/BODY/HTML
Try it here.

1.7 Have Applets on the same page communicate with each


otherTag(s): Applet
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0022.html
[Applet1_0022.java]
import java.awt.*;
public class Applet1_0022 extends java.applet.Applet {
TextField inputText;
Button
b;
public void init() {
setLayout(new FlowLayout());
inputText = new TextField( "", 15 );
b = new Button("Send to Applet 2");
add(inputText);
add(b);
}
// JDK 1.02 style evant handling
public boolean action(Event ev, Object arg) {
if (ev.target instanceof Button) {
String textMsg = inputText.getText().trim();
Applet2_0022 applet2 =
(Applet2_0022)getAppletContext().getApplet("applet2");
if ( applet2 != null ) {
applet2.append( textMsg );
return true;
}
else {
System.out.println("Applet2 not found?");
return false;
}
}
return false;
}
}

1.7 Have Applets on the same page communicate with each otherTag(s): Applet

[Applet2_0022.java]
import java.awt.*;
public class Applet2_0022 extends java.applet.Applet {
TextArea textBox;
public void init() {
setLayout(new FlowLayout());
textBox = new TextArea( 5, 40 );
add( textBox );
}
public void append( String msg ) {
textBox.append( msg );
textBox.append( "\n" );
}
}

[HTML]
<HTML><HEAD></HEAD><BODY>
<APPLET CODE="Applet1_0022.class"
NAME="applet1"
HEIGHT=200 WIDTH=150>
</APPLET>
<APPLET CODE="Applet2_0022.class"
NAME="applet2"
HEIGHT=200 WIDTH=400>
</APPLET>
</BODY></HEAD>

Try it here.

1.8 Have Applets on different frames communicates with each


otherTag(s): Applet
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0023.html
It is possible to share data between different applets via static variables
[HTML (java0023.html)]
<HTML><HEAD></HEAD>
<FRAMESET COLS="50%,*">
<FRAME SRC="java0023f1.html" NAME="f1">
<FRAME SRC="java0023f2.html" NAME="f2">
</FRAMESET>
</HEAD>

1.8 Have Applets on different frames communicates with each otherTag(s): Applet

[HTML (java0023f1.html AND java0023f2.html)]


<HTML><HEAD></HEAD>
<BODY>
<APPLET CODE="Java0023.class"
HEIGHT=200
WIDTH=200>
</APPLET>
</BODY></HTML>

[JAVA source (Java0023.java)]


import java.awt.*;
import java.applet.*;
public class Java0023 extends Applet {
TextField tf;
Button
a,b;
public void init() {
setLayout(new FlowLayout());
a = new Button("Send to Message");
b = new Button("Receive from Message");
add(a);
add(b);
tf = new TextField(20);
add(tf);
}
// JDK 1.02 style evant handling
public boolean action(Event e, Object o) {
if (e.target instanceof Button) {
if (e.target == a) {
StaticMessage.message = tf.getText();
}
if (e.target == b) {
tf.setText(StaticMessage.message);
}
return true;
}
return false;
}
}
class StaticMessage {
public static String message = "";
}

Try it here.
Check this DDJ article for a more elaborate way to implement this principle.
There is one way to do it by using a Javascript function as a bridge, take a look at this Howto.

1.8 Have Applets on different frames communicates with each otherTag(s): Applet

1.9 Send a message from an Applet to another Applet on a


different pageTag(s): Applet
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0041.html
FirstApplet encodes the message for SecondApplet in the search (or query) section of
SecondApplet.html URL. Then SecondApplet decodes the search section of its URL and extract the
message coming from FirstApplet.
FirstAppletJ.html
<HTML><HEAD></HEAD><BODY>
<APPLET CODE="FirstAppletJ.class"
HEIGHT=100
WIDTH=300>
/APPLET/BODY/HTML

FirstAppletJ.java
import
import
import
import

java.applet.*;
java.awt.*;
java.awt.event.*;
java.net.*;

public class FirstAppletJ extends Applet implements


ActionListener {
Button b;
TextField t;
public void init() {
add(new Label("Message to 2nd applet :"));
add(t= new TextField(20));
add(b = new Button("Load 2nd applet"));
b.addActionListener(this);
}
public void actionPerformed(ActionEvent ae) {
if (ae.getSource() == b) {
try {
getAppletContext().showDocument
(new URL(getCodeBase(),
"SecondAppletJ.html?" + "message="
+ URLEncoder.encode(t.getText())));
}
catch (Exception e) {
e.printStackTrace();
}
}
}
}

SecondAppletJ.html
<HTML><HEAD></HEAD><BODY>
<APPLET CODE="SecondAppletJ.class"
HEIGHT=100
WIDTH=400>
/APPLET/BODY/HTML

1.9 Send a message from an Applet to another Applet on a different pageTag(s): Applet

SecondApplet.java
import java.applet.*;
import java.awt.*;
import java.net.*;
public class
public void
Label l =
add (l);
TextField
add(tf);

SecondAppletJ extends Applet {


init() {
new Label("Message from 1st Applet");
tf = new TextField( 50 );

// complete current URL


String s = getDocumentBase().toString();
// extract the search (or query) section
String theMessage = s.substring(s.indexOf('?') + 1);
// remove message header
theMessage = theMessage.substring("message=".length());
// decode the string (incomplete)
theMessage = theMessage.replace('+',' ');
/*
with JDK1.2, the decoding can be done
with java.net.URLDecoder.decode(theMessage).
you to convert from a MIME format called "xwwwformurlencoded"
to a String
To convert to a String, each character is examined in turn:
. The ASCII characters 'a' through 'z',
'A' through 'Z', and '0'
through '9' remain the same.
. The plus sign '+' is converted into a
space character ' '.
. The remaining characters are represented by 3character
strings which begin with the percent sign,
"%xy", where xy is the twodigit hexadecimal
representation of the lower 8bits of the character.
*/

tf.setText(theMessage);
}
}
You can try it here! NOTE : On IE, you must be connected to the Internet

The decoding is incomplete but should be Ok for simple need!


If you need to pass the message via the PARAM tag of the SecondApplet then take a look at this
Howto.

1.9 Send a message from an Applet to another Applet on a different pageTag(s): Applet

1.10 Have an applet launch an other appletTag(s): Applet


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0025.html
The idea is to load first a small Applet with a quick loading time, display a message to the user and
then load a larger Applet.
[HTML (testappletloader.html)
<HTML><HEAD></HEAD><BODY>
<APPLET CODE="AppletLoader.class"
NAME="AppletLoader"
HEIGHT=200
WIDTH=200>
<PARAM NAME="appletToLoad" VALUE="SecondApplet0025">
<PARAM NAME="SecondAppletParm" VALUE="Hello World">
</APPLET></BODY></HTML>

[JAVA source (AppletLoader.java)]


import java.applet.Applet;
import java.applet.AppletStub;
import java.awt.*;
public class AppletLoader extends Applet
implements Runnable, AppletStub {
String appletToLoad;
Thread appletThread;
public void init() {
appletToLoad = getParameter("appletToLoad");
setBackground(Color.white);
}
public void paint(Graphics g) {
g.drawString("Loading the Second Applet ...", 30, 30);
}
public void run() {
try {
//
// REMOVE THIS
//
for demo purpose only to see
//
the "loading message!
//
Thread.sleep(2000);
//
Class appletClass = Class.forName(appletToLoad);
Applet realApplet = (Applet)appletClass.newInstance();
realApplet.setStub(this);
setLayout( new GridLayout(1,0));
add(realApplet);
realApplet.init();
realApplet.start();
}
catch (Exception e) {

1.10 Have an applet launch an other appletTag(s): Applet

System.out.println( e );
}
validate();
}
public void start(){
appletThread = new Thread(this);
appletThread.start();
}
public void stop() {
appletThread.stop();
appletThread = null;
}
public void appletResize( int width, int height ){
resize( width, height );
}
}

[SecondApplet0025.java for demonstration]


import java.awt.*;
public class SecondApplet0025 extends java.applet.Applet {
TextField tf;
public void init() {
System.out.println("Starting Second applet");
add(new Label("Second Applet"));
add(tf = new TextField( 10 ) );
String s = getParameter("SecondAppletParm");
tf.setText(s);
}
}

try it here.

1.11 Get the user nameTag(s): Applet Security


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0048.html
In application :
public class Test {
public static void main(String args[]) {
System.out.println( System.getProperty("user.name") );
}
}

will print the current user. You can't use this technique to secure your application since it is very to
spoof.
1.11 Get the user nameTag(s): Applet Security

You just need to specify a "user.name" from the command line.


> java Duser.name=Elvis Test
Elvis

As an alternative with JDK1.5,


public class Test {
public static void main(String args[]) {
com.sun.security.auth.module.NTSystem NTSystem = new
com.sun.security.auth.module.NTSystem();
System.out.println(NTSystem.getName());
System.out.println(NTSystem.getDomain());
}
}

In Applet there is no way unless you ask for it or use a signed applet. If you have access to a
serverside, something like an ASP page can be used to detect the current NT user name if the
client and the server are configured correcty (SSO).
See this related HowTo for a JSP hack!

1.12 Access parameters passed in the URLTag(s): Applet


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0049.html
import
import
import
import

java.applet.Applet;
java.io.UnsupportedEncodingException;
java.util.HashMap;
java.util.Map;

@SuppressWarnings("serial")
public class AppletUrlParams extends Applet {
HashMap<String,String> parmsMap ;
public void init() {
/*
dump to the console the URL, the search and search values
the URL http://myserver.com/mypage.html?value1=x&value2=y&value3=z
the search value1=x&value2=y&value3=z
the values value1=x
value2=y
value3=z
then the values are stored in a map for easy reference.
ex. String name = parmsMap.get("name")
*/
try {
doit();
dumpMap(parmsMap);

1.12 Access parameters passed in the URLTag(s): Applet

//System.out.println("name is " + parmsMap.get("name"));


}
catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
public void doit() throws UnsupportedEncodingException {
String completeURL = getDocumentBase().toString();
System.out.println("Complete URL: " + completeURL);
int i = completeURL.indexOf("?");
if (i > 1) {
String searchURL = completeURL.substring(completeURL.indexOf("?") + 1);
System.out.println("Search URL: " + searchURL);
initMap(searchURL);
}
}
public void initMap(String search) throws UnsupportedEncodingException {
parmsMap = new HashMap<String,String>();
String params[] = search.split("&");
for (String param : params) {
String temp[] = param.split("=");
parmsMap.put(temp[0], java.net.URLDecoder.decode(temp[1], "UTF8"));
}
}
public void dumpMap(Map<?,?> map) {
System.out.println("");
for (Map.Entry<?,?> entry : map.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
System.out.println("");
}
}

Test it here.
The result in the Java console should be :
key : firsparam value : Hello
key : secondparam value : World
key : thirdparam value : Hello World

A note from mm300


Access parameters passed in the URL in line String completeURL = getDocumentBase().toString();
is a trap: Netscape won't return the whole URL, but only domain name and directory but without
.html and parameters. In IE and Firefox, it's ok.
So if we have www.domain.com/applets/win.html?winner=Maurice
Then getDocumentBase () returns :
NS: www.domain.com/applets/
IE: www.domain.com/applets/win.html?winner=Maurice

1.12 Access parameters passed in the URLTag(s): Applet

1.13 Convert an Applet to Application Tag(s): Applet


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0305.html
Take this simple Applet
import java.applet.*;
import java.awt.*;
public class UnderlineText extends Applet{
String s = "Java Howto";
int x=20;
int y=50;
public void init() {
add(new Button("Real's"));
}
public void paint(Graphics g) {
g.drawString(s, x,y);
g.drawLine(x , y+2 , x+getFontMetrics(getFont()).stringWidth(s) , y+2 );
}
}

You use it with the following HTML


<HTML>
<TABLE><TR><TD>
<APPLET CODE=UnderlineText.class WIDTH=100 HEIGHT=100>
</APPLET>
/HMTL

To be able to use the same class as an application, we simply extend a Panel instead of an Applet,
put it in Frame and call the init() method.
import java.awt.*;
public class UnderlineText extends Panel{
String s = "Java Howto";
int x=20;
int y=50;
public static void main(String[] args) {
Frame f = new Frame();
f.addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent e) {
System.exit(0);
};
});
UnderlineText ut = new UnderlineText();
ut.setSize(100,100); // same size as defined in the HTML APPLET
f.add(ut);

1.13 Convert an Applet to Application Tag(s): Applet

f.pack();
ut.init();
f.setSize(100,100 + 20); // add 20, seems enough for the Frame title,
f.show();
}
public void init() {
add(new Button("Real's"));
}
public void paint(Graphics g) {
g.drawString(s, x,y);
g.drawLine(x , y+2 , x+getFontMetrics(getFont()).stringWidth(s) , y+2 );
}
}

1.14 Change the mouse cursor in AppletTag(s): Applet


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0228.html
[JDK1.0.2]
// loop until the browser frame
Frame browserFrame;
Component parentComponent;
parentComponent = getParent();
while ( parentComponent != null &&
!(parentComponent instanceof Frame)) {
parentComponent = parentComponent.getParent();
}
browserFrame = (Frame) parentComponent;
browserFrame.setCursor(Frame.WAIT_CURSOR);
//
//
//
//
//
//
//

CROSSHAIR_CURSOR, DEFAULT_CURSOR,
E_RESIZE_CURSOR, HAND_CURSOR
MOVE_CURSOR, N_RESIZE_CURSOR,
NE_RESIZE_CURSOR, NW_RESIZE_CURSOR;
S_RESIZE_CURSOR,SE_RESIZE_CURSOR,
SW_RESIZE_CURSOR, TEXT_CURSOR,
W_RESIZE_CURSOR, WAIT_CURSOR

[JDK1.1]
// setCursor is supported at the component level
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));

1.14 Change the mouse cursor in AppletTag(s): Applet

1.15 Use an Image as the Applet backgroundTag(s): Applet AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0233.html
import java.applet.Applet;
import java.net.*;
//
//
//
//

TILE BACKGROUND
in the HTML use :
PARAM NAME="bgImage" VALUE="images/myImage.jpg"
in the APPLET tag

public class Tile extends Applet {


Image bgImage = null;
public void init() {
try {
MediaTracker tracker = new MediaTracker (this);
bgImage = getImage
(new URL(getCodeBase(), getParameter("bgImage")));
tracker.addImage (bgImage, 0);
tracker.waitForAll();
}
catch (Exception e) {
e.printStackTrace();
}
setLayout(new FlowLayout());
add(new Button("Ok"));
add(new TextField(10));
}
public void update( Graphics g) {
paint(g);
}
public void paint(Graphics g) {
if(bgImage != null) {
int x = 0, y = 0;
while(y < size().height) {
x = 0;
while(x<size().width) {
g.drawImage(bgImage, x, y, this);
x=x+bgImage.getWidth(null);
}
y=y+bgImage.getHeight(null);
}
}
else {
g.clearRect(0, 0, size().width, size().height);
}
}
}
<HTML>
<TABLE><TR><TD>
<APPLET CODE=Tile.class WIDTH=150 HEIGHT=150>
<PARAM NAME="bgImage" VALUE="images/jht.gif">
</APPLET>

1.15 Use an Image as the Applet backgroundTag(s): Applet AWT

/HMTL

Try it here.

1.16 Handle the new Control Activation mechanism in IETag(s):


Applet
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0526.html
Microsoft has now licensed the technologies from Eolas, removing the click to activate requirement
in Internet Explorer. This change will be made part of the next prerelease versions of Windows
Vista SP1 and Windows XP SP3. More at IEBlog
The latest IE patch introduces a new behavior with APPLETS or ActiveX controls on a page. This
was done to resolve an issue concerning a patent problem with a company called Eolas.
When a web page uses the APPLET, EMBED, or OBJECT elements to load an ActiveX control, the
control's user interface is blocked until the user activates it. If a page uses these elements to load
multiple controls, each interactive control must be individually activated.
A tooltip "Click to activate and use this control" is shown. Then to activate an interactive control,
either click it or use the TAB key to set focus on it and then press the SPACEBAR or the ENTER
key. Interactive controls loaded from external script files immediately respond to user interaction
and do not need to be activated.
Check out this Microsoft's white paper on the subject.

1.16.1 Solution #1
The workaround for an APPLET (to bypass the manual activation) is to generate in Javascript the
APPLET tag but you need to generate it from an outside JS page!
<html>
<body leftmargin=0 topmargin=0 scroll=no>
<script src="myapplet.js"></script>
</body>
</html>

and the myapplet.js is


document.write
('<applet code="MyApplet.class" height="2000" width="196"></applet>')

NOTE If you uncheck the Disable Script Debugging (Internet Explorer) option in the Advanced Tab
of the Internet Options Control Panel, controls will still require activation.

1.16 Handle the new Control Activation mechanism in IETag(s): Applet

NOTE: While inactive controls do not respond to direct user interaction; they do respond to script
commands.
Try a page with the regular APPLET tag here.
And now the same APPLET but with an external JS file here.
Both on the same page (same Applet), here!

The workaround suggested by Microsoft is fine with static APPLET tag but if your APPLET tag
needs to be generated by a JSP ou Servlet (to adjust the PARAM parameters for example) then
you're out of luck because the APPLET declaration is in a JS file which is a static file.

1.16.2 Solution #2
As seen in this article, all you need is to change the content from an outside file. So you need a
generic JS function to rewrite the APPLET tag with the original and that's it!
The main HTML (in BODY tag we call our "rewrite" function) :
<HTML><HEAD></HEAD>
<BODY onload="rewriteApplet();">
<p>This example "rewrite" the applet tag from an external JS.
This way you can generate the Applet tag from a JSP like before.
<P>
<script language="Javascript1.2" src="./rewriteapplet.js">
</script>
<APPLET CODE="TextFieldWithLimitApplet.class"
HEIGHT=100
WIDTH=300>
</APPLET>
</BODY></HTML>

The generic JS routine to rewrite all APPLET tags.


[rewriteapplet.js]
function rewriteApplet() {
var v=document.getElementsByTagName("applet");
for(i=0;i<v.length;i++){
var el=v[i];
el.outerHTML=el.outerHTML
}
}

Try it here!
The same principle can be used for the OBJECT tag.
This site http://www.ediy.co.nz/internetexplorerflashappletactivationfixxidc19237.html offers
a really small JS script (only 292 bytes long) to handle the situation.
IMPORTANT NOTES :
AFAIK, this trick does not work from a FRAME!
If you have PARAM tags associated with the applet then they will be replaced by two strange
PARAMS (_CX and _CY)! So beware... It looks that this behaviour has something to do with the
1.16.2 Solution #2

fact that the Java plugin is an ActiveX. PreXP SP2 installation are not supposed to do that kind
of substitution (not verified!).
For simple applet with no param, this is an interesting generic solution.

1.16.3 Solution #3
This solution is a little bit ugly but there is no better solution when you have dynamic APPLET
PARAM generated on the serverside.
The requirement is to write only the APPLET tag from an outside JS file, the PARAMS can be
handled by the main page like before! The trick is to have 2 external JS function, one to write the
<APPLET> tag (and the static PARAM if any) and a second function to write the </APPLET>. The
enclosed dynamic PARAM parameters are generated by the JSP (ASP page).
[rewriteapplet.js]
function writeHeader(urlApplet) {
document.write
('<applet codebase="' + urlApplet + '" code="myApplet.class"')
document.write
(' width="100%" height="98%" hspace="0" vspace="0" align="middle" >')
document.write
('
<PARAM NAME="printdialog" VALUE="false">')
}
function writeFooter() {
document.write('</applet>')
}

The JSP or ASP


...
<script language="Javascript1.2"
src="<%= CONTEXT_PATH %>/scripts/rewriteapplet.js">
/script
...
<script>
writeHeader('<%=urlApplet %>');
</script>
<%
if(resultVB.isObjectInResult(idObject)) {
int i = 1;
Iterator itPages = pages.iterator();
while (itPages.hasNext()) {
String url = (String) itPages.next();
%>
<PARAM NAME="page<%=i%>" value="<%=url %>">
<%
i++;
}
}
else {
%>
<PARAM NAME="page1" value="<%=fileUrlErr %>">
<%
}
%>

1.16.3 Solution #3

<script>
writeFooter();
/script

1.17 Pass parameters to the Applet JVM (WIN)Tag(s): Applet


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0531.html
It's possible to pass some parameters to the JVM in Applet but these have to be set in the
browser and cannot be controlled by your applet. Each user that loads your applet has to adjust
the JVM args themselves.
Open the Java control panel (in Windows: Start > Control Panel > Java) and select the Java tab.
Press View button of the Applet Runtime Settings, and add the required parameters in the 4th
column, it is editable event if it's grayed.
You have to make sure that that the parameter you supply are correct, otherwise your browser
will die when it tries to open the first applet.
This can be useful to set a JVM property to resolve a compatibilty problem with graphic card like
in this bug report : http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4839812.
You can force the language used in the Java console. In java control panel java tab, you set a
parameter for JRE Applet runtime.
Specify Duser.language=en to override the default locale in java control panel > java tab,
you set a parameter for JRE Applet runtime.

1.17 Pass parameters to the Applet JVM (WIN)Tag(s): Applet

1.18 See the Java Console Window Log (Java plugin)Tag(s):


Applet Environment
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0533.html
The Java Console Window Log is also stored on disk. On the Windows plateform, it's in the folder
:
C:\Documents and Settings\
<username>\
Application Data\
Sun\
Java\
Deployment\
log

It's a file with the extension .trace

1.19 Display debugging infos for an AppletTag(s): Applet


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0597.html
Make sure that all browsers and JRE are closed. Start the Java Configuration Panel via
StartParameters or you can launch C:\Program Files\Java\jre[version]\bin\javacpl.exe.
On the Java tab, click to set the parameter for the applet runtime (plugin). Now add the following
parameters in the column parameters.
Djavaplugin.trace=true Djavaplugin.trace.option=basic|net|security|ext|liveconnect

Next, on the Advanced tab, select Java Console > Display the console.
The next time when loading an applet, the java console will display with a full trace.
The log is stored in a file. For Windows, the file is C:\Documents and
Settings\[YourAccount]\Application Data\Sun\Java\Deployment\log\plugin[version].log/trace

1.18 See the Java Console Window Log (Java plugin)Tag(s): Applet Environment

1.20 Have an invisible Applet Tag(s): Applet


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0620.html
See this interesting article :
http://windyroad.org/2006/08/14/reintroducingjavascriptandhiddenappletsjaha/
The recommended way is to a CSS style to hide the Applet,
<applet id="applet_name"
code="path_to_applet_class/class_name"
style="width: 1px; height: 1px; float: left;"
mayscript></applet>

.. or you can insert your Applet into an invisible frame. See this HowTo for an example.

1.21 Keep the JVM loadedTag(s): Applet


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/javakeepthejvmloaded.html
The default Java plugin setting is when the first applet is invoked in a browser, the JVM starts
automatically. If you open further tabs or windows with applets and the previous applet is still
running, the new applets use the same JVM as the first one.
After the last running applet is closed (leave the page where it is embedded to or close the tab or
window), the JVM stops automatically.
After then, when you navigate to a page where an applet is located, a new JVM is launched. To
override this behavior you use a special parameter in the initial applet.
<PARAM NAME="legacy_lifecycle" VALUE="true">

or you unselect the new generation Java plugin option in the Java Panel.

1.22 Detect browser type from an AppletTag(s):


Applet Environment Javascript interaction
1.20 Have an invisible Applet Tag(s): Applet

Current version of this HowTo :


http://www.rgagnon.com/javadetails/../javadetails/javadetectbrowsertypefromanapplet.html

1.23 Call a Javascript from the Applet


With LiveConnect, we call a javascript to return the "UserAgent".
To compile, make sure that you have the plugin.jar in the classpath (or Eclipse Build Path). This
jar is usually located in [JRE]/lib folder. During runtime, it's already included by the Java plugin so
you don't have to worry about that.
The Java class
import
import
import
import

java.applet.*;
java.awt.event.*;
java.awt.*;
netscape.javascript.*;

public class GetUserAgent extends Applet


implements ActionListener {
private static final long serialVersionUID = 1L;
TextField tf;
Button b1;
JSObject win;
public void init(){
setLayout(new FlowLayout());
tf = new TextField(35);
b1 = new Button("get useragent from javascript");
b1.addActionListener(this);
add(tf);add(b1);
}
public void actionPerformed(ActionEvent ae) {
if (ae.getSource() == b1) {
JSObject win = (JSObject)JSObject.getWindow(this);
tf.setText((String)win.eval("getUserAgent();"));
}
}
}

Don't forget the MAYSCRIPT parameter in the APPLET tag, it's required since the Applet is using
the JSObject to interact with the Javascript.
<html>
<head>
<script>
function getUserAgent() {
return navigator.userAgent;
}
</script>
</head><body>
<applet code="GetUserAgent.class" MAYSCRIPT height=100 width=500></Applet>
</body>
</html>

1.23 Call a Javascript from the Applet

Try it here
You need to parse the returned value to detect browser type. Look at this utility,
http://code.google.com/p/useragentutils/ or at this code :
http://nerds.palmdrive.net/useragent/code.html to get the idea.

1.24 Get the value from the serverside


When serving the HTML containing the Applet, you add the UserAgent as parameter for the
Applet.
In a JSP/EL
<applet ... >
<param ... >
<param name="userAgent" value="${header['useragent']}" />
</applet>

and in the Applet


String userAgent = getParameter("userAgent");

and parse the returned value...

Written and compiled Ral Gagnon 2007 [email protected]


http://www.rgagnon.com

1.24 Get the value from the serverside

2 Date and Time


2.1 javadate

2.2 Have year on 4 digits from a Date objectTag(s): Date and


Time
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0096.html
You need to add 1900 to it to get the 4 digit year.
int year = myDate.getYear() + 1900;

The getYear() method returns the number of years elapsed after the year 1900. So for year 2000,
mydate.getYear() will return 100. So 100 + 1900 = 2000.

2.3 Get the current Date and TimeTag(s): Date and Time
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0106.html
import java.util.Calendar;
import java.text.SimpleDateFormat;
public class DateUtils {
public static final String DATE_FORMAT_NOW = "yyyyMMdd HH:mm:ss";
public static String now() {
Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_NOW);
return sdf.format(cal.getTime());
}
public static void main(String arg[]) {
System.out.println("Now : " + DateUtils.now());
}
}

Here some formatting possibilities available through the SimpleDateFormat class.


import java.util.Calendar;
import java.text.SimpleDateFormat;

2 Date and Time

public class DateUtils {

public static String now(String dateFormat) {


Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
return sdf.format(cal.getTime());
}
public static void main(String arg[]) {
System.out.println(DateUtils.now("dd MMMMM yyyy"));
System.out.println(DateUtils.now("yyyyMMdd"));
System.out.println(DateUtils.now("dd.MM.yy"));
System.out.println(DateUtils.now("MM/dd/yy"));
System.out.println(DateUtils.now("yyyy.MM.dd G 'at' hh:mm:ss z"));
System.out.println(DateUtils.now("EEE, MMM d, ''yy"));
System.out.println(DateUtils.now("h:mm a"));
System.out.println(DateUtils.now("H:mm:ss:SSS"));
System.out.println(DateUtils.now("K:mm a,z"));
System.out.println(DateUtils.now("yyyy.MMMMM.dd GGG hh:mm aaa"));
}
}
Thanks to T. Guirado for the idea.

2.4 Compute days between 2 datesTag(s): Date and Time


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0097.html
One technique is to compute by hand the number of milliseconds between two dates and then
convert the result in days.
import java.util.*;

public class DateUtils {


private DateUtils() { }
static final long ONE_HOUR = 60 * 60 * 1000L;
public static long daysBetween(Date d1, Date d2){
return ( (d2.getTime() d1.getTime() + ONE_HOUR) /
(ONE_HOUR * 24));
}
/*
testing
*/
public static void main(String[] args) {
java.text.SimpleDateFormat sdf =
new java.text.SimpleDateFormat("yyyyMMdd");

2.4 Compute days between 2 datesTag(s): Date and Time

Calendar first = Calendar.getInstance();


first.set(2008, Calendar.AUGUST, 1);
Calendar second = Calendar.getInstance();
System.out.println
(daysBetween(first.getTime(),second.getTime())
+ " day(s) between "
+ sdf.format(first.getTime()) + " and "
+ sdf.format(second.getTime()));
/*
* output :
*
21 day(s) between 20080801 and 20080822
*/
}
}
NOTE: The daysBetween() method works only on Dates set at midnight. One hour (known as the "fudge" factor) is added to the 2 Dates passed
as parameters to take in account the possible DLS (Day Light Saving) one hour missing.

Another way would be to compute the julian day number of both dates and then do the substraction.
See this HowTo. Thanks to P. Hill for the tip.
The package java.util.concurrent.TimeUnit; provides a class to make conversion between
milliseconds and days easier.
import java.util.*;
import java.util.concurrent.TimeUnit;
public class DateUtils {
private DateUtils() { }
public static long getDifference(Calendar a, Calendar b, TimeUnit units) {
return
units.convert(b.getTimeInMillis() a.getTimeInMillis(), TimeUnit.MILLISECONDS);
}
/*
testing
*/
public static void main(String[] args) {
java.text.SimpleDateFormat sdf =
new java.text.SimpleDateFormat("yyyyMMdd");
Calendar augustfirst2008 = Calendar.getInstance();
augustfirst2008.set(2008, Calendar.AUGUST, 1); // 20080801
Calendar today = Calendar.getInstance();
// today
System.out.println
(getDifference(augustfirst2008,today,TimeUnit.DAYS)
+ " day(s) between "
+ sdf.format(augustfirst2008.getTime()) + " and "
+ sdf.format(today.getTime()));
}
/*
* output :
*
921 day(s) between 20080801 and 20110208
*/
}

2.4 Compute days between 2 datesTag(s): Date and Time

2.5 Get the number of days in a monthTag(s): Date and Time


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0098.html
public static int daysInMonth(GregorianCalendar c) {
int [] daysInMonths = {31,28,31,30,31,30,31,31,30,31,30,31};
daysInMonths[1] += c.isLeapYear(c.get(GregorianCalendar.YEAR)) ? 1 : 0;
return daysInMonths[c.get(GregorianCalendar.MONTH)];
}

Actually, the Calendar class provides a method to that very simply. For a given Calendar or
GregorianCalendar object :
calObject.getActualMaximum(calobject.DAY_OF_MONTH)

In the Java API documentation there is a note saying that The version (getActualMaximum()) of this
function on Calendar uses an iterative algorithm to determine the actual maximum value for the
field. There is almost always a more efficient way to accomplish this (in most cases, you can simply
return getMaximum()). GregorianCalendar overrides this function with a more efficient
implementation. So it looks like it's a lot more efficient to call getActualMaximum from a
GregorianCalendar object than a Calendar object. (Thanks to P. Harris for the tip)
gregCalObject.getActualMaximum(gregCalObject.DAY_OF_MONTH)

2.6 Validate a dateTag(s): Date and Time


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0099.html

2.6.1 Using DateFormat


import java.text.*;
public class DateUtils {
public static boolean isValidDateStr(String date) {
try {
DateFormat df =
DateFormat.getDateInstance
(DateFormat.SHORT); // YYYYMMDD
df.setLenient(false);
// this is important!
df.parse(date);
}
catch (ParseException e) {
return false;
}
catch (IllegalArgumentException e) {

2.5 Get the number of days in a monthTag(s): Date and Time

return false;
}
return true;
}
public static void main(String[] args) {
System.out.println(" 19001213 valid ? "
+ DateUtils.isValidDateStr("19001213"));
// "199012/13" throws a ParseException
System.out.println(" 190012/13 valid ? "
+ DateUtils.isValidDateStr("190012/13"));
// "19901312" throws a IllegalArgumentException
System.out.println(" 19001312 valid ? "
+ DateUtils.isValidDateStr("19001312"));
/*
* output :
* 19001213 valid ? true
* 190012/13 valid ? false
* 19001312 valid ? false
*/
}
}

Using SimpleDateFormat
package com.rgagnon.howto;
import java.text.*;
public class DateUtils {
public static boolean isValidDateStr(String date, String format) {
try {
SimpleDateFormat sdf = new SimpleDateFormat(format);
sdf.setLenient(false);
sdf.parse(date);
}
catch (ParseException e) {
return false;
}
catch (IllegalArgumentException e) {
return false;
}
return true;
}
public static void main(String[] args) {
System.out.println(" 19001213 valid ? "
+ DateUtils.isValidDateStr("19001213","yyyyMMdd"));
// "199012/13" throws a ParseException
System.out.println(" 190012/13 valid ? "
+ DateUtils.isValidDateStr("190012/13","yyyyMMdd"));
// "19901312" throws a IllegalArgumentException
System.out.println(" 19001312 valid ? "
+ DateUtils.isValidDateStr("19001312","yyyyMMdd"));
/*
* output :
* 19001213 valid ? true
* 190012/13 valid ? false
* 19001312 valid ? false
*/
}

2.5 Get the number of days in a monthTag(s): Date and Time

2.6.2 Using GregorianCalendar


import java.util.*;
public class jtest {
public static void main(String args[]) {
try {
GregorianCalendar gc = new GregorianCalendar();
gc.setLenient(false);
// must do this
gc.set(GregorianCalendar.YEAR, 2003);
gc.set(GregorianCalendar.MONTH, 42);// invalid month
gc.set(GregorianCalendar.DATE, 1);
gc.getTime(); // exception thrown here
}
catch (Exception e) {
e.printStackTrace();
}
}
}

2.7 Determine to day of the weekTag(s): Date and Time


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0100.html
For the day of the week for today :
GregorianCalendar newCal = new GregorianCalendar( );
int day = newCal.get( Calendar.DAY_OF_WEEK );

For the day of the week for any date :


Calendar newCal = new GregorianCalendar();
newCal.set(1997, 2, 1, 0, 0, 0);
// BUG fix in Calendar class!
newCal.setTime(newCal.getTime());
int day = newCal.get(Calendar.DAY_OF_WEEK);
/*
also available :
newCal.get( Calendar.DAY_OF_MONTH )
newCal.get( Calendar.DAY_OF_WEEK_IN_MONTH )
newCal.get( Calendar.DAY_OF_YEAR )
newCal.get( Calendar.DATE )
*/

2.6.2 Using GregorianCalendar

2.8 Add/Substract Day/Month/Year to a DateTag(s): Date and


Time
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0101.html
add() and roll() are used to add or substract values to a Calendar object.
You specify which Calendar field is to be affected by the operation (Calendar.YEAR,
Calendar.MONTH, Calendar.DATE).
add() adds or substracts values to the specified Calendar field, the next larger field is modified when
the result makes the Calendar "rolls over".
import java.util.Calendar;
import java.text.SimpleDateFormat;
public class Test {
public static void main(String[] args) throws Exception {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
Calendar c1 = Calendar.getInstance();
c1.set(1999, 0 , 20); // 1999 jan 20
System.out.println("Date is : " + sdf.format(c1.getTime()));
c1.add(Calendar.DATE,20);
// or Calendar.DAY_OF_MONTH which is a synonym
System.out.println("Date + 20 days is : " + sdf.format(c1.getTime()));
/*
* output :
* Date is : 19990120
* Date + 20 days is : 19990209
*/
}
}

To substract, simply use a negative argument.


roll() does the same thing except you specify if you want to roll up (add 1) or roll down (substract 1)
to the specified Calendar field. The operation only affects the specified field while add() adjusts
other Calendar fields.
See the following example, roll() makes january rolls to december in the same year while add()
substract the YEAR field for the correct result.
import java.util.Calendar;
import java.text.SimpleDateFormat;
public class Test {
public static void main(String[] args) throws Exception {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
Calendar c1 = Calendar.getInstance();
c1.set(1999, 0 , 20); // 1999 jan 20
System.out.println("Date is : " + sdf.format(c1.getTime()));
c1.roll(Calendar.MONTH, false); // roll down, substract 1 month
System.out.println ("Date roll down 1 month : "

2.8 Add/Substract Day/Month/Year to a DateTag(s): Date and Time

+ sdf.format(c1.getTime()));
c1.set(1999, 0 , 20); // 1999 jan 20
System.out.println("Date is : " + sdf.format(c1.getTime()));
c1.add(Calendar.MONTH, 1); // substract 1 month
System.out.println
("Date minus 1 month : "
+ sdf.format(c1.getTime()));
/*
* output :
* Date is : 19990120
* Date roll down 1 month : 19991220
* Date is : 19990120
* Date minus 1 month : 19981220
*/
}
}

2.9 Get the correct TimeZone on DateFormatTag(s): Date and


Time
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0102.html
There is a bug in the DateFormat/SimpleDateFormat classes. We must set the TimeZone manually.
System.out.println("Good TimeZone from Calendar : " +
Calendar.getInstance().getTimeZone().getID());
DateFormat df = DateFormat.getDateInstance();
System.out.println("Bad TimeZone from DateFormat : " +
df.getTimeZone().getID());
// fix the TimeZone
df.setCalendar(Calendar.getInstance());
System.out.println("Good TimeZone from DateFormat : " +
df.getTimeZone.getID());

2.10 Simply format a date as "YYYYMMDD"Tag(s): Date and


Time
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0103.html
The format "YYYYMMDD" can be useful when sorting records or comparing 2 dates.
2.9 Get the correct TimeZone on DateFormatTag(s): Date and Time

public static String getStrDate(GregorianCalendar c) {


int m = c.get(GregorianCalendar.MONTH) + 1;
int d = c.get(GregorianCalendar.DATE);
String mm = Integer.toString(m);
String dd = Integer.toString(d);
return "" + c.get(GregorianCalendar.YEAR) + (m < 10 ? "0" + mm : mm) +
(d < 10 ? "0" + dd : dd);
}
Thanks to Vladimir Garmaev for the bug fix

Or you can use the SimpleDateFormat from the java.text package.


import java.util.Calendar;
import java.text.SimpleDateFormat;
public class TestDate {
public static void main(String args[]){
String DATE_FORMAT = "yyyyMMdd";
SimpleDateFormat sdf =
new SimpleDateFormat(DATE_FORMAT);
Calendar c1 = Calendar.getInstance(); // today
System.out.println("Today is " + sdf.format(c1.getTime()));
}
}

2.11 Compare 2 datesTag(s): Date and Time


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0104.html
import java.util.*;
import java.util.*;
import java.text.*;
public class TestDate {
public static void main(String args[]){
String DATE_FORMAT = "yyyyMMdd";
java.text.SimpleDateFormat sdf =
new java.text.SimpleDateFormat(DATE_FORMAT);
Calendar c1 = Calendar.getInstance();
Calendar c2 = Calendar.getInstance();
// remember months are zerobased : 0 jan 1 feb ...
c1.set(1999, 11 , 31);
c2.set(1999, 0 , 30);
System.out.print(sdf.format(c1.getTime()));
if (c1.before(c2)) {
System.out.print(" is before ");
}
if (c1.after(c2)) {
System.out.print(" is after ");
}

2.11 Compare 2 datesTag(s): Date and Time

if (c1.equals(c2)) {
System.out.print(" same as ");
}
System.out.println(sdf.format(c2.getTime()));
}
}

2.12 Parse a String to obtain a Date/GregorianCalendar


objectTag(s): Date and Time
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0105.html
import
import
import
import

java.util.Date;
java.util.Locale;
java.util.Calendar;
java.text.SimpleDateFormat;

public class DateUtils {


public static Calendar parseTimestamp(String timestamp)
throws Exception {
/*
** we specify Locale.US since months are in english
*/
SimpleDateFormat sdf = new SimpleDateFormat
("ddMMMyyyy HH:mm:ss", Locale.US);
Date d = sdf.parse(timestamp);
Calendar cal = Calendar.getInstance();
cal.setTime(d);
return cal;
}
public static void main (String a[]) throws Exception{
String timestampToParse = "24Feb1998 17:39:35";
System.out.println("Timestamp : " + timestampToParse);
SimpleDateFormat sdf =
new java.text.SimpleDateFormat("yyyyMMdd HH:mm:ss");
System.out.println("Calendar : "
+ sdf.format(parseTimestamp(timestampToParse).getTime()));
/*
output :
Timestamp : 24Feb1998 17:39:35
Calendar : 19980224 17:39:35
*/
}
}

2.12 Parse a String to obtain a Date/GregorianCalendar objectTag(s): Date and Time

2.13 Use System time to generate unique IDTag(s): Date and


Time Date and Time Varia
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0385.html
Since the granulaty of a PC can be as high as 55ms (down to 10ms), you can't use the System time
to generate a unique ID because of the risk of getting duplicated IDs. This can be solved by using
the following technique to make sure that the number returned is unique (in a single JVM).
public class UniqueID {
static long current= System.currentTimeMillis();
static public synchronized long get(){
return current++;
}
}

See also this HowTo

2.14 Get the day nameTag(s): Date and Time


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0403.html
import java.util.*;
import java.text.SimpleDateFormat;
import java.text.DateFormat;

public class GetDayName {


public static void main(String[] args) {
Date date1 =
(new GregorianCalendar
(1989, Calendar.OCTOBER, 17)).getTime();
Date date2 = new Date();
System.out.println
("19891017 was a " + sayDayName(date1));
System.out.println("Today is a " + sayDayName(date2));
}
public static String sayDayName(Date d) {
DateFormat f = new SimpleDateFormat("EEEE");
try {
return f.format(d);
}
catch(Exception e) {

2.13 Use System time to generate unique IDTag(s): Date and Time Date and Time Varia

e.printStackTrace();
return "";
}
}
}

An alternate way :
import
import
import
import

java.util.Calendar;
java.text.SimpleDateFormat;
java.text.DateFormat;
java.text.DateFormatSymbols;

public class GetDayName {


public static void main(String[] args) {
String dayNames[] = new DateFormatSymbols().getWeekdays();
Calendar date2 = Calendar.getInstance();
System.out.println("Today is a "
+ dayNames[date2.get(Calendar.DAY_OF_WEEK)]);
}
}

2.15 Find the current date formatTag(s): Date and Time


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0413.html
import java.text.*;
import java.util.*;
public class Dtest {
public static void main(String args[]) {
SimpleDateFormat df = (SimpleDateFormat)
DateFormat.getDateInstance(DateFormat.SHORT);
System.out.println("The short date format is " + df.toPattern());
Locale loc = Locale.ITALY;
df = (SimpleDateFormat)
DateFormat.getDateInstance(DateFormat.SHORT, loc);
System.out.println("The short date format is " + df.toPattern());
}
}

2.15 Find the current date formatTag(s): Date and Time

2.16 Get a julian dateTag(s): Date and Time


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0506.html
A Julian date is the number of elapsed days since the beginning of a cycle of 7,980 years invented
by Joseph Scaliger in 1583. The purpose of the system is to make it easy to compute an integer
(whole number) difference between one calendar date and another calendar date.
The starting point for the first Julian cycle began on January 1, 4713 B.C. and will end on January
22, 3268 (32680122 G). The following day will begin the first day of the second Julian date period
(or 7,980 year cycle).
import java.util.Calendar;
public class JulianDate {
/**
* Returns the Julian day number that begins at noon of
* this day, Positive year signifies A.D., negative year B.C.
* Remember that the year after 1 B.C. was 1 A.D.
*
* ref :
* Numerical Recipes in C, 2nd ed., Cambridge University Press 1992
*/
// Gregorian Calendar adopted Oct. 15, 1582 (2299161)
public static int JGREG= 15 + 31*(10+12*1582);
public static double HALFSECOND = 0.5;
public static double toJulian(int[] ymd) {
int year=ymd[0];
int month=ymd[1]; // jan=1, feb=2,...
int day=ymd[2];
int julianYear = year;
if (year < 0) julianYear++;
int julianMonth = month;
if (month > 2) {
julianMonth++;
}
else {
julianYear;
julianMonth += 13;
}
double julian = (java.lang.Math.floor(365.25 * julianYear)
+ java.lang.Math.floor(30.6001*julianMonth) + day + 1720995.0);
if (day + 31 * (month + 12 * year) >= JGREG) {
// change over to Gregorian calendar
int ja = (int)(0.01 * julianYear);
julian += 2 ja + (0.25 * ja);
}
return java.lang.Math.floor(julian);
}
/**
* Converts a Julian day to a calendar date
* ref :
* Numerical Recipes in C, 2nd ed., Cambridge University Press 1992
*/
public static int[] fromJulian(double injulian) {
int jalpha,ja,jb,jc,jd,je,year,month,day;
double julian = injulian + HALFSECOND / 86400.0;

2.16 Get a julian dateTag(s): Date and Time

ja = (int) julian
if (ja>= JGREG) {
jalpha = (int) (((ja 1867216) 0.25) / 36524.25);
ja = ja + 1 + jalpha jalpha / 4;
}
jb = ja + 1524;
jc = (int) (6680.0 + ((jb 2439870) 122.1) / 365.25);
jd = 365 * jc + jc / 4;
je = (int) ((jb jd) / 30.6001);
day = jb jd (int) (30.6001 * je);
month = je 1;
if (month > 12) month = month 12;
year = jc 4715;
if (month > 2) year;
if (year <= 0) year;
return new int[] {year, month, day};
}
public static void main(String args[]) {
// FIRST TEST reference point
System.out.println("Julian date for May 23, 1968 : "
+ toJulian( new int[] {1968, 5, 23 } ));
// output : 2440000
int results[] = fromJulian(toJulian(new int[] {1968, 5, 23 }));
System.out.println
("... back to calendar : " + results[0] + " "
+ results[1] + " " + results[2]);
// SECOND TEST today
Calendar today = Calendar.getInstance();
double todayJulian = toJulian
(new int[]{today.get(Calendar.YEAR), today.get(Calendar.MONTH)+1,
today.get(Calendar.DATE)});
System.out.println("Julian date for today : " + todayJulian);
results = fromJulian(todayJulian);
System.out.println
("... back to calendar : " + results[0] + " " + results[1]
+ " " + results[2]);
// THIRD TEST
double date1 = toJulian(new int[]{2005,1,1});
double date2 = toJulian(new int[]{2005,1,31});
System.out.println("Between 20050101 and 20050131 : "
+ (date2 date1) + " days");
/*
expected output :
Julian date for May 23, 1968 : 2440000.0
... back to calendar 1968 5 23
Julian date for today : 2453487.0
... back to calendar 2005 4 26
Between 20050101 and 20050131 : 30.0 days
*/
}
}

There is a lot of variation around the idea of a "Julian date". You can have the Modified Julian Date
(JD) or the Truncated Julian Date (TJD). The main difference is the starting for counting the days.

2.16 Get a julian dateTag(s): Date and Time

Before Y2K, many applications (especially mainframe systems) were storing dates in a format
called "the Julian format". This format is a 5 digit number, consisting of a 2 digit year and a 3 digit
dayofyear number. For example, 17July1998 is stored as 98221, since 17July is the 221th
day of the year. This format is not really useful since Y2K! The main reason for using the 5digits
Julian date was to save disk space and still have a format easy to use to handle. dates.
A variation of this idea is to used the first four digits for the year and 3 digits for dayofyear,
17July1998 will be represented by 1998221.
This is a very simple format which can be manipulated easily from Java.
import
import
import
import

java.util.Calendar;
java.util.Date;
java.text.ParseException;
java.text.SimpleDateFormat;

public class DateUtils {


private DateUtils() { }
public static Date getDateFromJulian7(String julianDate)
throws ParseException
{
return new SimpleDateFormat("yyyyD").parse(julianDate);
}
public static String getJulian7FromDate(Date date) {
StringBuilder sb = new StringBuilder();
Calendar cal = Calendar.getInstance();
cal.setTime(date);
return

sb.append(cal.get(Calendar.YEAR))
.append(String.format("%03d", cal.get(Calendar.DAY_OF_YEAR)))
.toString();

}
public static void main(String[] args) throws Exception {
String test = "1998221";
Date d = DateUtils.getDateFromJulian7(test);
System.out.println(d);
System.out.println(DateUtils.getJulian7FromDate(d));
/*
* output :
*
Sun Aug 09 00:00:00 EDT 1998
*
1998221
*/
}
}

2.16 Get a julian dateTag(s): Date and Time

2.17 Calculate the ageTag(s): Date and Time


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0547.html
import java.util.GregorianCalendar;
import java.util.Calendar;
public class CalcAge {
public static void main(String [] args) {
// remember ... months are 0based : jan=0 feb=1 ...
System.out.println
("19621111 : " + age(1962,10,11));
System.out.println
("19991203 : " + age(1999,11,3));
}
private static int age(int y, int m, int d) {
Calendar cal = new GregorianCalendar(y, m, d);
Calendar now = new GregorianCalendar();
int res = now.get(Calendar.YEAR) cal.get(Calendar.YEAR);
if((cal.get(Calendar.MONTH) > now.get(Calendar.MONTH))
|| (cal.get(Calendar.MONTH) == now.get(Calendar.MONTH)
&cal.get(Calendar.DAY_OF_MONTH) > now.get(Calendar.DAY_OF_MONTH)))
{
res;
}
return res;
}
}

2.18 Format a duration in milliseconds into a humanreadable


formatTag(s): Date and Time
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0585.html
Given a time in ms, this HowTo will output the long form "<w> days, <x> hours, <y> minutes and (z)
seconds" and the short form "<dd:>hh:mm:ss".
public class TimeUtils {
public final static long ONE_SECOND = 1000;
public final static long SECONDS = 60;
public final static long ONE_MINUTE = ONE_SECOND * 60;
public final static long MINUTES = 60;
public final static long ONE_HOUR = ONE_MINUTE * 60;
public final static long HOURS = 24;

2.17 Calculate the ageTag(s): Date and Time

public final static long ONE_DAY = ONE_HOUR * 24;


private TimeUtils() {
}
/**
* converts time (in milliseconds) to humanreadable format
* "<w> days, <x> hours, <y> minutes and (z) seconds"
*/
public static String millisToLongDHMS(long duration) {
StringBuffer res = new StringBuffer();
long temp = 0;
if (duration >= ONE_SECOND) {
temp = duration / ONE_DAY;
if (temp > 0) {
duration = temp * ONE_DAY;
res.append(temp).append(" day").append(temp > 1 ? "s" : "")
.append(duration >= ONE_MINUTE ? ", " : "");
}
temp = duration / ONE_HOUR;
if (temp > 0) {
duration = temp * ONE_HOUR;
res.append(temp).append(" hour").append(temp > 1 ? "s" : "")
.append(duration >= ONE_MINUTE ? ", " : "");
}
temp = duration / ONE_MINUTE;
if (temp > 0) {
duration = temp * ONE_MINUTE;
res.append(temp).append(" minute").append(temp > 1 ? "s" : "");
}
if (!res.toString().equals("") &duration >= ONE_SECOND) {
res.append(" and ");
}
temp = duration / ONE_SECOND;
if (temp > 0) {
res.append(temp).append(" second").append(temp > 1 ? "s" : "");
}
return res.toString();
} else {
return "0 second";
}
}
/**
* converts time (in milliseconds) to humanreadable format
* "<dd:>hh:mm:ss"
*/
public static String millisToShortDHMS(long duration) {
String res = "";
duration /= ONE_SECOND;
int seconds = (int) (duration % SECONDS);
duration /= SECONDS;
int minutes = (int) (duration % MINUTES);
duration /= MINUTES;
int hours = (int) (duration % HOURS);
int days = (int) (duration / HOURS);
if (days == 0) {
res = String.format("%02d:%02d:%02d", hours, minutes, seconds);
} else {

2.17 Calculate the ageTag(s): Date and Time

res = String.format("%dd%02d:%02d:%02d", days, hours, minutes, seconds);


}
return res;
}
public static void main(String args[]) {
System.out.println(millisToLongDHMS(123));
System.out.println(millisToLongDHMS((5 * ONE_SECOND) + 123));
System.out.println(millisToLongDHMS(ONE_DAY + ONE_HOUR));
System.out.println(millisToLongDHMS(ONE_DAY + 2 * ONE_SECOND));
System.out.println(millisToLongDHMS(ONE_DAY + ONE_HOUR + (2 * ONE_MINUTE)));
System.out.println(millisToLongDHMS((4 * ONE_DAY) + (3 * ONE_HOUR)
+ (2 * ONE_MINUTE) + ONE_SECOND));
System.out.println(millisToLongDHMS((5 * ONE_DAY) + (4 * ONE_HOUR)
+ ONE_MINUTE + (23 * ONE_SECOND) + 123));
System.out.println(millisToLongDHMS(42 * ONE_DAY));
/*
output :
0 second
5 seconds
1 day, 1 hour
1 day and 2 seconds
1 day, 1 hour, 2 minutes
4 days, 3 hours, 2 minutes and 1 second
5 days, 4 hours, 1 minute and 23 seconds
42 days
*/
System.out.println(millisToShortDHMS(123));
System.out.println(millisToShortDHMS((5 * ONE_SECOND) + 123));
System.out.println(millisToShortDHMS(ONE_DAY + ONE_HOUR));
System.out.println(millisToShortDHMS(ONE_DAY + 2 * ONE_SECOND));
System.out
.println(millisToShortDHMS(ONE_DAY + ONE_HOUR + (2 * ONE_MINUTE)));
System.out.println(millisToShortDHMS((4 * ONE_DAY) + (3 * ONE_HOUR)
+ (2 * ONE_MINUTE) + ONE_SECOND));
System.out.println(millisToShortDHMS((5 * ONE_DAY) + (4 * ONE_HOUR)
+ ONE_MINUTE + (23 * ONE_SECOND) + 123));
System.out.println(millisToShortDHMS(42 * ONE_DAY));
/*
output :
00:00:00
00:00:05
1d01:00:00
1d00:00:02
1d01:02:00
4d03:02:01
5d04:01:23
42d00:00:00
*/
}
}

Using java.util.concurrent.TimeUnit
import java.util.concurrent.TimeUnit;
...
/**
* converts time (in milliseconds) to humanreadable format
* "<dd:>hh:mm:ss"
*/

2.17 Calculate the ageTag(s): Date and Time

public static String millisToShortDHMS(long duration) {


String res = "";
long days = TimeUnit.MILLISECONDS.toDays(duration);
long hours = TimeUnit.MILLISECONDS.toHours(duration)
TimeUnit.DAYS.toHours(TimeUnit.MILLISECONDS.toDays(duration));
long minutes = TimeUnit.MILLISECONDS.toMinutes(duration)
TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(duration));
long seconds = TimeUnit.MILLISECONDS.toSeconds(duration)
TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(duration));
if (days == 0) {
res = String.format("%02d:%02d:%02d", hours, minutes, seconds);
}
else {
res = String.format("%dd%02d:%02d:%02d", days, hours, minutes, seconds);
}
return res;
}

2.19 Get the atomic timeTag(s): Date and Time


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0589.html
We connect to a publicly accessible time server on the internet and parse the result.
List of available time servers : http://tf.nist.gov/service/timeservers.html
NOTE : All users should ensure that their software NEVER queries a server more frequently than
once every 4 seconds. Systems that exceed this rate will be refused service. In extreme cases,
systems that exceed this limit may be considered as attempting a denialofservice attack.
import
import
import
import

java.io.*;
java.text.*;
java.util.*;
java.net.*;

public final class DateUtils {


// NIST, Boulder, Colorado (timea.timefreq.bldrdoc.gov)
public static final String ATOMICTIME_SERVER="http://132.163.4.101:13";
// NIST, Gaithersburg, Maryland (timea.nist.gov)
// public static final String ATOMICTIME_SERVER="http://129.6.15.28:13";
public final static GregorianCalendar getAtomicTime() throws IOException{
BufferedReader in = null;
try {
URLConnection conn = new URL(ATOMICTIME_SERVER).openConnection();
in = new BufferedReader
(new InputStreamReader(conn.getInputStream()));
String atomicTime;
while (true) {
if ( (atomicTime = in.readLine()).indexOf("*") > 1) {
break;

2.19 Get the atomic timeTag(s): Date and Time

}
}
System.out.println("DEBUG : " + atomicTime);
String[] fields = atomicTime.split(" ");
GregorianCalendar calendar = new GregorianCalendar();
String[] date = fields[1].split("");
calendar.set(Calendar.YEAR, 2000 + Integer.parseInt(date[0]));
calendar.set(Calendar.MONTH, Integer.parseInt(date[1])1);
calendar.set(Calendar.DATE, Integer.parseInt(date[2]));
// deals with the timezone and the daylightsavingtime
TimeZone tz = TimeZone.getDefault();
int gmt = (tz.getRawOffset() + tz.getDSTSavings()) / 3600000;
System.out.println("DEBUG : " + gmt);
String[] time = fields[2].split(":");
calendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(time[0]) + gmt);
calendar.set(Calendar.MINUTE, Integer.parseInt(time[1]));
calendar.set(Calendar.SECOND, Integer.parseInt(time[2]));
return calendar;
}
catch (IOException e){
throw e;
}
finally {
if (in != null) {
in.close();
}
}
}
public static void main(String args[]) throws IOException {
SimpleDateFormat sdf =
new SimpleDateFormat("yyyyMMdd HH:mm:ss");
System.out.println("Atomic time : " +
sdf.format(DateUtils.getAtomicTime().getTime()));
}
/*
ref : http://www.bldrdoc.gov/doctour/atomic_clock.html
49825 950418 22:24:11 50 0 0 50.0 UTC(NIST) *
|
These are the last +
five digits of the
Modified Julian Date

|
|
|
|
|

|
|
|
|
|

|
|
|
|
|

|
|
|
|
|

|
|
|
|
|

|
|
|
|
|

|
|
|
|
|

|
|
|
|
|

Year, Month and Day


// thanks to TrueJavaProgrammer for the idea!

It's not possible to set your local computer clock in pure Java.
You need to use an external utility provided by the OS or call a JNI routine, see this HowTo.

2.19 Get the atomic timeTag(s): Date and Time

2.20 Get a date intervalTag(s): Date and Time


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0611.html
This HowTo computes a date interval based on the current date or given reference date. The
returned interval can be the previous week ou the previous month relative to the given reference
date.
import java.text.*;
import java.util.*;
public class DateUtils {
public enum IntervalType {
private DateUtils() {

Month, Week

public static Calendar[] getDateIntervals(IntervalType type, Calendar reference) {


if (reference == null) {
reference = Calendar.getInstance();
}
Calendar startDate = (Calendar)reference.clone();
Calendar endDate = (Calendar)reference.clone();
if (type == IntervalType.Month) {
// first date of the month
startDate.set(Calendar.DATE, 1);
// previous month
startDate.add(Calendar.MONTH, 1);
// first date of the month
endDate.set(Calendar.DATE, 1);
// previous month, last date
endDate.add(Calendar.DATE, 1);
}
else {
// previous week by convention (monday ... sunday)
// you will have to adjust this a bit if you want
// sunday to be considered as the first day of the week.
//
start date : decrement until first sunday then
//
down to monday
int dayOfWeek = startDate.get(Calendar.DAY_OF_WEEK);
while (dayOfWeek != Calendar.SUNDAY) {
startDate.add(Calendar.DATE, 1);
dayOfWeek = startDate.get(Calendar.DAY_OF_WEEK);
}
while (dayOfWeek != Calendar.MONDAY) {
startDate.add(Calendar.DATE, 1);
dayOfWeek = startDate.get(Calendar.DAY_OF_WEEK);
}
// end date , decrement until the first sunday
dayOfWeek = endDate.get(Calendar.DAY_OF_WEEK);
while (dayOfWeek != Calendar.SUNDAY) {
endDate.add(Calendar.DATE, 1);
dayOfWeek = endDate.get(Calendar.DAY_OF_WEEK);
}

2.20 Get a date intervalTag(s): Date and Time

}
return new Calendar[] { startDate, endDate };
}
public static void main(String[] args) {
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
System.out.println("** previous month (relative today)");
Calendar [] results = DateUtils.getDateIntervals(IntervalType.Month, null);
System.out.println(sdf.format(results[0].getTime()));
System.out.println(sdf.format(results[1].getTime()));
System.out.println("** previous week (relative today)");
results = DateUtils.getDateIntervals(IntervalType.Week, null);
System.out.println(sdf.format(results[0].getTime()));
System.out.println(sdf.format(results[1].getTime()));
System.out.println("** previous month (relative jan 1, 2007)");
results = DateUtils.getDateIntervals(IntervalType.Month,
new GregorianCalendar(2007, 00, 1));
System.out.println(sdf.format(results[0].getTime()));
System.out.println(sdf.format(results[1].getTime()));
System.out.println("** previous week (relative jan 1, 2007)");
results = DateUtils.getDateIntervals(IntervalType.Week,
new GregorianCalendar(2007, 00, 1));
System.out.println(sdf.format(results[0].getTime()));
System.out.println(sdf.format(results[1].getTime()));
}
catch (Exception e) {
e.printStackTrace();
}
}
/*
output :
** previous
20080601
20080630
** previous
20080630
20080706
** previous
20061201
20061231
** previous
20061225
20061231

month (relative today)

week (relative today)

month (relative jan 1, 2007)

week (relative jan 1, 2007)

*/
}

2.20 Get a date intervalTag(s): Date and Time

2.21 Determine if an hour is between an intervalTag(s): Date and


Time
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0624.html
import java.util.Calendar;
import java.text.SimpleDateFormat;
public class DateUtils {
// format 24hre ex. 12:12 , 17:15
private static String HOUR_FORMAT = "HH:mm";
private DateUtils() {

public static String getCurrentHour() {


Calendar cal = Calendar.getInstance();
SimpleDateFormat sdfHour = new SimpleDateFormat(HOUR_FORMAT);
String hour = sdfHour.format(cal.getTime());
return hour;
}
/**
* @param target hour to check
* @param start
interval start
* @param end
interval end
* @return true
true if the given hour is between
*/
public static boolean isHourInInterval(String target, String start, String end) {
return ((target.compareTo(start) >= 0)
&(target.compareTo(end) <= 0));
}
/**
* @param start
interval start
* @param end
interval end
* @return true
true if the current hour is between
*/
public static boolean isNowInInterval(String start, String end) {
return DateUtils.isHourInInterval
(DateUtils.getCurrentHour(), start, end);
}
//
TEST
public static void main (String[] args) {
String now = DateUtils.getCurrentHour();
String start = "14:00";
String end
= "14:26";
System. out.println(now + " between " + start + "" + end + "?");
System. out.println(DateUtils.isHourInInterval(now,start,end));
/*
* output example :
*
21:01 between 14:0014:26?
*
false
*
*/
}
}

2.21 Determine if an hour is between an intervalTag(s): Date and Time

2.22 Set the computer clockTag(s): Date and Time JNI


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0285.html
Define the following prototype in the header file
JNIEXPORT void JNICALL Java_JavaHowTo_setSystemTime
(JNIEnv *, jobject, jshort, jshort);

the JNI function


JNIEXPORT void JNICALL Java_JavaHowTo_setSystemTime
(JNIEnv *env, jobject obj, jshort hour, jshort minutes) {
SYSTEMTIME st;
GetLocalTime(
st.wHour = hour;
st.wMinute = minutes;
SetLocalTime(
}

The Java JNI wrapper would be


class JavaHowTo {
public native void setSystemTime( short hour, short minutes);
static {
System.loadLibrary("javahowto");
}
}

And finally, to use it


public class JNIJavaHowTo {
public static void main(String[] args) {
short hour = 10;
short minutes = 21;
// this example will set the system at 10h21 using the Windows API
// SetLocalTime.
JavaHowTo jht = new JavaHowTo();
// set the time at 10h21
jht.setSystemTime(hour, minutes);
}
}

2.22 Set the computer clockTag(s): Date and Time JNI

2.23 Use System time to generate unique IDTag(s): Date and


Time Date and Time Varia
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0385.html
Since the granulaty of a PC can be as high as 55ms (down to 10ms), you can't use the System time
to generate a unique ID because of the risk of getting duplicated IDs. This can be solved by using
the following technique to make sure that the number returned is unique (in a single JVM).
public class UniqueID {
static long current= System.currentTimeMillis();
static public synchronized long get(){
return current++;
}
}

See also this HowTo

2.24 Get the month (or day) name (localized)Tag(s): Date and
Time Internationalization
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0650.html
import java.text.DateFormatSymbols;
import java.util.Locale;
public class DateUtils {
private DateUtils() { }
public static String getMonthName(int month) {
return getMonthName(month, Locale.getDefault());
}
public static String getMonthName(int month, Locale locale) {
DateFormatSymbols symbols = new DateFormatSymbols(locale);
String[] monthNames = symbols.getMonths();
return monthNames[month 1];
}

public static String getDayName(int day, Locale locale) {


DateFormatSymbols symbols = new DateFormatSymbols(locale);
String[] dayNames = symbols.getWeekdays();
return dayNames[day];
}

2.23 Use System time to generate unique IDTag(s): Date and Time Date and Time Varia

public static void main(String[] args) {


System.out.println(DateUtils.getMonthName(1));
System.out.println(DateUtils.getMonthName(1, new Locale("it")));
System.out.println(DateUtils.getDayName(java.util.Calendar.SUNDAY, Locale.getDefault()));
/*
* output :
*
january
*
gennaio
*
sunday
*/
}
}

2.25 Detect a leap yearTag(s): Date and Time


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0654.html
The algorithm to determine is a given year is leap or not (>365 days) is :
if year modulo 400 is 0 then
leap
else if year modulo 100 is 0 then
no_leap
else if year modulo 4 is 0 then
leap
else
no_leap

Three techniques to check if a year is leap or not :


import java.util.Calendar;
import java.util.GregorianCalendar;

public class DateUtils {


private DateUtils() { }
// using GregorianCalendar
public static boolean isLeap0(int year) {
GregorianCalendar cal = new GregorianCalendar();
cal.set(Calendar.YEAR, year);
return cal.isLeapYear(cal.get(Calendar.YEAR));
}
// using a Calendar
public static boolean isLeap1(int year) {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, year);

2.25 Detect a leap yearTag(s): Date and Time

return cal.getActualMaximum(Calendar.DAY_OF_YEAR) > 365;


}
// directly, maybe faster...
public static boolean isLeap2(int year) {
return ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);
}

public static void main(String[]


System.out.println("1900 : " +
System.out.println("1996 : " +
System.out.println("2000 : " +
System.out.println("2010 : " +
System.out.println("");
System.out.println("1900 : " +
System.out.println("1996 : " +
System.out.println("2000 : " +
System.out.println("2010 : " +
System.out.println("");
System.out.println("1900 : " +
System.out.println("1998 : " +
System.out.println("2000 : " +
System.out.println("2010 : " +
}

args) {
DateUtils.isLeap0(1900));
DateUtils.isLeap0(1996));
DateUtils.isLeap0(2000));
DateUtils.isLeap0(2010));
DateUtils.isLeap1(1900));
DateUtils.isLeap1(1996));
DateUtils.isLeap1(2000));
DateUtils.isLeap1(2010));
DateUtils.isLeap2(1900));
DateUtils.isLeap2(1996));
DateUtils.isLeap2(2000));
DateUtils.isLeap2(2010));

Written and compiled Ral Gagnon 2007 [email protected]


http://www.rgagnon.com

2.25 Detect a leap yearTag(s): Date and Time

3 AWT
3.1 javaawt

3.2 Use The CardLayout managerTag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0237.html
A CardLayout object is a layout manager for a container. It treats each component in the container
as a card. Only one card is visible at a time, and the container acts as a stack of cards.
In this HowTo, when a button is clicked the corresponding card is made visible.

First we define the cards (which are based on a Panel)


import
import
import
import

java.awt.Color;
java.awt.Dimension;
java.awt.LayoutManager;
java.awt.Panel;

class MyPanel extends Panel{


private static final long serialVersionUID = 1L;
int w;
int h;
MyPanel(Color co, LayoutManager la, int width, int height){
super();
w = width;
h = height;
setBackground(co);
setLayout(la);
}
public Dimension getMinimumSize() {
return new Dimension(w,h);
}
public Dimension getPreferredSize() {
return new Dimension(w,h);
}
}

and then
import
import
import
import
import
import

3 AWT

java.applet.Applet;
java.awt.Button;
java.awt.CardLayout;
java.awt.Choice;
java.awt.Color;
java.awt.Component;

import
import
import
import
import

java.awt.FlowLayout;
java.awt.Panel;
java.awt.TextField;
java.awt.event.ActionEvent;
java.awt.event.ActionListener;

public class CardLayoutDemo extends Applet


implements ActionListener{
private static final long serialVersionUID = 1L;
Panel p1,p2,p3,p0;
Choice c1,c2;
Button b1,b2,b3, b4;
TextField t1, t2;
public void init() {
// The first Card
p1 = new MyPanel(Color.red,
new FlowLayout(),
100,100) ;
Choice c1 = new Choice();
c1.addItem("Option 1");
c1.addItem("Option 2");
p1.add(c1);
// The second Card
p2 = new MyPanel(Color.blue,
new FlowLayout(),
100, 100);
c2 = new Choice();
c2.addItem("Option A");
c2.addItem("Option B");
c2.addItem("Option C");
p2.add(c2);
// the third Card
p3 = new MyPanel(Color.black,
new FlowLayout(),
100, 100);
t1 = new TextField(8);
t1.setBackground(Color.white);
p3.add(t1);
// Main card (receive the other)
p0 = new MyPanel(Color.white,
new CardLayout(0,0),
100,100);
setLayout(new FlowLayout());
add(p0);
// Add cards
p0.add("First card", p1);
p0.add("2nd card", p2);
p0.add("3rd card", p3);

add(b1 = new Button("card 1"));


add(b2 = new Button("card 2"));
add(b3 = new Button("card 3"));
add(b4 = new Button("Which card is selected ?"));
add(t2 = new TextField(2));
b1.addActionListener(this);
b2.addActionListener(this);

3 AWT

b3.addActionListener(this);
b4.addActionListener(this);
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() == b1) {
//Show the first
((CardLayout)p0.getLayout()).show(p0, "First card");
}
else if (e.getSource() == b2) {
//Show the second
((CardLayout)p0.getLayout()).show(p0, "2nd card");
}
else if (e.getSource() == b3) {
//Show the third
((CardLayout)p0.getLayout()).show(p0, "3rd card");
}
else if (e.getSource() == b4) {
// get the current card
Component c[] = p0.getComponents();
int i = 0;
int j = c.length;
while (i < j) {
if (c[i].isVisible()) {
t2.setText("" + (i+1));
break;
}
else
i ++;
}
}
}
}
<HTML>
<TABLE><TR><TD>
<APPLET CODE=CardLayoutDemo.class WIDTH=300 HEIGHT=300>
</APPLET>
/HMTL

Try it here.

3.3 Detect which card is visible with a CardLayoutTag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0423.html
Component getComponentShowing(Container c) {
Component[] comps = c.getComponents();
int i = 0;
while(i < comps.length &!comps[i].isVisible())
++i;
return (i == comps.length) ? null : comps[i];
}

3.3 Detect which card is visible with a CardLayoutTag(s): AWT

3.4 Use PopupsTag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0238.html
[JDK1.1]
import java.awt.*;
import java.awt.event.*;
import java.util.Hashtable;
public class PopupTest extends Frame
implements ActionListener, MouseListener {
Hashtable popupTable = new Hashtable();
public PopupTest() {
/*
** regular menu
*/
Menu m = new Menu("file");
MenuItem item = new MenuItem("file1");
item.addActionListener(this);
m.add(item);
item = new MenuItem("file2");
m.add(item);
MenuBar mb = new MenuBar();
mb.add(m);
setMenuBar(mb);
setSize(100, 100);
setLayout(new BorderLayout());
/*
** label with a popup
*/
Label l = new Label("label");
addPopup(l, "label");
add(l, "North");
/*
** panel with popup
*/
Panel p = new Panel();
p.setBackground(new Color(0).red);
addPopup(p, "Panel");
add(p, "Center");
/*
** button with popup
*/
Button b = new Button("button");
addPopup(b, "button");

3.4 Use PopupsTag(s): AWT

add(b, "South");
addWindowListener
(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
);
setVisible(true);
}
public void actionPerformed(ActionEvent e) {
/*
** handle actions related to popup
*/
System.out.println("actionPerformed, event=" + e );
System.out.println(" command=" + e.getActionCommand());
System.out.println(" param=" + e.paramString());
System.out.println(" source=" + e.getSource());
}

public void mouseClicked (MouseEvent e) { }


public void mouseEntered (MouseEvent e) { }
public void mouseExited (MouseEvent e) { }
public void mousePressed (MouseEvent e) {
mouseAction(e);
}
public void mouseReleased (MouseEvent e) {
mouseAction(e);
}
void mouseAction (MouseEvent e) {
/*
** determine if we have to show a Popup
*/
Component c = e.getComponent();
if (e.isPopupTrigger()) {
PopupMenu pm = getHash(c);
pm.show(c, c.getSize().width/2, c.getSize().height/2);
}
}
/*
**
*/

initialize a Popup for a particular Component

void addPopup(Component c, String name) {


PopupMenu pm = new PopupMenu();
MenuItem mi1 = new MenuItem(name + "1");
pm.add(mi1);
mi1.addActionListener(this);
MenuItem mi2 = new MenuItem(name + "2");
pm.add(mi2);
mi2.addActionListener(this);
setHash(c, pm);
c.add(pm);
c.addMouseListener(this);

3.4 Use PopupsTag(s): AWT

}
void setHash(Component c, PopupMenu p) {
/*
** associate a Component with a particular Popup
*/
popupTable.put(c, p);
}
PopupMenu getHash(Component c) {
/*
** return a Popup associated with a particular Component
*/
return (PopupMenu)(popupTable.get(c));
}
public static void main (String argv[]) {
new PopupTest();
}
}

3.5 Use a File DialogTag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0247.html
On the Win platform, the setFilenameFilter method don't work. We must use the setFile method
instead to set a filter.
import java.awt.*;
public class UseFileDialog {
public String loadFile
(Frame f, String title, String defDir, String fileType) {
FileDialog fd = new FileDialog(f, title, FileDialog.LOAD);
fd.setFile(fileType);
fd.setDirectory(defDir);
fd.setLocation(50, 50);
fd.show();
return fd.getFile();
}
public String saveFile
(Frame f, String title, String defDir, String fileType) {
FileDialog fd = new FileDialog(f, title,
FileDialog.SAVE);
fd.setFile(fileType);
fd.setDirectory(defDir);
fd.setLocation(50, 50);
fd.show();
return fd.getFile();
}
public static void main(String s[]) {
UseFileDialog ufd = new UseFileDialog();

3.5 Use a File DialogTag(s): AWT

System.out.println
("Loading : "
+ ufd.loadFile(new Frame(), "Open...", ".\\", "*.java"));
System.out.println
("Saving : "
+ ufd.saveFile(new Frame(), "Save...", ".\\", "*.java"));
System.exit(0);
}
}

to work with the full pathname, replace


return fd.getFile();

by
return fd.getDirectory() +
System.getProperty("file.separator") + fd.getFile();

On other plateforms, setFilenameFilter may do the job, then you simply do :


fd.setFilenameFilter(new FilenameFilter(){
public boolean accept(File dir, String name){
return (name.endsWith(".jpg") || name.endsWith(".gif"));
}
});

3.6 Use TrueType fontTag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0270.html
[JDK1.4]
The names of the most common fonts supported by Java are TimesRoman, Courier, and Helvetica.
To add fonts, simply edit the properties.font file located in the lib of your JDK installation.
On a Windows system, to check what are the fonts available, go in the Font applet in the
Parameters folder. Choose a font and doubleclick on it. Check the name of the font. For example,
on my system, I have a font called Kaufmann, the real name is "Kaufmann BT". To be able to use
this font, I add the following line in the properties.font file in the section called # for backword
compatibility.
Kaufmann.0=Kaufmann BT, ANSI_CHARSET

To use it, in a java program :


setFont(new Font("Kaufmann", Font.BOLD, 20));
NOTE: The three common fonts are the only ones guaranteed to be supported across all systems. To be able to use other fonts, you must
modify the properties.font file and these new fonts are not crossplateform compatibles.

3.6 Use TrueType fontTag(s): AWT

[JDK1.5]
@todo

3.7 Display available fontsTag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0278.html
[JDK1.1]
import java.awt.*;
public class FontList {
public static void main(String args[]) {
String[] fontNames = Toolkit.getDefaultToolkit().getFontList();
int j = fontNames.length;
for (int i = 0 ; i < j ;i++ ) {
System.out.println(fontNames[i]);
}
}
}

[JDK1.2]
import java.awt.*;
public class FontList {
public static void main(String args[]) {
GraphicsEnvironment ge =
GraphicsEnvironment.getLocalGraphicsEnvironment();
String fontNames[] = ge.getAvailableFontFamilyNames();
int j = fontNames.length;
for (int i = 0 ; i < j ;i++ ) {
System.out.println(fontNames[i]);
}
}
}

3.8 Font with 3D effectTag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0312.html
import java.awt.*;
import java.applet.*;

3.7 Display available fontsTag(s): AWT

public class SimpleApplet extends Applet {


public void init() {
setBackground(new Color(255,255,255)); // white
}
public void paint(Graphics g) {
g.setFont(new Font("Helvetica", Font.PLAIN, 42));
g.setColor(new Color(0,0,0)); // black
g.drawString("Real's HowTo", 100, 100);
g.drawString("Real's HowTo", 101, 101);
g.setColor(getBackground());
g.drawString("Real's HowTo", 100, 100);
g.setColor(new Color(0,0,0)); // black
g.drawString("Real's HowTo", 100, 200);
g.setColor(new Color(0,0,255)); // blue
g.drawString("Real's HowTo", 102, 202);
g.setColor(getBackground());
g.drawString("Real's HowTo", 101, 201);
}
}
<HTML>
<TABLE><TR><TD>
<APPLET CODE=SimpleApplet.class WIDTH=410 HEIGHT=500>
</APPLET>
</HMTL>
try it here

3.9 Use the System ClipboardTag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0382.html
import java.awt.datatransfer.*;
import java.awt.*;
public class Java2Clipboard implements ClipboardOwner {
public static void main(String[] args) throws Exception {
Java2Clipboard jc = new Java2Clipboard();
jc.toClipboard();
Frame f = new Frame
("Open a text editor and paste the message from Java");
f.setSize(600,10);
f.show();
}
public void toClipboard() {
SecurityManager sm = System.getSecurityManager();
if (sm != null) {
try {

3.9 Use the System ClipboardTag(s): AWT

sm.checkSystemClipboardAccess();
}
catch (Exception e) {e.printStackTrace();}
}
Toolkit tk = Toolkit.getDefaultToolkit();
StringSelection st =
new StringSelection("Hello world from Java");
Clipboard cp = tk.getSystemClipboard();
cp.setContents(st, this);
}
public void lostOwnership(Clipboard clip, Transferable tr) {
System.out.println("Lost Clipboard Ownership?!?");
}
}
NOTE: You can only use text (no graphic) with this functionality provided by the current JDK (1.4).

3.10 Maximize a FrameTag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0222.html
// place this in the Frame constructor, after the show()
this.move(0,0);
resize(Toolkit.GetDefaultToolkit().getScreenSize());

JDK1.2 offers a new method, setState(), to minimize or maximize a Frame.


frame.setState(Frame.ICONIFIED);

// minimize the frame

Latest JDK provides more ways to do that.


JDK1.4
import java.awt.*;
...
GraphicsDevice device;
Frame frame = new Frame();
device =
GraphicsEnvironment.
getLocalGraphicsEnvironment().
getDefaultScreenDevice();
if ( device.isFullScreenSupported() ) {
device.setFullScreenWindow(frame);
}
else {
System.err.println("Full screen not supported");
}

The "fullscreen" Frame is in exclusive mode. In this mode you can change the resolution

3.10 Maximize a FrameTag(s): AWT

import java.awt.*;
class ScreenRes {
public static void main(String args[]) {
new ScreenRes().doit();
}
public void doit() {
Frame frame = new Frame();
GraphicsDevice device;
device =
GraphicsEnvironment.
getLocalGraphicsEnvironment().
getDefaultScreenDevice();
if ( device.isFullScreenSupported() ) {
device.setFullScreenWindow(frame);
if (device.isDisplayChangeSupported()) {
device.setDisplayMode(
new DisplayMode( 1024, 768,
8, // bitDepth 8 bits 256 colors
DisplayMode.REFRESH_RATE_UNKNOWN ));
}
else {
System.err.println("Change display mode not supported");
}
}
else {
System.err.println("Full screen not supported");
}
}
}

When the JFrame is destroyed, the original resolution is restored.


To remove (manually) the "exclusive mode" on the JFrame :
device.setFullScreenWindow(null);

SWING jdk1.3
JFrame frame = new JFrame();
frame.setExtendedState(Frame.MAXIMIZED_BOTH);
// can be
// frame.setExtendedState(Frame.MAXIMIZED_HORIZ);
// frame.setExtendedState(Frame.MAXIMIZED_VERT);

3.11 Center a Frame/DialogTag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0223.html
// centers the dialog within the screen [1.1]

3.11 Center a Frame/DialogTag(s): AWT

// (put that in the Frame/Dialog class)


public void centerScreen() {
Dimension dim = getToolkit().getScreenSize();
Rectangle abounds = getBounds();
setLocation((dim.width abounds.width) / 2,
(dim.height abounds.height) / 2);
super.setVsible(true);
requestFocus();
}
// centers the dialog within the parent container [1.1]
// (put that in the Dialog class)
public void centerParent () {
int x;
int y;
// Find out our parent
Container myParent = getParent();
Point topLeft = myParent.getLocationOnScreen();
Dimension parentSize = myParent.getSize();
Dimension mySize = getSize();
if (parentSize.width > mySize.width)
x = ((parentSize.width mySize.width)/2) + topLeft.x;
else
x = topLeft.x;
if (parentSize.height > mySize.height)
y = ((parentSize.height mySize.height)/2) + topLeft.y;
else
y = topLeft.y;
setLocation (x, y);
super.setVsible(true);
requestFocus();
}

New with JDK1.4, JDialog has method to position a JDialog relative to a parent. For a JWindow or a
JFrame with no parent, then
f.setSize(100,100);
f.setLocationRelativeTo(NULL);

3.12 Close a FrameTag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0225.html
[JDK1.0.2]
public boolean handleEvent(Event evt) {
if (evt.id == Event.WINDOW_DESTROY) {

3.12 Close a FrameTag(s): AWT

System.exit(0);
return true;
}
return super.handleEvent(evt);
}

[JDK1.1 Method 1]
public aFrame extends Frame implements WindowListener {
public aFrame(){
addWindowListener( this );
}
public void windowActivated(WindowEvent e){}
public void windowDeactivated(WindowEvent e){}
public void windowOpened(WindowEvent e){}
public void windowClosing(WindowEvent e){ System.exit(0); }
public void windowClosed(WindowEvent e){}
public void windowIconified(WindowEvent e) {}
public void windowDeiconified(WindowEvent e) {}
}

[JDK1.1 Method 2]
public class aFrame extends Frame {
public aFrame(){
addWindowListener( new Terminate() );
}
}
class Terminate extends WindowAdapter{
public void windowClosing(WindowEvent e){
System.exit(0);
}
}

[JDK1.1 Method 3]
public class aFrame extends Frame {
public aFrame() {
addWindowListener
(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
);
}
}

For a Dialog or a Window, a System.exit(0) may not be appropriate, call the dispose() method
instead.
class SimplePopUp extends Dialog
{
SimplePopUp() {
super(new Frame(), "simple popup");
this.addWindowListener
(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
e.getWindow().dispose();
}
}

3.12 Close a FrameTag(s): AWT

);
}

3.13 Call events on a Frame from a PanelTag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0268.html
A component on a Panel can easily call events on the parent Frame. This way, we can put all the
logic in one place. In this example, a Frame contains 1 button and a Panel with 2 buttons on it. The
first button on the Panel will generate an event for the button on the Frame while the second panel
button will trigger a request to close the Frame and the application.
[TestEventPanel.java]
import java.awt.*;
import java.awt.event.*;
public class TestEventPanel extends Panel {
Button b1,b2;
TestEventPanel(){
super();
setLayout(new FlowLayout());
setBackground(new Color(0).black);
b1 = new Button("call event on the frame");
add(b1);
b2 = new Button("close the parent frame");
add(b2);
}
}

The Frame after adding the Panel, will act as an ActionListener for events for the 2 Panel buttons.
[TestEventFrame.java]
import java.awt.*;
import java.awt.event.*;
public class TestEventFrame extends Frame implements
ActionListener, WindowListener {
TestEventPanel p1;
Button b1;
TestEventFrame(String title){
super(title);
setLayout(new FlowLayout());
p1 = new TestEventPanel();
b1 = new Button("A dummy button");
add(b1);

3.13 Call events on a Frame from a PanelTag(s): AWT

// the Panel with 2 buttons on it


add(p1);
createFrame();
// add the actionlistener
b1.addActionListener(this);
p1.b1.addActionListener(this);
p1.b2.addActionListener(this);
addWindowListener(this);
}
void createFrame() {
Dimension d = getToolkit().getScreenSize();
setLocation(d.width/4,d.height/3);
setSize(400,100);
setVisible(true);
}
public void actionPerformed(ActionEvent ae){
if (ae.getSource()==p1.b1) {
System.out.println(ae.getActionCommand());
ActionEvent new_ae =
new ActionEvent (b1,
ActionEvent.ACTION_PERFORMED,
"Panel b1 is calling the dummy button");
b1.dispatchEvent (new_ae);
}
if (ae.getSource()==b1) {
System.out.println("dummy receive :" + ae.getActionCommand());
}
if (ae.getSource()==p1.b2) {
System.out.println(ae.getActionCommand());
processEvent(new WindowEvent(this, WindowEvent.WINDOW_CLOSING));
}
}
public void windowClosing(WindowEvent e) {
this.dispose();
System.exit(0);
}
public void windowActivated(WindowEvent e) {
public void windowDeactivated(WindowEvent e)
public void windowDeiconified(WindowEvent e)
public void windowClosed(WindowEvent e) { }
public void windowIconified(WindowEvent e) {
public void windowOpened(WindowEvent e) { }

}
{ }
{ }
}

and finally
[Java0268.java]
import java.awt.*;
public class Java0268 extends java.applet.Applet {
TestEventFrame myTestEventFrame;
public void init() {

3.13 Call events on a Frame from a PanelTag(s): AWT

myTestEventFrame =
new TestEventFrame("TestEvent Frame");
}
}

Try it here.

3.14 Set the small topleft icon on a FrameTag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0246.html
There is a bug in JDK1.0.2 for Windows, so you are stuck with the JAVA coffee cup.
In JDK1.1, this is fixed. You have to use a GIF file (not ICO file!). The GIF dimension should be
16x16. With 1.5, you can use a PNG or JPG file.
You set the icon with :
frame.setIconImage(Toolkit.getDefaultToolkit().getImage("myIcon.gif"));

To get the image from a Jar instead, do :


frame.setIconImage
(Toolkit.getDefaultToolkit()
.getImage(getClass().
getResource("images/myIcon.gif")));

or
frame.setIconImage(
new ImageIcon(
YourApp.class.getResource("logo.png")
).getImage()
);

3.15 Prevent a Frame to be resizedTag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0252.html

3.14 Set the small topleft icon on a FrameTag(s): AWT

import java.awt.*;
import java.awt.event.*;
public class TestNoMaximize {
MyFrame theFrame;
public static void main (String args[]){
TestNoMaximize t = new TestNoMaximize();
t.theFrame = new MyFrame("A Dummy Frame");
t.theFrame.setVisible(true);
}
}
class MyFrame extends Frame {
public MyFrame(String title){
super(title);
addWindowListener
(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
);
// no minimize or maximize
this.setResizable(false);
this.setSize(200,200);
}
public void paint(Graphics g) {
g.drawString("try to resize me...", 50, 50);
}
}

There is no way to allow minimizing but not maximizing unless you trap the maximizing in the paint
method and then resize to the original size.
import java.awt.*;
import java.awt.event.*;
public class TestNoMaximize {
MyFrame theFrame;
public static void main (String args[]){
TestNoMaximize t = new TestNoMaximize();
t.theFrame = new MyFrame("A Dummy Frame");
t.theFrame.setVisible(true);
}
}
class MyFrame extends Frame {
public MyFrame(String title){
super(title);
addWindowListener
(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
);
this.setSize(200,200);
}

3.14 Set the small topleft icon on a FrameTag(s): AWT

public void paint(Graphics g) {


Dimension d = this.getSize();
if (d.getHeight() != 200 &d.getWidth() != 200)
this.setSize(200,200);
g.drawString("try to maximize me...", 50, 50);
}
}
NOTE: These Howto may not work with the Microsoft JVM. It's a feature...

3.16 Embed an image into a FrameTag(s): AWT AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0302.html
A given image is tiled as the frame background.
The result is not too good with Label...
import java.awt.*;
import java.awt.event.*;
public class ImageFrame extends Frame

private Image image;


ImageFrame() {
super("");
try {
MediaTracker mt = new MediaTracker (this);
// for Applet, change the method to retrieve the image
// and of course use your own image!
image = Toolkit.getDefaultToolkit().getImage("images/jht.gif");
mt.addImage(image, 0);
mt.waitForID(0);
}
catch (Exception e) {
e.printStackTrace();
}
setLayout(new FlowLayout());
add(new TextField(10));
add(new Button("hello"));
add(new List(20));
add(new TextArea(20,20));
// Label may not look too good ...
add(new Label("Hello"));
setSize(500, 500);
addWindowListener
(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
// change this for an Applet

3.16 Embed an image into a FrameTag(s): AWT AWT

System.out.println("Bye.");
System.exit(0);
}
}
);
}
public void update( Graphics g) {
paint(g);
}
public void paint(Graphics g) {
if(image != null) {
int x = 0, y = 0;
while(y < getSize().height) {
x = 0;
while(x< getSize().width) {
g.drawImage(image, x, y, this);
x= x + image.getWidth(null);
}
y = y + image.getHeight(null);
}
}
else {
g.clearRect(0, 0, getSize().width, getSize().height);
}
}
static public void main(String[] args) {
ImageFrame iframe = new ImageFrame();
iframe.setVisible(true);
}
}

The result :

3.16 Embed an image into a FrameTag(s): AWT AWT

3.17 Display a message boxTag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0242.html
If using Swing then look at the JOptionPane component.
With plain AWT, this simple class can be used as a Message Box.
import java.awt.*;
import java.awt.event.*;
public class MsgBox extends Dialog implements ActionListener {
private Button ok,can;
public boolean isOk = false;
/*
* @param frame
parent frame
* @param msg
message to be displayed
* @param okcan
true : ok cancel buttons, false : ok button only
*/
MsgBox(Frame frame, String msg, boolean okcan){
super(frame, "Message", true);
setLayout(new BorderLayout());
add("Center",new Label(msg));
addOKCancelPanel(okcan);
createFrame();
pack();
setVisible(true);
}
MsgBox(Frame frame, String msg){
this(frame, msg, false);
}
void addOKCancelPanel( boolean okcan ) {
Panel p = new Panel();
p.setLayout(new FlowLayout());
createOKButton( p );
if (okcan == true)
createCancelButton( p );
add("South",p);
}
void createOKButton(Panel p) {
p.add(ok = new Button("OK"));
ok.addActionListener(this);
}
void createCancelButton(Panel p) {
p.add(can = new Button("Cancel"));
can.addActionListener(this);
}

3.17 Display a message boxTag(s): AWT

void createFrame() {
Dimension d = getToolkit().getScreenSize();
setLocation(d.width/3,d.height/3);
}
public void actionPerformed(ActionEvent ae){
if(ae.getSource() == ok) {
isOk = true;
setVisible(false);
}
else if(ae.getSource() == can) {
setVisible(false);
}
}
public static void main(String args[]){
Frame f = new Frame();
f.setSize(200,200);
f.setVisible(true);
MsgBox message = new MsgBox
(f , "Hey you user, are you sure ?", true);
if (message.isOk)
System.out.println("Ok pressed");
if (!message.isOk)
System.out.println("Cancel pressed");
message.dispose();
}
}

3.18 Display a Splash screenTag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0267.html
This Splash class display a window containing a specified image while a parent Frame is doing its
initialization. When the parent is activated, the Splash window is destroyed.
[JDK1.1]
import java.awt.*;
import java.awt.event.*;
public class Splash extends Window {
private Image splashImage;
private int imgWidth, imgHeight;
private String imgName;
private static final int BORDERSIZE = 5;
private static final Color BORDERCOLOR = Color.blue;
Toolkit tk;
public Splash(Frame f, String imgName) {
super(f);

3.18 Display a Splash screenTag(s): AWT

this.imgName = imgName;
tk = Toolkit.getDefaultToolkit();
splashImage = loadSplashImage();
showSplashScreen();
f.addWindowListener(new WindowListener());
}
public Image loadSplashImage() {
MediaTracker tracker = new MediaTracker(this);
Image result;
result = tk.getImage(imgName);
tracker.addImage(result, 0);
try {
tracker.waitForAll();
}
catch (Exception e) {
e.printStackTrace();
}
imgWidth = result.getWidth(this);
imgHeight = result.getHeight(this);
return (result);
}
public void showSplashScreen() {
Dimension screenSize = tk.getScreenSize();
setBackground(BORDERCOLOR);
int w = imgWidth + (BORDERSIZE * 2);
int h = imgHeight + (BORDERSIZE * 2);
int x = (screenSize.width w) /2;
int y = (screenSize.height h) /2;
setBounds(x, y, w, h);
setVisible(true);
}
public void paint(Graphics g) {
g.drawImage(splashImage, BORDERSIZE, BORDERSIZE,
imgWidth, imgHeight, this);
}
class WindowListener extends WindowAdapter {
// was windowActivated, thanks to H.Grippa for the fix!
public void windowOpened(WindowEvent we) {
setVisible(false);
dispose();
}
}
}

The following example use this image


import java.awt.*;
import java.awt.event.*;
public class TestSplash {
MyFrame theFrame;

public static void main (String args[]){


TestSplash t = new TestSplash();
t.createMainFrame();
}
private void createMainFrame() {
theFrame = new MyFrame("A Dummy Frame");

3.18 Display a Splash screenTag(s): AWT

(jht.gif) as the splash image.

theFrame.setVisible(true);
}
}
class MyFrame extends Frame {
Splash mySplash;
public MyFrame(String title){
super(title);
addWindowListener
(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
);
mySplash = new Splash(this, "jht.gif");
// dummy delay so we can see the Splash!
for(int i = 0; i < 3000; i++) {
System.out.println(i) ;
}
setSize(200,200);
}
}

3.19 Vibrate a WindowTag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0622.html
This HowTo is based on this post : http://sdnshare.sun.com/view.jsp?id=2326
This can be useful to make a visual effect when an event is occuring.
import java.awt.*;
public class FrameUtils {
private final static int VIBRATION_LENGTH = 20;
private final static int VIBRATION_VELOCITY = 5;
private FrameUtils() { }
public static void vibrate(Frame frame) {
try {
final int originalX = frame.getLocationOnScreen().x;
final int originalY = frame.getLocationOnScreen().y;
for(int i = 0; i < VIBRATION_LENGTH; i++) {
Thread.sleep(10);
frame.setLocation(originalX, originalY + VIBRATION_VELOCITY);
Thread.sleep(10);
frame.setLocation(originalX, originalY VIBRATION_VELOCITY);
Thread.sleep(10);

3.19 Vibrate a WindowTag(s): AWT

frame.setLocation(originalX + VIBRATION_VELOCITY, originalY);


Thread.sleep(10);
frame.setLocation(originalX, originalY);
}
}
catch (Exception err) {
err.printStackTrace();
}
}
}

To use it, simply pass a Frame to the vibrate method.


FrameUtils.vibrate(myFrame);

To make it more Swingoriented, you change the method signature for a JFrame instead.
Here an example.
We display a small window. When a file is added or deleted, the window is shaking for a brief
moment and display the event. By default, the folder c:/temp is used but you can specify another
one on the command line.
First get the code to detect a file modfication in a folder (in this HowTo, you need the DirWatcher
and DirFilterWatcher classes). Plus the following classes.
import java.awt.*;
import java.awt.event.*;
public class DirWatchWindow extends Frame {
Label folder;
Label info;
public DirWatchWindow() {
setTitle("DirWatchWindow");
setSize(600, 100);
setLayout(new BorderLayout());
folder = new Label("");
info
= new Label("");
add(folder, BorderLayout.NORTH);
add(info, BorderLayout.SOUTH);
setVisible(true);
addWindowListener
(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
);
}
public void setInfo(String text) {
info.setText(text);
}
public void setFolder(String dir) {
folder.setText("Watching folder : " + dir);
}
}

3.19 Vibrate a WindowTag(s): AWT

import java.util.*;
import java.io.*;
public class DirWatchTest {
public static void main(String args[]) {
String folderToWatch = "c:/temp";
if (args.length > 0) {
folderToWatch = args[0];
}
final DirWatchWindow dww = new DirWatchWindow();
dww.setFolder(folderToWatch);
TimerTask task = new DirWatcher(folderToWatch, "txt" ) {
protected void onChange( File file, String action ) {
// here we code the action on a change
dww.setInfo("File : "+ file.getName() +" action: " + action);
FrameUtils.vibrate(dww);
}
};
Timer timer = new Timer();
timer.schedule( task , new Date(), 1000 );
}
}

You can download an executable JAR here


To launch the demo
java jar DirWatch.jar

to watch the default directory c:/temp or


java jar DirWatch.jar

c:/myfolder

to specify your own folder. This demo is watching for files with the extension txt only.

3.20 Limit TextField input to numeric valueTag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0226.html
[JDK1.0.2]
//
You still have to trap the InvalidNumberFormat
//
Exception when converting textfield content to numeric
//
bug fixed! 980211 thanks to JM Guerra Chapa
import java.awt.*;

3.20 Limit TextField input to numeric valueTag(s): AWT

public class app extends java.applet.Applet {


TextField textField1;
public void init() {
setLayout(new FlowLayout());
textField1 = new TextField(10);
add(textField1);
}
public boolean handleEvent(Event event) {
if (event.target==textfield1 &event.id == Event.KEY_PRESS) {
char c = (char)event.key;
if (c >= '0' &c <= '9') {
// keep digit
return super.handleEvent(event);
}
else if (Character.isISOControl(c)) {
// keep control character (like del, bksp)
return super.handleEvent(event);
}
else {
// discard Character
return true;
}
}
return super.handleEvent(event);
}
}

[JDK1.1]
thanks to Lionel Giltay

import java.awt.TextField ;
import java.awt.event.KeyAdapter ;
import java.awt.event.KeyEvent ;
public class NumericTextField extends TextField
{
public NumericTextField (String _initialStr, int _col)
{
super (_initialStr, _col) ;
this.addKeyListener(new KeyAdapter()
{
public void keyTyped (KeyEvent e)
{
char c = e.getKeyChar() ;
if (!
((c==KeyEvent.VK_BACK_SPACE) || (c==KeyEvent.VK_DELETE)
|| (c== KeyEvent.VK_ENTER)
|| (c == KeyEvent.VK_TAB)
|| (Character.isDigit(c))))
{
e.consume() ;
}
}
});
}
public NumericTextField (int _col)
{
this ("", _col) ;
}

3.20 Limit TextField input to numeric valueTag(s): AWT

3.21 Limit TextField input to a maximum lengthTag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0227.html
[JDK11]
import java.awt.*;
import java.awt.event.*;
public class TextFieldWithLimit extends TextField
implements KeyListener {
private int maxLength;
public TextFieldWithLimit
(String initialStr,int col,int maxLength) {
super(initialStr,col);
this.maxLength = maxLength;
addKeyListener(this);
}
public TextFieldWithLimit (int col,int maxLength) {
this("",col,maxLength);
}
public void keyPressed(KeyEvent e) {
char c = e.getKeyChar();
int len = getText().length();
if (len <maxLength) {
return;
}
else {
if((c==KeyEvent.VK_BACK_SPACE)||
(c==KeyEvent.VK_DELETE) ||
(c==KeyEvent.VK_ENTER)||
(c==KeyEvent.VK_TAB)||
e.isActionKey())
return;
else {
e.consume();
}
}
}
public void keyReleased(KeyEvent e) { }
public void keyTyped(KeyEvent e) { }
}

3.21 Limit TextField input to a maximum lengthTag(s): AWT

3.22 React to the ENTER key in a TextfieldTag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0253.html
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class testENTER extends Applet
implements KeyListener {
TextField t;
public void init(){
TextField t = new TextField("press ENTER");
add(t);
t.addKeyListener(this);
}
public void keyTyped(KeyEvent e) {}
public void keyReleased(KeyEvent e) {}
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
if (key == KeyEvent.VK_ENTER) {
Toolkit.getDefaultToolkit().beep();
System.out.println("ENTER pressed");
}
}
}

Or the short version using the KeyAdapter class.


import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class testENTER extends Applet{
TextField t;
public void init(){
TextField t = new TextField("press ENTER");
add(t);
t.addKeyListener
(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
if (key == KeyEvent.VK_ENTER) {
Toolkit.getDefaultToolkit().beep();
System.out.println("ENTER pressed");
}
}
}
);
}
}

3.22 React to the ENTER key in a TextfieldTag(s): AWT

3.23 Make the ENTER key act like the TAB keyTag(s): AWT
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0254.html
First create a TextField that listen to the Enter and react like a Tab key [JDK11]
import java.awt.*;
import java.awt.event.*;
public class MyTextField extends TextField {
MyTextField(int len) {
super(len);
addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent evt) {
int key = evt.getKeyCode();
if (key == KeyEvent.VK_ENTER)
transferFocus();}});
}
}

to use it, try something like this


import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class TestEnterAsTab extends Applet {
MyTextField t1, t2;
public void init(){
MyTextField t1 = new MyTextField(10);
MyTextField t2 = new MyTextField(10);
add(t1);add(t2);
}
}

3.24 Reset all textfields in one shotTag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0274.html
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class FirstApplet extends Applet implements
ActionListener {
TextField t1;
TextField t2;
TextField t3;
TextField t4onPanel;
Panel p1;

3.23 Make the ENTER key act like the TAB keyTag(s): AWT

Button b;
public void init() {
add(t1= new TextField(20));
add(t2= new TextField(20));
add(t3= new TextField(20));
t4onPanel = new TextField(20);
p1 = new Panel();
p1.setBackground(new Color(0).yellow);
p1.add(t4onPanel);
add(p1);
add(b = new Button("reset TextFields"));
b.addActionListener(this);
}
public void actionPerformed(ActionEvent ae) {
if (ae.getSource() == b)
resetTextFields(this);
}
public static void resetTextFields(Container c) {
Component [] components = c.getComponents();
for (int i = 0; i <components.length; i++ ) {
if (components[i] instanceof Container)
resetTextFields((Container) components[i]) ;
else if (components[i] instanceof TextField)
((TextField) components[i]).setText("") ;
}
}
}
<HTML><HEAD></HEAD><BODY>
<APPLET CODE="FirstApplet.class"
NAME="myApplet"
HEIGHT=200 WIDTH=200>
</APPLET></BODY></HTML>

3.25 Limit a TextField to UppercaseTag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0279.html
[JDK1.1]
import java.awt.*;
import java.awt.event.*;
public class UpperTF extends Frame {
public static void main(String argv[]) {
new UpperTF().setVisible(true);
}
public UpperTF() {
setLayout(new FlowLayout());
TextField tf = new TextField(10);

3.25 Limit a TextField to UppercaseTag(s): AWT

add(tf);
tf.addKeyListener(
new KeyAdapter() {
public void keyPressed(KeyEvent e) {
if (Character.isLetter(e.getKeyChar()))
e.setModifiers(Event.SHIFT_MASK);
}
});
pack();
addWindowListener(
new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
);
}
public Dimension getPreferredSize() {
return new Dimension(200,200);
}
}

3.26 Have an ImageButtonTag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0245.html
This implementation of an ImageButton requires JDK1.1 and is a good example of the new Event
architecture. This ImageButton needs 2 GIF images representing the normal and pressed state
(
). Also a method to disable the button by using a special filter is given.
[ImageButton.java]
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.net.*;
public class ImageButton extends Canvas {
protected ActionListener actionListener = null;
int w,h;
boolean clicked;
boolean down;
boolean enabled;
Image UPimage;
Image DOWNimage;
Image disabledimage;
public ImageButton(URL up_b, URL down_b) {
clicked=false;

3.26 Have an ImageButtonTag(s): AWT

down=false;
enabled=true;
InitImage(up_b,down_b);
setSize(w,h);
addMouseListener(new ImageButtonMouseListener());
addMouseMotionListener(new ImageButtonMouseMotionListener());
}
public void InitImage(URL up, URL down) {
MediaTracker tracker;
try {
UPimage = getToolkit().getImage(up);
DOWNimage = getToolkit().getImage(down);
tracker = new MediaTracker(this);
tracker.addImage(UPimage,0);
tracker.addImage(DOWNimage,1);
tracker.waitForAll();
}
catch (InterruptedException e) {
e.printStackTrace();
}
disabledimage=createImage(new FilteredImageSource
(UPimage.getSource(),new ImageButtonDisableFilter()));
w=UPimage.getWidth(this);
h=UPimage.getHeight(this);
}
public void paint(Graphics g) {
if (down) {
g.drawImage(DOWNimage,0,0,this);
}
else {
if (enabled) {
g.drawImage(UPimage,0,0,this);
}
else {
g.drawImage(disabledimage,0,0,this);
}
}
}
public void setEnabled(boolean b) {
enabled=b;
repaint();
}
public boolean isEnabled() {
return (enabled);
}
public void addActionListener(ActionListener l) {
actionListener =
AWTEventMulticaster.add(actionListener,l);
}
public void removeActionListener(ActionListener l) {
actionListener =
AWTEventMulticaster.remove(actionListener, l);
}
public class ImageButtonMouseListener extends MouseAdapter {
public void mousePressed(MouseEvent e) {
Point p = e.getPoint();
if ((p.x < w)&&(p.y < h)&&(p.x > 0)&&(p.y > 0)&&(enabled==true)) {

3.26 Have an ImageButtonTag(s): AWT

clicked=true;
down=true;
repaint();
}
}
public void mouseReleased(MouseEvent e) {
Point p = e.getPoint();
if (down) {
down=false;
repaint();
}
if ((p.x < w)&&(p.y < h)&&(p.x > 0)&&(p.y > 0)&&(clicked==true)) {
ActionEvent ae =
new ActionEvent(e.getComponent(),0,"click");
if (actionListener != null) {
actionListener.actionPerformed(ae);
}
}
clicked=false;
}
}
public class ImageButtonMouseMotionListener extends
MouseMotionAdapter {
public void mouseDragged(MouseEvent e) {
Point p = e.getPoint();
if ((p.x < w)&&(p.y < h)&&(p.x > 0)&&(p.y > 0)&&(clicked==true)) {
if (down==false) {
down=true;
repaint();
}
}
else {
if (down==true) {
down=false;
repaint();
}
}
}
}
public Dimension getPreferredSize() {
return (new Dimension(UPimage.getWidth(this),
UPimage.getHeight(this)));
}
public Dimension getMinimumSize() {
return getPreferredSize();
}
class ImageButtonDisableFilter extends RGBImageFilter {
public ImageButtonDisableFilter() {
canFilterIndexColorModel=true;
}
public int filterRGB(int x, int y, int rgb) {
return (rgb &~0xff000000) | 0x80000000;
}
}
}

[TestImageButton.java]
import java.awt.*;
import java.awt.event.*;

3.26 Have an ImageButtonTag(s): AWT

import java.applet.*;
import java.net.*;

public class TestImageButton extends Applet


implements ActionListener,ItemListener {
ImageButton ib;
Checkbox c;
public void init() {
setLayout(new FlowLayout());
try {
ib = new ImageButton
(new URL(getCodeBase(), "Gumby.gif"),
new URL(getCodeBase(), "Gumbyblu.gif"));
c = new Checkbox("disable");
ib.addActionListener(this);
c.addItemListener(this);
add(ib);
add(c);
}
catch (Exception e) {
e.printStackTrace();
}
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() == ib) System.out.println("Click ImageButton");
}
public void itemStateChanged(ItemEvent ie) {
ib.setEnabled(!ib.isEnabled());
}
}

3.27 Reset a checkbox groupTag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0221.html
import java.applet.*;
import java.awt.*;
public class radio extends Applet {
CheckboxGroup cbg;
public void init() {
add(new Label("Payment mode?"));
cbg = new CheckboxGroup();
add(new Checkbox("Visa", cbg, false));
add(new Checkbox("Mastercard", cbg, false));
add(new Checkbox("American Express", cbg, false));
add(new Checkbox("Cash", cbg, true));
add(new Button("clear radio"));
}

3.27 Reset a checkbox groupTag(s): AWT

public boolean action(Event e, Object o) {


if (o.equals("clear radio")){
Checkbox current = cbg.getCurrent();
cbg.setCurrent( null );
current.setState( false );
return true;
}
return false;
}
}

3.28 Set the listbox widthTag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0231.html
The width can be specified via the preferredSize method. This class lets you specify a font (fixed
pitch) and calculate the appropriate width in pixels.
class myListbox extends List {
int width;
int height;
public myListbox(int r, int n, boolean m){
// (r) line number, (n) width, (m) multiselect
this(r, n, m, new Font("Courier", Font.BOLD, 10));
width = n;
height = r;
}
public myListbox(int r, int n, boolean m, Font f){
super(r,m);
width = n;
height = r;
setFont(f);
}
public Dimension preferredSize (){
FontMetrics fm=getFontMetrics(getFont());
// the character W used as reference
return new Dimension
(fm.charWidth('W')*width, fm.getHeight()*height);
}
}

3.28 Set the listbox widthTag(s): AWT

3.29 Align the column in a ListTag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0244.html
The trick is to use a FIXED width character set like "Courier".
ml = new List();
my.setFont(new Font("Courier", Font.BOLD, 10));

When inserting a line, we simply pad spaces as needed. Here the first column is 20 characters
wide, the second 10 and the last one the remaining.
insertItem(ml, "ARCHIVE", "STATUS", "PORT");

public void insertItem(List lbx,


String col1, String col2, String col3) {
String spaces2 = " ";
String spaces10 = "
";
String spaces20 = spaces10 + spaces10;
lbx.addItem(col1 +
spaces20.substring(0,20col1.length()) +
spaces2 +
col2 +
spaces10.substring(0,10col2.length()) +
col3);
}
In real life, the preferred way would be to extend the java.awt.List and override the addItem method.

3.30 Have a srolling text displayTag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0271.html
A srolling text display can be used to log informations or events. In this snippet, we are using a List
component to display the data. We are keeping only the last 10 events. It's a good idea to limit the
amount of data kept in the List , in fact we have no choice because the maximum capacity is about
32k (Win).
import java.awt.*;
import java.awt.event.*;
public class TelnetLikeDisplay extends Applet
implements ActionListener {
Button b;
int i = 0;
static final int LINE_BUFFERED = 10;

3.29 Align the column in a ListTag(s): AWT

static final int LINE_DISPLAYED = LINE_BUFFERED 1;


List l;
public void init() {
setLayout(new FlowLayout(FlowLayout.LEFT));
add(b = new Button("New Line"));
b.addActionListener(this);
add(l = new List(5));
l.setSize(100,100);
l.setForeground(new Color(0).yellow);
l.setBackground(new Color(0).black);
}
public void actionPerformed(ActionEvent ae) {
String newLine = "Line #" + i;
if (i <LINE_BUFFERED) {
l.addItem(newLine);
l.makeVisible(i);
}
else {
l.remove(0);
l.add(newLine, LINE_DISPLAYED);
l.makeVisible(LINE_DISPLAYED);
}
i++;
}
}

3.31 Label dynamic resizingTag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0232.html
If there is no Layout Manager installed, try something like this:
aLabel.setText ("A very long label");
aLabel.resize (aLabel.preferredSize());

With a Layout Manager, you have to validate() the layout to redraw the components invalidated.
Label aLabel = new Label("short label");
aLabel.setText ("A very long label");
this.validate();

While this method works in Netscape or the Appletviewer, on IE4/5 there is no resizing. You may
want to try this instead (thanks to Dan for the tip):
Label aLabel = new Label("short label");
aLabel.setText(""A very long label");
aLabel.invalidate(); // make sure the component is marked as nonvalid
this.validate();

3.31 Label dynamic resizingTag(s): AWT

This example how to change a Label or a String drawn with the drawString method by clicking on a
button.
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
public class TestPaint extends Applet
implements ActionListener {
MyPanel p;
Label l;
Button b1, b2;
TextField t1, t2;
public void init() {
setLayout(new FlowLayout());
t1 = new TextField(10);
b1 = new Button("Change Label");
add(t1); add(b1);
t2 = new TextField(10);
b2 = new Button("Change drawString");
add(t2); add(b2);
l = new Label("label text");
add(l);
// a Panel with a drawString call
p = new MyPanel();
add(p);
b1.addActionListener(this);
b2.addActionListener(this);
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() == b1) {
l.setText(t1.getText());
l.invalidate();
validate();
}
if (e.getSource() == b2) {
p.someString = t2.getText();
p.repaint();
}
}
}
class MyPanel extends Panel {
String someString = "drawstring";
MyPanel() { super(); }
public void paint (Graphics g) {
g.drawString(someString, 10,50);
}
public Dimension getPreferredSize() {
return new Dimension (100,100);
}
}

3.31 Label dynamic resizingTag(s): AWT

3.32 Make a TextArea "wordwrap"Tag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0241.html
Simply create the TextArea with no horizontal scrollbar.
myTextArea = new TextArea
("text", 3 , 100 , TextArea.SCROLLBARS_VERTICAL_ONLY);

3.33 Synchronize a TextArea vs a ChoiceTag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0281.html
import java.awt.*;
import java.awt.event.*;
class ChoiceEx extends Frame implements ItemListener {
Choice choice = new Choice();
TextArea textarea = new TextArea();
ChoiceEx() {
super("");
for (int i=0; i<10; i++) {
choice.addItem("item "+i);
}
// Set listeners
choice.addItemListener(this);
add(choice, BorderLayout.SOUTH);
add(textarea, BorderLayout.NORTH);
pack();
setVisible(true);
}
// When list or choice is updated
public void itemStateChanged(ItemEvent evt) {
textarea.setText("Item #" + choice.getSelectedIndex());
}
static public void main(String[] args) {
new ChoiceEx();
}
}

3.32 Make a TextArea "wordwrap"Tag(s): AWT

3.34 Display underlined textTag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0258.html
import java.applet.*;
import java.awt.*;
public class underlineText extends Applet{
String s = "Underlined text";
int x=10;
int y=10;
public void init() {}
public void paint(Graphics g) {
g.drawString(s, x,y);
g.drawLine(x , y+2 , x+getFontMetrics(getFont()).stringWidth(s) , y+2 );
}
}
Check this Howto for underlined text with a Label component.
Check this Howto for underlined text in Swing.

3.35 Display vertical textTag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0259.html
import java.applet.*;
import java.awt.*;
public class verticalText extends Applet {
String s = "Vertical text";
int x=10;
int y=10;
int v;
public void init() {}
public void paint(Graphics g) {
v=g.getFontMetrics(getFont()).getHeight()+1;
System.out.println(v);
int j =0;
int k= s.length();
while(j < k+1) {
if (j == k)
g.drawString(s.substring(j),x, y+(j*v));
else

3.34 Display underlined textTag(s): AWT

g.drawString(s.substring(j,j+1),x, y+(j*v));
j++;
}
}
}

[JDK1.4]
import java.awt.geom.AffineTransform;
import java.awt.Graphics2D;

public void paint(Graphics g){


Graphics2D g2d = (Graphics2D)g;
// clockwise 90 degrees
AffineTransform at = new AffineTransform();
// thanks to M.C. Henle for the bug fix!
at.setToRotation(Math.PI/2.0, width/2.0, height/2.0);
g2d.setTransform(at);
g2d.drawString("Vertical text", x, y);
}

3.36 Have Label with many linesTag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0269.html
The Label component included in the AWT do not support "\n" in its definition. The following class
implements a multiline Label. Lines are separated byt the token "\n". Lines can be left, right or
center justified. Plus, there is a possibility to have a border around the label.
import java.awt.*;
import java.util.*;

public class MultiLineLabel extends Canvas {


public static final int LEFT = 0;
public static final int CENTER = 1;
public static final int RIGHT = 2;
private String text;
private String lines[];
private int num_lines;
private int line_height;
private int line_ascent;
private int line_widths[];
private int max_width;
private int alignment;
private boolean border;
private int topBottomMargin;
private int leftRightMargin;
private int x = 0;
private int y = 0;

3.36 Have Label with many linesTag(s): AWT

Dimension offDimension;
Image offImage;
Graphics offGraphics;
Color borderColor = new Color(0).black;
public MultiLineLabel(String s, int i, boolean b) {
// s the label
// i alignement MultiLineLabel.CENTER, MultiLineLabel.RIGHT,
//
MultiLineLabel.LEFT
//
default MultiLineLabel.LEFT
// b border present or not
setAlignment(i);
setText(s);
setBorder(b);
}
public MultiLineLabel(String string, int i) {
this(string, i, false);
}
public MultiLineLabel(String string) {
this(string, 0);
}
public MultiLineLabel() {
this("", 0);
}
public void addNotify() {
super.addNotify();
calc();
}
public void setX(int i) { x = i;
public void setY(int i) { y = i;

}
}

public int getLeftRightMargin() {


return leftRightMargin;
}
public void setLeftRightMargin(int i) {
// make sense only if alignment is MultiLineLabel.LEFT!
if (i >= 0) leftRightMargin = i ;
}
public int getAlignment() {
return alignment;
}
public void setAlignment(int i) {
switch (alignment) {
case 0:
case 1:
case 2:
alignment = i;
break;
default:
throw new IllegalArgumentException();
}
repaint();
}

3.36 Have Label with many linesTag(s): AWT

public int getTopBottomMargin() {


return topBottomMargin;
}
public void setTopBottomMargin(int i) {
if (i >= 0) topBottomMargin = i;
}
public void setFont(Font font) {
super.setFont(font);
calc();
repaint();
}
public Dimension getMinimumSize() {
Dimension d = new Dimension
(max_width + leftRightMargin * 2,
num_lines * line_height + topBottomMargin * 2);
if (d.width == 0) d.width = 10;
if (d.height == 0) d.height = 10;
return d;
}
public Dimension getPreferredSize() {
return getMinimumSize();
}
public boolean getBorder() {
return border;
}
public void setBorder(boolean flag) {
border = flag;
}
public void setText(String s) {
// parse the string , "\n" is a the line separator
StringTokenizer st =
new StringTokenizer(s,"\n");
num_lines = st.countTokens();
lines = new String[num_lines];
line_widths = new int[num_lines];
for (int i = 0; i < num_lines; i++)
lines[i] = st.nextToken();
calc();
repaint();
text = new String(s);
}
public String getText() {
return text;
}
public Color getBorderColor() {
return borderColor;
}
public void setBorderColor(Color c) {
borderColor = c;
}
private void calc() {
// calc dimension and extract maximum width

3.36 Have Label with many linesTag(s): AWT

Font f = getFont();
if (f != null) {
FontMetrics fm = getFontMetrics(f);
if (fm != null) {
line_height = fm.getHeight();
line_ascent = fm.getAscent();
max_width = 0;
for (int i = 0; i < num_lines; i++) {
line_widths[i] =
fm.stringWidth(lines[i]);
if (line_widths[i] > max_width)
max_width = line_widths[i];
}
}
}
}
public void update(Graphics g) {
super.paint(g);
Dimension d = getSize();
if ( (offGraphics == null) ||
(d.width != offDimension.width) ||
(d.height != offDimension.height)
) {
offDimension = d;
offImage = createImage(d.width, d.height);
offGraphics = offImage.getGraphics();
}
offGraphics.setColor(getBackground());
offGraphics.fillRect
(x, y, getSize().width 1,
getSize().height 1);
if (border) {
offGraphics.setColor(borderColor);
offGraphics.drawRect
(x, y, getSize().width 1, getSize().height 1);
}
int j = line_ascent +
(d.height num_lines * line_height) / 2;
for (int k = 0; k < num_lines; ) {
int i;
switch (alignment) {
case 0:
i = 0;
break;
case 2:
i = d.width line_widths[k];
break;
default:
i = (d.width line_widths[k]) / 2;
break;
}
i += leftRightMargin;
offGraphics.setColor(getForeground());
offGraphics.drawString(lines[k], i + x, j + y);
k++;
j += line_height;
}
g.drawImage(offImage,0,0,this);
}
public void paint(Graphics g) {
update(g);

3.36 Have Label with many linesTag(s): AWT

}
public static void main(String args[]){
Frame f = new Frame("Test MultiLineLabel");
f.setSize(200,200);
f.setLayout(new FlowLayout());
f.setVisible(true);
MultiLineLabel mll1 = new MultiLineLabel
("This a test!\nsecond line\nthird line",
MultiLineLabel.LEFT, true);
// mll1.setBorderColor(new Color(0).blue);
mll1.setLeftRightMargin(15);
mll1.setTopBottomMargin(15);
f.add(mll1);
Button b = new Button("Dummy");
f.add(b);
MultiLineLabel mll2 = new MultiLineLabel
("123\n4\n567", MultiLineLabel.RIGHT, false);
mll2.setForeground(new Color(0).yellow);
mll2.setBackground(new Color(0).black);
f.add(mll2);
f.validate();
}
}

3.37 Have a Label with underlined text Tag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0272.html
[UnderlinedLabel.java]
import java.awt.*;
public class UnderlinedLabel extends Label
public UnderlinedLabel(){
this("");
}

public UnderlinedLabel(String text){


super(text);
}
public void paint(Graphics g) {
Rectangle r;
super.paint(g);
r = g.getClipBounds();
g.drawLine
(0,
r.height this.getFontMetrics(this.getFont()).getDescent(),

3.37 Have a Label with underlined text Tag(s): AWT

this.getFontMetrics(this.getFont()).stringWidth(this.getText()),
r.height this.getFontMetrics(this.getFont()).getDescent());
}
}

[TestUnderlinedLabel.java]
import java.applet.*;
import java.awt.*;
public class TestUnderlinedLabel extends Applet {
public void init() {
UnderlinedLabel ul1 =
new UnderlinedLabel
("Java Howto");
add(ul1);
}
}

[testapplet.html]
<HTML><HEAD></HEAD><BODY>
<APPLET CODE="TestUnderlinedLabel.class"
NAME="myApplet"
HEIGHT=200 WIDTH=200>
/APPLET/BODY/HTML
Check this Howto for underlined text in Swing.

3.38 Have a Label acting as HTML HREF (URLLabel)Tag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0273.html
[URLLabel.java]
import
import
import
import

java.applet.*;
java.awt.*;
java.awt.event.*;
java.net.*;

public class URLLabel extends Label {


private java.applet.Applet applet;
private URL url;
private String target = "";
private Color unvisitedURL = Color.blue;
private Color visitedURL = Color.green;
public URLLabel(Applet applet , String url, String text){
this(applet, url, text, "_self");
}

3.38 Have a Label acting as HTML HREF (URLLabel)Tag(s): AWT

public URLLabel
(Applet applet , String url, String text, String target){
super(text);
setForeground(unvisitedURL);
try {
this.applet = applet;
this.url = new URL(url);
this.target = target;
addMouseListener( new Clicked() );
}
catch (Exception e) {
e.printStackTrace();
}
}
public void paint(Graphics g) {
Rectangle r;
super.paint(g);
r = g.getClipBounds();
g.drawLine(0,
r.height this.getFontMetrics(this.getFont()).getDescent(),
this.getFontMetrics(this.getFont()).stringWidth(this.getText()),
r.height this.getFontMetrics(this.getFont()).getDescent());
}
public void setUnvisitedURLColor(Color c) {
unvisitedURL = c;
}
public void setVisitedURLColor(Color c) {
visitedURL = c;
}
class Clicked extends MouseAdapter{
public void mouseClicked(MouseEvent me){
setForeground(visitedURL);
applet.getAppletContext().showDocument(url, target);
}
}
}

[TestURLLabel.java]
import java.applet.*;
import java.awt.*;
public class TestURLLabel extends Applet {
public void init() {
URLLabel ull1 = new URLLabel(this,
"http://www.rgagnon.com/howto.html",
"Java Howto");
add(ull1);
URLLabel ull2 = new URLLabel(this,
"http://www.rgagnon.com/bigindex.html",
"Java Howto BigIndex");
add(ull2);
URLLabel ull3 = new URLLabel(this,
"http://www.rgagnon.com/javadetails/java0001.html",
"Java Howto 0001");
add(ull3);
URLLabel ull4 = new URLLabel(this,
"http://www.rgagnon.com/javadetails/java0002.html",
"Java Howto 0002");

3.38 Have a Label acting as HTML HREF (URLLabel)Tag(s): AWT

add(ull4);
validate();
}
}

[testapplet.html]
<HTML><HEAD></HEAD><BODY>
<APPLET CODE="TestURLLabel.class"
NAME="myApplet"
HEIGHT=200 WIDTH=200>
</APPLET></BODY></HTML>

Try it here.

3.39 Display a GIF in a CanvasTag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0229.html
import java.awt.*;
import java.awt.image.*;
public class ImageCanvas extends Canvas {
Image image;
public ImageCanvas(String name) {
MediaTracker media = new MediaTracker(this);
image = Toolkit.getDefaultToolkit().getImage(name);
media.addImage(image, 0);
try {
media.waitForID(0);
}
catch (Exception e) {}
}
public ImageCanvas(ImageProducer imageProducer) {
image = createImage(imageProducer);
}
public void paint(Graphics g) {
g.drawImage(image, 0,0, this);
}
public static void main(String argv[]) {
if (argv.length <1) {
System.out.println
("usage: ImageCanvas.class [image file name]");
System.exit(0);
}
Frame frame = new Frame(argv[0]);
frame.setLayout(new BorderLayout());
frame.add("Center", new ImageCanvas(argv[0]));

3.39 Display a GIF in a CanvasTag(s): AWT

frame.resize(400,400);
frame.show();
}
}

3.40 Embed an image into a FrameTag(s): AWT AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0302.html
A given image is tiled as the frame background.
The result is not too good with Label...
import java.awt.*;
import java.awt.event.*;
public class ImageFrame extends Frame

private Image image;


ImageFrame() {
super("");
try {
MediaTracker mt = new MediaTracker (this);
// for Applet, change the method to retrieve the image
// and of course use your own image!
image = Toolkit.getDefaultToolkit().getImage("images/jht.gif");
mt.addImage(image, 0);
mt.waitForID(0);
}
catch (Exception e) {
e.printStackTrace();
}
setLayout(new FlowLayout());
add(new TextField(10));
add(new Button("hello"));
add(new List(20));
add(new TextArea(20,20));
// Label may not look too good ...
add(new Label("Hello"));
setSize(500, 500);
addWindowListener
(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
// change this for an Applet
System.out.println("Bye.");
System.exit(0);
}
}
);

3.40 Embed an image into a FrameTag(s): AWT AWT

}
public void update( Graphics g) {
paint(g);
}
public void paint(Graphics g) {
if(image != null) {
int x = 0, y = 0;
while(y < getSize().height) {
x = 0;
while(x< getSize().width) {
g.drawImage(image, x, y, this);
x= x + image.getWidth(null);
}
y = y + image.getHeight(null);
}
}
else {
g.clearRect(0, 0, getSize().width, getSize().height);
}
}
static public void main(String[] args) {
ImageFrame iframe = new ImageFrame();
iframe.setVisible(true);
}
}

The result :

3.40 Embed an image into a FrameTag(s): AWT AWT

3.41 Load several images from a single GIFTag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0239.html
It's a good idea to combine small GIFs into a single big one to speed up the loading process. In the
following snippet, I assume that all images are the same height and width. You may want to get this
GIF (
) if you want to try the example on your workstation!
import
import
import
import

java.applet.*;
java.awt.*;
java.io.*;
java.net.*;

public class strip extends Applet{


int iconHeight = 16;
int iconWidth = 16;
int iconCount = 2;
Image icon[] = new Image[iconCount];
Image allIcons;
public void init(){
loadImages("item.gif");
}
public void paint(Graphics g)
g.drawImage(allIcons, 0, 0,
g.drawImage(icon[0], 0, 20,
g.drawImage(icon[1], 0, 40,
}

{
this);
this);
this);

public void loadImages(String s) {


MediaTracker t=new MediaTracker(this);
allIcons=createImage(1,1);
try {
URL u=new URL(getCodeBase(), s);
allIcons=Toolkit.getDefaultToolkit().getImage(u);
t.addImage(allIcons,0);
}
catch (MalformedURLException me) {
System.out.println("MalformedURLException: " + me);
}
try {
t.waitForAll(15000);
}
catch (InterruptedException e) {
System.out.println("interrupted");
}
for (int i=0; i < iconCount; i++) {
Image z=createImage(iconWidth,iconHeight);
Graphics g=z.getGraphics();
g.clipRect(0,0,iconWidth,iconHeight);
g.drawImage(allIcons,i*iconWidth,0,this);
icon[i]=z;
}
}
}

3.41 Load several images from a single GIFTag(s): AWT

3.42 Load an Image from a JAR fileTag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0240.html
[JDK1.1 application]
String imgName = "image.jpg";
URL imgURL = getClass().getResource(imgName);
Toolkit tk = Toolkit.getDefaultToolkit();
Image img = null;
try {
MediaTracker m = new MediaTracker(this);
img = tk.getImage(imgURL);
m.addImage(img, 0);
m.waitForAll();
}
catch (Exception e) {
e.printStackTrace();
}

[JDK 1.1 applet]


Because of some security reason, it's not possible with some browser (like Netscape) to use the
getResource() method from an Applet. Instead we must use the getResourceAsStream method.
Image img = null;
try {
MediaTracker m = new MediaTracker(this);
InputStream is = getClass().getResourceAsStream("image.gif");
//
// if your image is in a subdir in the jar then
//
InputStream is = getClass().getResourceAsStream("img/image.gif");
// for example
//
BufferedInputStream bis = new BufferedInputStream(is);
// a buffer large enough for our image
//
// can be
//
byte[] byBuf = = new byte[is.available()];
//
is.read(byBuf); or something like that...
byte[] byBuf = = new byte[10000];
int byteRead = bis.read(byBuf,0,10000);
img = Toolkit.getDefaultToolkit().createImage(byBuf);
m.addImage(img, 0);
m.waitForAll();
}
}
catch(Exception e) {
e.printStackTrace();
}

[JDK 1.2 application]


3.42 Load an Image from a JAR fileTag(s): AWT

URL url = this.getClass().getResource("myIcon.gif");


button.setIcon(new ImageIcon(url));

3.43 Load an Icon from a jar (again)Tag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0436.html
public static ImageIcon getImageIcon(String name) {
return new ImageIcon(ClassLoader.getSystemResource(name));
}
ImageIcon img = getImageIcon("resources/images/icone.gif");

Remember that it is always possible to the Java builtin icons so that you don't have to include your
own standard icons.
public static Icon getIconForType(int iconType) {
switch (iconType) {
case 0:
return UIManager.getIcon("OptionPane.errorIcon");
case 1:
return UIManager.getIcon("OptionPane.informationIcon");
case 2:
return UIManager.getIcon("OptionPane.warningIcon");
case 3:
return UIManager.getIcon("OptionPane.questionIcon");
}
return null;
}

A list of what icons are available can be found here

3.44 Scale an ImageTag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0243.html
import java.awt.image.*;
import java.awt.*;
import java.net.*;
public class app extends java.applet.Applet {
Image source;

3.43 Load an Icon from a jar (again)Tag(s): AWT

Image resizedImage;
public void init() {
MediaTracker media = new MediaTracker(this);
// java howto image for example, can be JPG
source = getImage(getDocumentBase(),"../images/jht.gif");
media.addImage(source,0);
try {
media.waitForID(0);
// scale down, half the original size
ImageFilter replicate =
new ReplicateScaleFilter
(source.getWidth(this)/2, source.getHeight(this)/2);
ImageProducer prod =
new FilteredImageSource(source.getSource(),replicate);
resizedImage = createImage(prod);
media.addImage(resizedImage,1);
media.waitForID(1);
}
catch(InterruptedException e) {}
}
public void paint(Graphics g) {
g.drawImage(source, 10,10,this);
g.drawImage(resizedImage,10, 80,this);
}
}

Try it here.
Modern JDK has now a complete library devoted to graphic manipulation.
The following exampe takes a JPG file as input , rescale it to the passed parameters and writes the
result in the specified output file.
import
import
import
import
import

java.awt.*;
java.awt.geom.*;
java.awt.image.*;
java.io.*;
javax.imageio.*;

public class ScaleJPG {


public static void scale(String src, int width, int height, String dest)
throws IOException {
BufferedImage bsrc = ImageIO.read(new File(src));
BufferedImage bdest =
new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g = bdest.createGraphics();
AffineTransform at =
AffineTransform.getScaleInstance((double)width/bsrc.getWidth(),
(double)height/bsrc.getHeight());
g.drawRenderedImage(bsrc,at);
ImageIO.write(bdest,"JPG",new File(dest));
}
public static void main(String[] args) {
if (args.length == 4) {
try {
ScaleJPG.scale
(args[0],Integer.parseInt(args[1]),
Integer.parseInt(args[2]), args[3]);
}

3.43 Load an Icon from a jar (again)Tag(s): AWT

catch (Exception e) {
e.printStackTrace();
}
}
else {
System.out.println("\nUsage: java ScaleJPG src width height dest\n");
}
}
}

Example :
>java ScaleJPG javahowto.jpg 250 70 javahowto2.jpg

Input:

Ouput:

3.45 Fade an imageTag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0249.html
This example display a GIF with a fadein, fadeout effect.
import
import
import
import

java.applet.*;
java.awt.*;
java.awt.image.*;
java.net.*;

public class FadeImage extends Applet {


Image
img, faded;
int level, sign;
MediaTracker tracker;
AlphaFilter f;
FilteredImageSource fis;
public void init() {
level = 0;
sign = 15;
tracker = new MediaTracker(this);
try {
img = getImage(new URL(getDocumentBase(), "../images/gumby.gif"));
tracker.addImage(img,0);
tracker.waitForID(0);
}
catch (Exception e) {

3.45 Fade an imageTag(s): AWT

e.printStackTrace();
}
f = new AlphaFilter();
f.setLevel(level);
fis = new FilteredImageSource(img.getSource(), f) ;
FadeThread ft = new FadeThread();
ft.delayedFading(this, 20);
ft.start();
}
public void paint(Graphics g) {
if (faded != null) {
g.drawImage(faded,0,0,this);
}
}
public void fadeIt() {
Graphics g = this.getGraphics();
level += sign;
if (level < 0) {
level=0;
sign = sign * 1;
}
if (level > 255) {
level=255;
sign = sign * 1;
try {
Thread.sleep(1000);
}
catch (Exception e) {}
}
f.setLevel(level);
if (faded != null) faded.flush();
faded = this.createImage(fis);
tracker.addImage(faded,0);
try {
tracker.waitForID(0);
}
catch (Exception ex) {
ex.printStackTrace();
}
repaint();
}
class FadeThread extends Thread {
FadeImage fadeApplet;
int delay;
public void delayedFading(FadeImage f, int delay) {
this.fadeApplet = f;
this.delay = delay;
}
public void run() {
while (true) {
try {
sleep(delay);
fadeApplet.fadeIt();
}
catch (Exception e) {
e.printStackTrace();
}

3.45 Fade an imageTag(s): AWT

}
}
}
class AlphaFilter extends RGBImageFilter {
private int level;
public AlphaFilter() {
canFilterIndexColorModel = true;
}
public void setLevel(int lev) {
level = lev;
}
public int filterRGB(int x, int y, int rgb) {
int a = level * 0x01000000;
return (rgb &
0x00ffffff) | a;
}
}
}

Try it here.

3.46 Rotate an imageTag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0248.html
The following snippet rotates an image (90 degrees). The applet assumes the dimension 32x32 for
the image. You may want to grap this image
for testing purpose.

import
import
import
import

java.applet.Applet;
java.awt.*;
java.awt.image.*;
java.net.*;

public class RotateGumby extends Applet {


Image img = null;
Image rot = null;
int buffer[] = new int[32 * 32];
int rotate[] = new int[32 * 32];
public void init() {
try {
MediaTracker tracker = new MediaTracker (this);
img = getImage(new URL(getDocumentBase(), "gumby.gif"));
tracker.addImage (img, 0);
tracker.waitForAll();
PixelGrabber grabber =
new PixelGrabber(img, 0, 0, 32, 32, buffer, 0, 32);

3.46 Rotate an imageTag(s): AWT

try {
grabber.grabPixels();
}
catch(InterruptedException e) {
e.printStackTrace();
}
for(int y = 0; y < 32; y++) {
for(int x = 0; x < 32; x++) {
rotate[((32x1)*32)+y] = buffer[(y*32)+x];
}
}
rot = createImage(new MemoryImageSource(32, 32, rotate, 0, 32));
}
catch (Exception e) {
e.printStackTrace();
}
}
public void update( Graphics g) {
paint(g);
}
public void paint(Graphics g) {
g.drawImage(img, 0, 0,this);
g.drawImage(rot,0, 40, this);
}
}

The next example will rotate a picture 5 degrees at a time. We are using the Java2D package (and
Swing).
import
import
import
import

java.awt.*;
java.awt.event.*;
java.awt.geom.*;
javax.swing.*;

public class RotatePanel extends JPanel {


private Image image;
private double currentAngle;
public RotatePanel(Image image) {
this.image = image;
MediaTracker mt = new MediaTracker(this);
mt.addImage(image, 0);
try {
mt.waitForID(0);
}
catch (Exception e) {
e.printStackTrace();
}
}
public void rotate() {
//rotate 5 degrees at a time
currentAngle+=5.0;
if (currentAngle >= 360.0) {
currentAngle = 0;
}
repaint();
}
protected void paintComponent(Graphics g) {
super.paintComponent(g);

3.46 Rotate an imageTag(s): AWT

Graphics2D g2d = (Graphics2D)g;


AffineTransform origXform = g2d.getTransform();
AffineTransform newXform = (AffineTransform)(origXform.clone());
//center of rotation is center of the panel
int xRot = this.getWidth()/2;
int yRot = this.getHeight()/2;
newXform.rotate(Math.toRadians(currentAngle), xRot, yRot);
g2d.setTransform(newXform);
//draw image centered in panel
int x = (getWidth() image.getWidth(this))/2;
int y = (getHeight() image.getHeight(this))/2;
g2d.drawImage(image, x, y, this);
g2d.setTransform(origXform);
}
public Dimension getPreferredSize() {
return new Dimension (image.getWidth(this), image.getHeight(this));
}

public static void main(String[] args) {


JFrame f = new JFrame();
Container cp = f.getContentPane();
cp.setLayout(new BorderLayout());
Image testImage =
Toolkit.getDefaultToolkit().getImage("c:/temp/gumby.gif");
final RotatePanel rotatePanel = new RotatePanel(testImage);
JButton b = new JButton ("Rotate");
b.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
rotatePanel.rotate();
}
});
cp.add(rotatePanel, BorderLayout.CENTER);
cp.add(b, BorderLayout.SOUTH);
f.pack();
f.setVisible(true);
}
}

3.47 Create a scrollable canvasTag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0230.html
JDK1.1 using a ScrollPane
import java.applet.*;
import java.awt.*;
public class apptest extends Applet {
Canvas c;
ScrollPane s;

3.47 Create a scrollable canvasTag(s): AWT

public void init() {


setLayout(new BorderLayout());
s = new ScrollPane();
s.setSize(100,100);
add("Center", s);
c = new myCanvas();
c.setSize(500,300);
s.add(c);
}
class myCanvas extends Canvas {
Image
buffImage;
Graphics offscreen;
boolean initDone = false;
myCanvas() { super(); }
public void paint(Graphics g) {
if (!initDone)
initpaint(g);
else
g.drawImage(buffImage, 0, 0, this);
}
public void update(Graphics g) {
g.drawImage(buffImage, 0, 0, this);
}
public void initpaint(Graphics g) {
try {
buffImage = this.createImage(500, 500);
offscreen = buffImage.getGraphics();
offscreen.setColor(Color.black);
offscreen.fillRect(0, 0, 500, 500);
offscreen.setColor(Color.white);
offscreen.setFont(new Font("Courier", Font.ITALIC, 42));
offscreen.drawString("Hello World!", 0, 50);
initDone = true;
g.drawImage(buffImage,0,0, this);
}
catch (Exception e) {
e.printStackTrace();
}
}
}
}

JDK1.0.2 using a Canvas with Scrollbar


import java.applet.*;
import java.awt.*;
public class apptest extends Applet {
ScrollCanvas sc;
public void init() {
setLayout(new FlowLayout());
sc = new ScrollCanvas
(150,150, 300,200, Color.black,
Color.white);
add(sc);
}
public boolean handleEvent(Event e) {
if (e.target instanceof Scrollbar) {

3.47 Create a scrollable canvasTag(s): AWT

switch (e.id) {
case Event.SCROLL_ABSOLUTE:
case Event.SCROLL_PAGE_DOWN:
case Event.SCROLL_PAGE_UP:
case Event.SCROLL_LINE_UP:
case Event.SCROLL_LINE_DOWN:
sc.redraw();
return true;
}
}
return super.handleEvent(e);
}
}
class ScrollCanvas extends Panel {
int vw,vh;
int rw,rh;
Color b,f;
myCanvas c;
Scrollbar sv, sh;
// constructor
//
visible h w
//
real
h w
//
background foreground
ScrollCanvas
(int vw1, int vh1, int rw1, int rh1, Color b1, Color f1) {
super();
vw = vw1; vh = vh1;
rh = rh1; rw = rw1;
b = b1; f = f1;
int ScrollIncrement = 10;
setLayout(new BorderLayout());
c = new myCanvas(vw, vh, rw, rh, b ,f);
add("West", c);
sv = new Scrollbar
(Scrollbar.VERTICAL,0, ScrollIncrement, 0, rh);
add("East", sv);
sh = new Scrollbar
(Scrollbar.HORIZONTAL, 0, ScrollIncrement, 0, rw);
add("South", sh);
}
public void redraw() {
int y = sv.getValue();
int x = sh.getValue();
c.draw(x,y);
}
public Dimension minimumSize() {
return new Dimension(vw,vh);
}
public Dimension preferredSize() {
return new Dimension(vw,vh);
}
}
class myCanvas extends Canvas {
int vw, vh;
int rw, rh;
Color b, f;
int x, y;

3.47 Create a scrollable canvasTag(s): AWT

Image buffImage;
Graphics offscreen;
boolean initDone;
myCanvas
(int vw1, int vh1, int rw1, int rh1, Color b1, Color f1) {
super();
vw = vw1; vh = vh1;
rh = rh1; rw = rw1;
b = b1; f = f1;
initDone = false;
repaint();
}
public void paint(Graphics g) {
if (!initDone)
initpaint(g);
else
g.drawImage(buffImage, x, y, this);
}
public void update(Graphics g) {
g.drawImage(buffImage, x, y, this);
}
public void initpaint(Graphics g) {
try {
buffImage = this.createImage(rw, rh);
offscreen = buffImage.getGraphics();
offscreen.setColor(b);
offscreen.fillRect(0, 0, rw, rh);
offscreen.setColor(f);
offscreen.setFont(new Font("Courier", Font.ITALIC, 42));
offscreen.drawString("Hello World!", 0, 50);
initDone = true;
g.drawImage(buffImage,0,0, this);
}
catch (Exception e) {
System.out.println("oups...");
}
}
public void draw (int x1, int y1)
x = x1;
y = y1;
update(getGraphics());
}

public Dimension minimumSize() {


return new Dimension(vw,vh);
}
public Dimension preferredSize() {
return new Dimension(vw,vh);
}
}

3.47 Create a scrollable canvasTag(s): AWT

3.48 Use an Image as the Applet backgroundTag(s): Applet AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0233.html
import java.applet.Applet;
import java.net.*;
//
//
//
//

TILE BACKGROUND
in the HTML use :
PARAM NAME="bgImage" VALUE="images/myImage.jpg"
in the APPLET tag

public class Tile extends Applet {


Image bgImage = null;
public void init() {
try {
MediaTracker tracker = new MediaTracker (this);
bgImage = getImage
(new URL(getCodeBase(), getParameter("bgImage")));
tracker.addImage (bgImage, 0);
tracker.waitForAll();
}
catch (Exception e) {
e.printStackTrace();
}
setLayout(new FlowLayout());
add(new Button("Ok"));
add(new TextField(10));
}
public void update( Graphics g) {
paint(g);
}
public void paint(Graphics g) {
if(bgImage != null) {
int x = 0, y = 0;
while(y < size().height) {
x = 0;
while(x<size().width) {
g.drawImage(bgImage, x, y, this);
x=x+bgImage.getWidth(null);
}
y=y+bgImage.getHeight(null);
}
}
else {
g.clearRect(0, 0, size().width, size().height);
}
}
}
<HTML>
<TABLE><TR><TD>
<APPLET CODE=Tile.class WIDTH=150 HEIGHT=150>
<PARAM NAME="bgImage" VALUE="images/jht.gif">
</APPLET>
/HMTL

3.48 Use an Image as the Applet backgroundTag(s): Applet AWT

Try it here.

3.49 Have a simple Image browserTag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0277.html
[imagelist.txt]
jht.gif|JAVA Howto
jsht.gif|Javascript Howto
pht.gif|Powerbuilder Howto

[application version]
import
import
import
import

java.awt.*;
java.awt.event.*;
java.net.*;
java.io.*;

public class ImageBrowser {


public static void main(String s[]) {
AFrame f = new AFrame();
}
}
class AFrame extends Frame implements ActionListener {
List lbx;
MyCanvas can;
String url[] = new String[50];
public AFrame() {
setTitle("Image selection, double click to display");
setLayout(new GridLayout(1,2));
setSize(800,600);
lbx = new List();
can = new MyCanvas();
add(lbx); add(can);
initLbx();
// action on listbox double click
lbx.addActionListener(this);
// to close the Frame
addWindowListener
(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
);
setVisible(true);
}
public void actionPerformed (ActionEvent ae) {

3.49 Have a simple Image browserTag(s): AWT

String theUrl = url[lbx.getSelectedIndex()];


MediaTracker media = new MediaTracker(this);
Image image =
Toolkit.getDefaultToolkit().getImage(theUrl);
media.addImage(image, 0);
try {
media.waitForID(0);
can.setImage(image);
}
catch (Exception e) { e.printStacktrace();}
}
public void initLbx() {
int i = 0;
try {
String aLine = "";
BufferedReader in
= new BufferedReader(new FileReader("imagelist.txt"));
while(null != (aLine = in.readLine())) {
java.util.StringTokenizer st =
new java.util.StringTokenizer(aLine, "|");
url[i++] = st.nextToken();
// lbx.addItem(st.nextToken());
lbx.add(st.nextToken());
}
}
catch(Exception e) { e.printStackTrace();}
}
}
class MyCanvas extends Canvas {
private Image image;
public MyCanvas() {
super();
}
public void setImage(Image i) {
image = i;
repaint();
}
public void paint(Graphics g) {
if (image != null)
g.drawImage(image, 0,0, this);
}
}
NOTE : You can download this example here

[applet version]
import
import
import
import
import

java.applet.*;
java.awt.*;
java.awt.event.*;
java.net.*;
java.io.*;

public class ImageBrowserApplet extends Applet {


public void init() {
APanel p = new APanel(this);
setLayout(new BorderLayout());
add(p, "Center");

3.49 Have a simple Image browserTag(s): AWT

}
}
class APanel extends Panel implements ActionListener {
private List lbx;
private MyCanvas can;
private Applet parent = null;
private String url[] = new String[50];
public APanel(Applet a) {
parent = a;
setLayout(new GridLayout(1,2));
lbx = new List();
can = new MyCanvas();
add(lbx); add(can);
initLbx();
// action on listbox double click
lbx.addActionListener(this);
setBackground(new Color(0).white);
}
public void actionPerformed (ActionEvent ae) {
try {
URL theUrl =
new URL(parent.getCodeBase(), url[lbx.getSelectedIndex()]);
MediaTracker media = new MediaTracker(this);
Image image =
Toolkit.getDefaultToolkit().getImage(theUrl);
media.addImage(image, 0);
media.waitForID(0);
can.setImage(image);
}
catch (Exception e) { e.printStackTrace();}
}
public void initLbx() {
int i = 0;
try {
String aLine = "";
URL source =
new URL(parent.getCodeBase(), "imagelist.txt");
BufferedReader in
= new BufferedReader
(new InputStreamReader(source.openStream()));;
while(null != (aLine = in.readLine())) {
java.util.StringTokenizer st =
new java.util.StringTokenizer(aLine, "|");
url[i++] = st.nextToken();
// lbx.addItem(st.nextToken());
lbx.add(st.nextToken());
}
}
catch(Exception e) { e.printStackTrace();}
}
}
class MyCanvas extends Canvas {
private Image image;
public MyCanvas() {
super();
}
public void setImage(Image i) {

3.49 Have a simple Image browserTag(s): AWT

image = i;
repaint();
}
public void paint(Graphics g) {
if (image != null)
g.drawImage(image, 0,0, this);
}
}
NOTE : You can try this example here

3.50 Simulate a "mouse over" event to toggle an imageTag(s):


AWT
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0264.html
Use a special Canvas to preload 2 GIFs, and using a MouseListener simply toggle the image.
[JDK1.1]
import java.awt.*;
import java.awt.event.*;
import java.net.*;
public class ToggleGifCanvas extends Canvas
implements MouseListener {
Image img1, img2;
int
index = 0;
MediaTracker tracker;
public ToggleGifCanvas(URL n1, URL n2) {
tracker = new MediaTracker(this);
try {
img1 = Toolkit.getDefaultToolkit().getImage(n1);
img2 = Toolkit.getDefaultToolkit().getImage(n2);
tracker.addImage(img1,0);
tracker.addImage(img2,1);
tracker.waitForAll();
addMouseListener(this);
}
catch (Exception e) {
e.printStackTrace();
}
}
public void paint(Graphics g) {
if (img1 != null) {
if (index == 0) {
g.drawImage(img1,0,0,this);
index++;
}

3.50 Simulate a "mouse over" event to toggle an imageTag(s): AWT

else {
g.drawImage(img2,0,0,this);
index;
}
}
}
public Dimension getPreferredSize (){
return new Dimension
(img1.getHeight(this), img2.getWidth(this));
}
public void mouseClicked(MouseEvent e) {}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {
index = 1;
repaint();
}
public void mouseExited(MouseEvent e) {
index = 0;
repaint();
}
}

To use such Canvas, try something like this. This example needs our Gumby GIFs (
).

import java.applet.*;
import java.awt.*;
import java.net.*;
public class TestToogleGifCanvas extends Applet {
ToggleGifCanvas tgc;
public void init() {
try {
tgc = new ToggleGifCanvas
(new URL(getDocumentBase(),"images/gumby.gif"),
new URL(getDocumentBase(),"images/gumby2.gif"));
add(tgc);
}
catch (Exception e) {
e.printStackTrace();
}
}
}

Try it here.

3.50 Simulate a "mouse over" event to toggle an imageTag(s): AWT

and

3.51 Hide the mouse cursorTag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0440.html
One way is to use a transparent GIF as the cursor or create one.
int[] pixels = new int[16 * 16];
Image image = Toolkit.getDefaultToolkit().createImage(
new MemoryImageSource(16, 16, pixels, 0, 16));
Cursor transparentCursor =
Toolkit.getDefaultToolkit().createCustomCursor
(image, new Point(0, 0), "invisibleCursor");

3.52 Make a color transparentTag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0265.html
Here we have an Image with a blue background like

and we want to display it in an Applet with

a white background. All we have to do is to look for the blue color with the "Alpha bits" set to opaque
and make them transparent.
[Transparency.java]
import java.awt.*;
import java.awt.image.*;
public class Transparency {
public static Image makeColorTransparent
(Image im, final Color color) {
ImageFilter filter = new RGBImageFilter() {
// the color we are looking for... Alpha bits are set to opaque
public int markerRGB = color.getRGB() | 0xFF000000;
public final int filterRGB(int x, int y, int rgb) {
if ( ( rgb | 0xFF000000 ) == markerRGB ) {
// Mark the alpha bits as zero transparent
return 0x00FFFFFF &rgb;
}
else {
// nothing to do
return rgb;
}
}
};
ImageProducer ip = new FilteredImageSource(im.getSource(), filter);
return Toolkit.getDefaultToolkit().createImage(ip);
}

3.51 Hide the mouse cursorTag(s): AWT

[app.java]
import java.awt.image.*;
import java.awt.*;
import java.net.*;
public class app extends java.applet.Applet {
Image GifOriginalWithWithBlueBackground;
Image GifModifiedWithTransparentBackground;
public void init() {
setBackground(new Color(0).white);
MediaTracker media = new MediaTracker(this);
// image of our friend, Gumby with a blue background
GifOriginalWithWithBlueBackground =
getImage(getDocumentBase(),"gumbyblu.gif");
media.addImage(GifOriginalWithWithBlueBackground,0);
try {
media.waitForID(0);
GifModifiedWithTransparentBackground =
Transparency.makeColorTransparent
(GifOriginalWithWithBlueBackground, new Color(0).blue);
}
catch(InterruptedException e) {}
}
public void paint(Graphics g) {
g.drawImage(GifOriginalWithWithBlueBackground, 10,10,this);
g.drawImage(GifModifiedWithTransparentBackground,10, 80,this);
}
}

[x.html]
<HTML><HEAD></HEAD><BODY>
<APPLET CODE="app.class"
NAME="myApplet"
HEIGHT=200 WIDTH=200>
</APPLET>
</BODY></HTML>

3.53 Save an Image as a GIF or JPEG fileTag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0266.html
Take a look at the following package :
http://www.obrador.com/essentialjpeg/jpeg.htm for JPEG
3.53 Save an Image as a GIF or JPEG fileTag(s): AWT

http://www.acme.com for GIF


http://rsb.info.nih.gov/ij/ can display BMP and save as GIF or TIFF
With JDK1.2, Sun introduces a new package called JIMI (available for download at their Web site.
With this package, it's easy to convert a Java Image to a JPEG image file.
double w = 200.0;
double h = 200.0;
BufferedImage image = new BufferedImage(
(int)w,(int)h,BufferedImage.TYPE_INT_RGB);
Graphics2D g = (Graphics2D)image.getGraphics();
g.drawLine(0,0,w,h);
try {
File f = new File("myimage.jpg");
JimiRasterImage jrf = Jimi.createRasterImage(image.getSource());
Jimi.putImage("image/jpeg",jrf,new FileOutputStream(f));
}
catch (JimiException je) {
je.printStackTrace();}

Another way is to use the undocumented com.sun.image.codec.jpeg package.


// [JDK1.2]
// img is a Java Image
//
BufferedImage bimg = null;
int w = img.getWidth(null);
int h = img.getHeight(null);
int [] pixels = new int[w * h];
PixelGrabber pg = new PixelGrabber(img,0,0,w,h,pixels,0,w);
try {
pg.grabPixels();
}
catch(InterruptedException ie) {
ie.printStackTrace();
}
bimg = new BufferedImage(w,h,BufferedImage.TYPE_INT_RGB);
bimg.setRGB(0,0,w,h,pixels,0,w);
// Encode as a JPEG
FileOutputStream fos = new FileOutputStream("out.jpg");
JPEGImageEncoder jpeg = JPEGCodec.createJPEGEncoder(fos);
jpeg.encode(bimg);
fos.close();

Since JDK1.4.2, javax.imageio.ImageIO lets you save and restore Images to disk in a platform
independent format. "png" and "jpeg" format are supported. With ImageIO, instead of Image you
use BufferedImage which is a subclass of Image.
import java.io.*;
import javax.imageio.*;
import java.awt.image.*;
public class FileOperations {
public static BufferedImage readImageFromFile(File file)
throws IOException

3.53 Save an Image as a GIF or JPEG fileTag(s): AWT

{
return ImageIO.read(file);
}
public static void writeImageToJPG
(File file,BufferedImage bufferedImage)
throws IOException
{
ImageIO.write(bufferedImage,"jpg",file);
}
}

3.54 Use the same background color as the browserTag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0234.html
// in the HTML, use
//
PARAM NAME="bgColor" VALUE="B8B5AE"
//
(where VALUE is the same hexadecimal value
//
as the HTML COLOR value)
//
in the APPLET tag
// in the JAVA init method :
Color bgcolor = new Color(
Integer.valueOf(getParameter("BGCOLOR"), 16).intValue());
setBackground(bgcolor);

3.55 Do simple animation using ImagesTag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0262.html
By using a Thread, we switch between 2 GIFs (

import
import
import
import

and

java.applet.*;
java.awt.*;
java.awt.image.*;
java.net.*;

public class AnimationGifApplet extends Applet {


Image [] img;
int
index = 0;
int
maxImg;
MediaTracker tracker;

3.54 Use the same background color as the browserTag(s): AWT

public void init() {


img = new Image[2]; // 2 images in animation
maxImg = img.length 1;
tracker = new MediaTracker(this);
try {
// images loading
img[0] = getImage(new URL(getDocumentBase(), "images/gumby.gif"));
img[1] = getImage(new URL(getDocumentBase(), "images/gumby2.gif"));
tracker.addImage(img[0],0);
tracker.addImage(img[1],1);
tracker.waitForAll();
}
catch (Exception e) {
e.printStackTrace();
}
AnimationThread at = new AnimationThread();
at.delayedAnimation(this, 500);
at.start();
}
public void paint(Graphics g) {
if (img[0] != null) {
g.drawImage(img[index],0,0,this);
index = (index <maxImg) ? index + 1 : 0;
}
}
public void animate() {
repaint();
}
class AnimationThread extends Thread {
AnimationGifApplet animationApplet;
int delay;
public void delayedAnimation(AnimationGifApplet a, int delay) {
this.animationApplet = a;
this.delay = delay;
}
public void run() {
while (true) {
try {
sleep(delay);
animationApplet.animate();
}
catch (Exception e) {
e.printStackTrace();
}
}
}
}
}

Try it here.

3.54 Use the same background color as the browserTag(s): AWT

3.56 Do simple animation to show "work in progress"Tag(s):


AWT
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0263.html
Like the previous Howto, using a Thread, we switch between 2 GIFs, for example (
).
Click the button to simulate some work, click again to terminate the "work in progress"
[JDK1.1]
import
import
import
import
import

java.applet.*;
java.awt.*;
java.awt.image.*;
java.awt.event.*;
java.net.*;

public class AnimationProgress extends Applet


implements ActionListener{
Image [] img;
int
index = 0;
int
maxImg;
boolean working = false;
Button b;
MediaTracker tracker;
public void init() {
setLayout(new FlowLayout(FlowLayout.LEFT));
add(b = new Button("Working"));
b.addActionListener(this);
img = new Image[2]; // 2 images in animation
maxImg = img.length 1;
tracker = new MediaTracker(this);
try {
// images loading
img[0] = getImage(new URL(getDocumentBase(), "gumby.gif"));
img[1] = getImage(new URL(getDocumentBase(), "gumby2.gif"));
tracker.addImage(img[0],0);
tracker.addImage(img[1],1);
tracker.waitForAll();
}
catch (Exception e) {
e.printStackTrace();
}
AnimationThread at = new AnimationThread();
at.delayedAnimation(this, 500);
at.start();
}
public void paint(Graphics g) {
if (img[0] != null) {
if (working) {

3.56 Do simple animation to show "work in progress"Tag(s): AWT

and

g.drawImage(img[index],68,0,this);
index = (index <maxImg) ? index + 1 : 0;
}
}
}
public void animate() {
repaint();
}
public void actionPerformed(ActionEvent ae) {
working = !working;
}
class AnimationThread extends Thread {
AnimationProgress animationApplet;
int delay;
public void delayedAnimation(AnimationProgress a, int delay) {
this.animationApplet = a;
this.delay = delay;
}
public void run() {
while (true) {
try {
sleep(delay);
animationApplet.animate();
}
catch (Exception e) {
e.printStackTrace();
}
}
}
}
}

3.57 Get the color of a specific pixelTag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0257.html
We assume that we have an Image called picture
pixels = new int[width*height];
PixelGrabber pg =
new PixelGrabber(picture, 0, 0, width, height, pixels, 0, width);
try {
pg.grabPixels();
}
catch (InterruptedException e) { }

From here, individual pixel can be accessed via the pixels array.
3.57 Get the color of a specific pixelTag(s): AWT

int c = pixels[index]; // or pixels[x * width + y]


int red = (c &0x00ff0000) >> 16;
int green = (c &0x0000ff00) >> 8;
int blue = c &0x000000ff;
// and the Java Color is ...
Color color = new Color(red,green,blue);

Here another way to achieve this


import javax.imageio.ImageIO;
import java.awt.image.BufferedImage
...
BufferedImage image = ImageIO.read(urlImage);
int c = image.getRGB(x,y);
int red = (c &0x00ff0000) >> 16;
int green = (c &0x0000ff00) >> 8;
int blue = c &0x000000ff;
// and the Java Color is ...
Color color = new Color(red,green,blue);

3.58 Do "rubberband" drawingTag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0251.html
import java.applet.*;
import java.awt.*;
import java.util.Vector;
public class SimpleCAD extends Applet {
int w = 200;
int h = 200;
Vector lines = new Vector();
int np = 0;
int x1,y1;
int x2,y2;
int xl,yl;
Image offImg;
Graphics offGra;
Button btnClear, btnUndo;
public void init() {
setLayout(new FlowLayout());
btnClear = new Button("Clear");
btnUndo = new Button("Undo");
add(btnClear);
add(btnUndo);
setBackground(new Color(0).black);
setForeground(new Color(0).white);
}
public void Dragupdate(Graphics g) {

3.58 Do "rubberband" drawingTag(s): AWT

/*
** rubberband effect
*/
g.setXORMode(getBackground());
setForeground(new Color(0).blue);
if (xl != 1){
// erase the old line
g.drawLine(x1, y1, xl, yl);
if (x2 != 1) {
// draw the new one
g.drawLine(x1, y1, x2, y2);
}
}
}
public void update(Graphics g) {
// draw an offScreen drawing
Dimension dim = getSize();
if (offGra == null) {
offImg = createImage(dim.width, dim.height);
offGra = offImg.getGraphics();
}
offGra.setColor(new Color(0).black);
offGra.fillRect(0,0,dim.width, dim.height);
offGra.setColor(new Color(0).white);
offGra.setPaintMode();
for (int i=0; i < np; i++) {
Rectangle p = (Rectangle)lines.elementAt(i);
if (p.width != 1) {
offGra.drawLine(p.x, p.y, p.width, p.height);
}
}
// put the OffScreen image OnScreen
g.drawImage(offImg,0,0,null);
}
public boolean handleEvent(Event e) {
switch (e.id) {
case Event.MOUSE_DOWN:
// new starting point
x1 = e.x;
y1 = e.y;
// begin an new drawing process
x2 = 1;
return true;
case Event.MOUSE_UP:
// end a drawing process
lines.addElement(new Rectangle(x1, y1, e.x, e.y));
np++;
x2 = xl = 1;
repaint();
return true;
case Event.MOUSE_DRAG:
// xl yl line to be erased
xl = x2;
yl = y2;
// x2 y2 last current point
x2 = e.x;
y2 = e.y;
Dragupdate(getGraphics());
return true;
}
return super.handleEvent(e);

3.58 Do "rubberband" drawingTag(s): AWT

}
public boolean action(Event e, Object o) {
if (e.target == btnClear) resetDrawing();
if (e.target == btnUndo) undo();
return true;
}
public void undo() {
if (np>0) {
lines.removeElementAt(np1);
np;
repaint();
}
}
public void resetDrawing() {
lines.removeAllElements();
np=0;
repaint();
}
}

3.59 Convert RGB value to Hexadecimal (to be used in HTML for


example)Tag(s): AWT
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0255.html
import java.awt.*;
public class Color2Hex {
public static void main( String[] args ) {
if (args.length != 3) {
System.out.println("Color2Hex r g b");
}
else {
int i = Integer.parseInt(args[0]);
int j = Integer.parseInt(args[1]);
int k = Integer.parseInt(args[2]);
Color c = new Color(i,j,k);
System.out.println
( "hex: " + Integer.toHexString( c.getRGB() &0x00ffffff ) );
}
}
}

3.59 Convert RGB value to Hexadecimal (to be used in HTML for example)Tag(s): AWT

3.60 Draw a line or set a pixel in my own imageTag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0250.html
import java.awt.image.*;
import java.awt.*;
import java.applet.*;
public class CreateAnImage extends Applet {
Image myImage;
public void init() {
int x = 100;
int y = 100;
myImage = createImage(x,y);
Graphics g = myImage.getGraphics();
g.drawLine(0,0,x,y);
g.drawLine(x,0,0,y);
for(int i=0; i <x; i+=2){
setPixel(myImage, 50, i, new Color(0).blue);
setPixel(myImage, i, 50, new Color(0).green);
}
}
public void paint(Graphics g) {
g.drawImage(myImage,0,0,this);
}
public void setPixel
(Image image, int x, int y, Color color ) {
Graphics g = image.getGraphics( );
g.setColor( color );
g.fillRect( x, y, 1, 1 );
g.dispose( );
}
}

3.61 Draw a dashed lineTag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0224.html
public void drawDashedLine(Graphics g,int x1,int y1,int x2,int y2,
double dashlength, double spacelength) {
if((x1==x2){
g.drawLine(x1,y1,x2,y2);
return;
}
double linelength=Math.sqrt((x2x1)*(x2x1)+(y2y1)*(y2y1));
double yincrement=(y2y1)/(linelength/(dashlength+spacelength));
double xincdashspace=(x2x1)/(linelength/(dashlength+spacelength));
double yincdashspace=(y2y1)/(linelength/(dashlength+spacelength));

3.60 Draw a line or set a pixel in my own imageTag(s): AWT

double xincdash=(x2x1)/(linelength/(dashlength));
double yincdash=(y2y1)/(linelength/(dashlength));
int counter=0;
for (double i=0;i<linelengthdashlength;i+=dashlength+spacelength){
g.drawLine((int) (x1+xincdashspace*counter),
(int) (y1+yincdashspace*counter),
(int) (x1+xincdashspace*counter+xincdash),
(int) (y1+yincdashspace*counter+yincdash));
counter++;
}
if ((dashlength+spacelength)*counter<=linelength)
g.drawLine((int) (x1+xincdashspace*counter),
(int) (y1+yincdashspace*counter),
x2,y2);
}

3.62 Draw a line with a thicknessTag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0260.html
import java.awt.*;
import java.applet.*;
public class thickLine extends Applet {
public void init( ) { }
public void paint( Graphics g ) {
drawThickLine
(g, 0, 0, getSize().width, getSize().height, 5, new Color(0).black);
drawThickLine
(g, 0, getSize().height, getSize().width, 0, 5, new Color(0).red);
drawThickLine
(g, getSize().width/2, 0, getSize().width/2, getSize().height, 8,
new Color(0).green);
drawThickLine
(g, 0, getSize().height/2, getSize().width, getSize().height/2, 12,
new Color(0).blue);
}
public void drawThickLine(
Graphics g, int x1, int y1, int x2, int y2, int thickness, Color c) {
// The thick line is in fact a filled polygon
g.setColor(c);
int dX = x2 x1;
int dY = y2 y1;
// line length
double lineLength = Math.sqrt(dX * dX + dY * dY);
double scale = (double)(thickness) / (2 * lineLength);
// The x,y increments from an endpoint needed to create a rectangle...

3.62 Draw a line with a thicknessTag(s): AWT

double
double
ddx +=
ddy +=
int dx
int dy

ddx = scale * (double)dY;


ddy = scale * (double)dX;
(ddx > 0) ? 0.5 : 0.5;
(ddy > 0) ? 0.5 : 0.5;
= (int)ddx;
= (int)ddy;

// Now we can compute the corner points...


int xPoints[] = new int[4];
int yPoints[] = new int[4];
xPoints[0]
xPoints[1]
xPoints[2]
xPoints[3]

=
=
=
=

x1
x1
x2
x2

dx;
dx;
dx;
dx;

yPoints[0]
yPoints[1]
yPoints[2]
yPoints[3]

=
=
=
=

y1
y1
y2
y2

dy;
dy;
dy;
dy;

g.fillPolygon(xPoints, yPoints, 4);


}
}

Using JDK1.2
public void paint(Graphics g){
Graphics2D g2d = (Graphics2D)g;
int width = 10;
g2d.setStroke(new BasicStroke(width));
g2d.drawLine(x1, y1, x2, y2);
}

On a Component
int width = 10;
BasicStroke bs = new BasicStroke(width);
JLabel l = new JLabel();
l.getGraphics().setStroke(bs);
l.drawLine(0,0,100,100);

Using JDK1.3
import javax.swing.*;
import java.awt.*;
import java.awt.geom.*;
public class TestLine extends JFrame{
private MyPanel panel;
public TestLine() {
setSize(200, 200);
panel = new MyPanel();
getContentPane().add( panel, "Center" );
}
public static void main( String [] args ){
TestLine tl = new TestLine();
tl.setVisible( true );
}
}
class MyPanel extends JPanel {
final static BasicStroke stroke = new BasicStroke(2.0f);
final static BasicStroke wideStroke = new BasicStroke(8.0f);

3.62 Draw a line with a thicknessTag(s): AWT

public MyPanel(){}
public void paintComponent( Graphics g ){
Graphics2D g2 = (Graphics2D)g;
g2.setRenderingHint
(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2.setStroke( stroke );
g2.draw(new Line2D.Double(10.0, 10.0, 100.0, 10.0));
g2.setStroke( wideStroke );
g2.draw(new Line2D.Double(10.0, 50.0, 100.0, 50.0));
}
}

3.63 Draw a pie chartTag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0261.html
import java.util.*;
import java.awt.*;
import java.applet.Applet;
public class Graph extends Applet {
int
depth, radius;
public void init() {
float value;
String at = getParameter("width");
radius = (at != null) ? Integer.valueOf(at).intValue() : 100;
at = getParameter("depth");
depth = (at != null) ? Integer.valueOf(at).intValue() : 20;
at = getParameter("values");
PieChartCanvas c = new PieChartCanvas(radius, depth);
setLayout(new BorderLayout());
// Create Hashtable to map color name (String) to Color type
Hashtable colors = new Hashtable();
colors.put("green", Color.green);
colors.put("red", Color.red);
colors.put("blue", Color.blue);
colors.put("yellow", Color.yellow);
colors.put("magenta", Color.magenta);
colors.put("cyan", Color.cyan);
colors.put("orange", Color.orange);
colors.put("pink", Color.pink);
colors.put("white", Color.white);
colors.put("black", Color.black);
// "valuecolor,valuecolor,..."
StringTokenizer t = new StringTokenizer(at, ",");
String s;
int i;
while (t.hasMoreTokens()) {

3.63 Draw a pie chartTag(s): AWT

s = t.nextToken();
i = s.indexOf('');
value = Float.valueOf(s.substring(0, i)).floatValue();
c.addSlice(value, (Color)colors.get(s.substring(i + 1)));
}
resize(c.getMinimumSize().width, c.getMinimumSize().height);
add("Center", c);
}
}
class PieChartCanvas extends Canvas {
/*
** author
Ciaran Treanor [email protected]
*/
final double aspectFudge = 2.5;
int radius, depth, called = 1, numSlices = 0;
float total = 0, value[] = new float[10];
Color color[] = new Color[10];
Graphics offGraphics;
Image gfxBuff;
public PieChartCanvas(int radius, int depth) {
this.value = value;
this.color = color;
this.radius = radius;
this.depth = depth;
}
public void paint(Graphics g) {
int startAngle;
float angle;
Dimension d = getSize();
if(gfxBuff == null) {
gfxBuff = createImage(d.width, d.height);
offGraphics = gfxBuff.getGraphics();
offGraphics.setColor(getBackground());
offGraphics.fillRect(0, 0, d.width, d.height);
}
// do the 3d effect
for(int x = depth; x >= 1; x) {
startAngle = 45;
for(int i = 0; i < numSlices; i++) {
offGraphics.setColor(color[i].darker());
angle = Math.round(360 * (value[i] / total));
offGraphics.fillArc(0, x, radius, (int)(radius / aspectFudge),
startAngle, (int)angle);
startAngle += angle;
}
}
// draw the pie slice
startAngle = 45;
for(int i = 0; i < numSlices; i++) {
offGraphics.setColor(color[i]);
angle = Math.round(360 * (value[i] / total));
offGraphics.fillArc(0, 0, radius, (int)(radius / aspectFudge),
startAngle, (int)angle);
startAngle += angle;
}
g.drawImage(gfxBuff, 0, 0, null);

3.63 Draw a pie chartTag(s): AWT

}
public void addSlice(float value, Color color) {
this.value[numSlices] = value;
this.color[numSlices++] = color;
total += value;
}
public Dimension getPreferredSize() {
return getMinimumSize();
}
public Dimension getMinimumSize() {
return new Dimension(radius, (int)((radius / aspectFudge) + depth));
}
}

[JavaPie.hmtl]
<HTML>
<TABLE><TR><TD>
<APPLET CODE=Graph.class WIDTH=150 HEIGHT=150>
<PARAM NAME="depth" VALUE="30">
<PARAM NAME="width" VALUE="120">
<PARAM NAME="values" VALUE="1red,5green,7blue">
</APPLET>
<TD>
<TABLE>
<TR><TD>item 1<TD BGCOLOR="#FF0000">
<TR><TD>item 2<TD BGCOLOR="#008000">
<TR><TD>item 3<TD BGCOLOR="#0000FF">
</TABLE>
</TABLE>
</HMTL>
Try it here

3.64 Draw faster rectanglesTag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0364.html
Thanks to Chikirev Sergey

It seems that drawRoundRect(.) 1,5 faster then drawRect(..) , because one of them is
completely native.
import java.awt.*;
import java.awt.event.*;
public class Class1 extends Frame implements ActionListener{
public void paint(Graphics g){
super.paint(g);

3.64 Draw faster rectanglesTag(s): AWT

long t=System.currentTimeMillis();
for(int i=0;i<10000;i++){
g.drawRect(10,70,100,50);
}
t=System.currentTimeMillis()t;
g.drawString(String.valueOf(t),10,70);
t=System.currentTimeMillis();
for(int i=0;i<10000;i++){
g.drawRoundRect(10,130,100,50,0,0);
}
t=System.currentTimeMillis()t;
g.drawString(String.valueOf(t),10,130);
}
public void actionPerformed(ActionEvent p1){
repaint(0,10,200,300);
}
public static void main (String[] args){
Class1 c=new Class1();
c.setSize(300,300);
c.setLayout(new BorderLayout());
Button b=new Button("Refresh");
c.add(BorderLayout.SOUTH , b);
b.addActionListener(c);
c.show();
}
}

3.65 Get a screen capture and save it as a JPEGTag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0489.html
The screen capture is done with java.awt.Robot.
import
import
import
import
import
import
import

java.awt.AWTException;
java.awt.Robot;
java.awt.Rectangle;
java.awt.Toolkit;
java.awt.image.BufferedImage;
java.io.*;
javax.imageio.ImageIO;

class ScreenCapture {
public static void main(String args[]) throws
AWTException, IOException {
// capture the whole screen
BufferedImage screencapture = new Robot().createScreenCapture(
new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()) );
// Save as JPEG
File file = new File("screencapture.jpg");
ImageIO.write(screencapture, "jpg", file);

3.65 Get a screen capture and save it as a JPEGTag(s): AWT

// Save as PNG
// File file = new File("screencapture.png");
// ImageIO.write(screencapture, "png", file);
}
}

To capture a specific area


BufferedImage screencapture = new Robot().createScreenCapture(
new Rectangle( 15, 15, 150, 150));

To capture a specific visual object


BufferedImage image = new Robot().createScreenCapture(
new Rectangle( myframe.getX(), myframe.getY(),
myframe.getWidth(), myframe.getHeight() ) );

3.66 Detect a double click vs simple clickTag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0235.html
[JDK1.02]
import java.applet.*;
import java.awt.*;
public class d extends Applet {
int dClkRes = 300;
// doubleclick speed in ms
long timeMouseDown=0; // last mouse down time
int lastX=0,lastY=0; // last x and y
public boolean mouseDown(Event event, int x, int y){
/*
** check for double click
*/
long currentTime = event.when;
if ((lastX==x) &(lastY==y) &
((event.whentimeMouseDown) < dClkRes)) {
System.out.println("double click " + currentTime);
return false;
}
else {
//single click action could be added here
System.out.println("simple click " + currentTime);
timeMouseDown = event.when;
lastX=x;
lastY=y;
}
return true;
}

3.66 Detect a double click vs simple clickTag(s): AWT

[JDK11]
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class d extends Applet
implements MouseListener {
public void init() {
this.addMouseListener(this);
}
public void paint(Graphics g) {
g.drawString("Click here", 10,10);
}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mouseClicked(MouseEvent e) {
System.out.println
( "Click at (" + e.getX() + ":" + e.getY() + ")" );
if (e.getClickCount() == 2)
System.out.println( " and it's a double click!");
else
System.out.println( " and it's a simple click!");
}
}

3.67 Detect the mouse button used when clickingTag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0236.html
[JDK11]
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class d extends Applet
implements MouseListener {
public void init() {
this.addMouseListener(this);
}
public void paint(Graphics g) {
g.drawString("Click here", 10,10);

3.67 Detect the mouse button used when clickingTag(s): AWT

}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mouseClicked(MouseEvent e) {
switch(e.getModifiers()) {
case InputEvent.BUTTON1_MASK: {
System.out.println("That's the LEFT button");
break;
}
case InputEvent.BUTTON2_MASK: {
System.out.println("That's the MIDDLE button");
break;
}
case InputEvent.BUTTON3_MASK: {
System.out.println("That's the RIGHT button");
break;
}
}
}
}

3.68 Exit an application from a menuTag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0276.html
import java.awt.*;
import java.awt.event.*;
public class ExitFromMenu extends Frame implements ActionListener {
Menu m = new Menu("Exit From Here");
ExitFromMenu() {
super("");
MenuBar mb = new MenuBar();
mb.add(m);
MenuItem m1 = m.add(new MenuItem("Exit",
new MenuShortcut(KeyEvent.VK_X)));
m1.setActionCommand("Exit");
m.addActionListener(this);
setMenuBar(mb);
addWindowListener
(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
// unique exit point
System.out.println("Bye.");
System.exit(0);
}

3.68 Exit an application from a menuTag(s): AWT

}
);
add(new Label
("You can quit by clicking on the 'X'"),"South");
add(new Label
("You can quit by clicking on the menu item 'Exit'"),"Center");
add(new Label
("You can quit with the MenuShortcut 'ctrlx'"),"North");
setSize(300, 300);
show();
}
public void actionPerformed(ActionEvent evt) {
String what = evt.getActionCommand();
if (what.equals("Exit"))
processEvent(new WindowEvent(this, WindowEvent.WINDOW_CLOSING));
}
static public void main(String[] args) {
new ExitFromMenu();
}
}

3.69 Trigger a click on a ButtonTag(s): AWT Swing


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0468.html
In this example, when we click on a Button, we trigger the action attached to the another Button.
Regular AWT (applet)
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
public class TestEvent extends Applet implements ActionListener {
Button b2, b1;
TextField t1;
public void init() {
setLayout(new FlowLayout());
t1 = new TextField(30);
b1 = new Button("Output");
add(b1); add(t1);
b2 = new Button("Fire event 1st button");
add(b2);
b1.addActionListener(this);
b2.addActionListener(this);
}

3.69 Trigger a click on a ButtonTag(s): AWT Swing

public void actionPerformed(ActionEvent e) {


if (e.getSource() == b1) {
t1.setText("1st button clicked");
}
if (e.getSource() == b2) {
// from the b2 button, we creating an event to trigger a click
// on the b1 button
ActionEvent ae =
new ActionEvent((Object)b1, ActionEvent.ACTION_PERFORMED, "");
Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(ae);
// b1.dispatchEvent(ae); can be used too.
}
}
}

With Swing (japplet)


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class TestEventSwing extends JApplet implements ActionListener {
JButton b1, b2;
JTextField t1;
public void init() {
setLayout(new FlowLayout());
t1 = new JTextField(30);
b1 = new JButton("Output");
add(b1); add(t1);
b2 = new JButton("Fire event 1st button");
add(b2);
b1.addActionListener(this);
b2.addActionListener(this);
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() == b1) {
t1.setText("first button clicked");
}
if (e.getSource() == b2) {
// from the b2 button, we trigger a click on the b1 button.
// As an added bonus, we have visual effect on b1!
b1.doClick();
}
}
}

3.70 Display a TIFTag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0605.html

3.70 Display a TIFTag(s): AWT

The regular JDK can only deal with JPG, GIF, BMP or PNG file with the package ImageIO, see this
HowTo.
To deal with TIF file, you must use the JAI (Java Advanced Imaging) package.
This example will display a given TIF file. It will also display other types (JPG,...) by detecting the
type.
import
import
import
import
import
import
import
import
import
import

javax.media.jai.PlanarImage;
com.sun.media.jai.codec.ByteArraySeekableStream;
com.sun.media.jai.codec.ImageCodec;
com.sun.media.jai.codec.ImageDecoder;
com.sun.media.jai.codec.SeekableStream;
java.io.FileInputStream;
java.nio.ByteBuffer;
java.nio.channels.FileChannel;
java.awt.Image;
java.awt.image.RenderedImage;

import javax.swing.JOptionPane;
import javax.swing.JLabel;
import javax.swing.ImageIcon;
public class ImageViewer

static Image load(byte[] data) throws Exception{


Image image = null;
SeekableStream stream = new ByteArraySeekableStream(data);
String[] names = ImageCodec.getDecoderNames(stream);
ImageDecoder dec =
ImageCodec.createImageDecoder(names[0], stream, null);
RenderedImage im = dec.decodeAsRenderedImage();
image = PlanarImage.wrapRenderedImage(im).getAsBufferedImage();
return image;
}
public static void main(String[] args) throws Exception{
String path;
if (args.length==0) {
path = JOptionPane.showInputDialog(null, "Image Path",
"c:/applications/sidebar.tif");
}
else {
path = args[0];
}
FileInputStream in = new FileInputStream(path);
FileChannel channel = in.getChannel();
ByteBuffer buffer = ByteBuffer.allocate((int)channel.size());
channel.read(buffer);
Image image = load(buffer.array());
// make sure that the image is not too big
// scale with a width of 500
Image imageScaled =
image.getScaledInstance(500, 1, Image.SCALE_SMOOTH);
//
System.out.println("image: " + path + "\n" + image);
//
JOptionPane.showMessageDialog(null, new JLabel(
new ImageIcon( imageScaled )) );
}
}

3.70 Display a TIFTag(s): AWT

The JAI package is composed of 2 jars : jai_core.jar and jai_codec.jar


http://java.sun.com/javase/technologies/desktop/media/jai/
https://jai.dev.java.net/#Downloads
To write a TIF file, see this HowTo

3.71 Convert a multipage TIF into singlepage TIFTag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0535.html
Tagged Image File Format (abbreviated TIFF) is a file format for mainly storing images, including
photographs and line art. TIFF was originally created as an attempt to get desktop scanner vendors
of the mid1980's to agree on a common scanned image file format, rather than have each
company promulgate its own proprietary format.
This HowTo takes a multipage TIF (from a FAX) and convert it into many singlepages TIF.
This is done with the JAI (Java Advance Image) package.
http://java.sun.com/products/javamedia/jai/index.jsp
>
import java.io.*;
import
import
import
import

com.sun.media.jai.codec.FileSeekableStream;
com.sun.media.jai.codec.ImageDecoder;
com.sun.media.jai.codec.ImageCodec;
com.sun.media.jai.codec.TIFFEncodeParam;

import
import
import
import

java.awt.image.RenderedImage;
javax.media.jai.RenderedOp;
javax.media.jai.JAI;
java.awt.image.renderable.ParameterBlock;

public class TestTiff {


public static void main(String[] args) throws IOException {
new TestTiff().doitJAI();
}
public void doitJAI() throws IOException {
FileSeekableStream ss = new FileSeekableStream("d:/multi.tif");
ImageDecoder dec = ImageCodec.createImageDecoder("tiff", ss, null);
int count = dec.getNumPages();
TIFFEncodeParam param = new TIFFEncodeParam();
param.setCompression(TIFFEncodeParam.COMPRESSION_GROUP4);
param.setLittleEndian(false); // Intel

3.71 Convert a multipage TIF into singlepage TIFTag(s): AWT

System.out.println("This TIF has " + count + " image(s)");


for (int i = 0; i < count; i++) {
RenderedImage page = dec.decodeAsRenderedImage(i);
File f = new File("d:/single_" + i + ".tif");
System.out.println("Saving " + f.getCanonicalPath());
ParameterBlock pb = new ParameterBlock();
pb.addSource(page);
pb.add(f.toString());
pb.add("tiff");
pb.add(param);
RenderedOp r = JAI.create("filestore",pb);
r.dispose();
}
}
}

This solution is working but JAI is a slow performer.


You may want to consider to use an external utility to do this kind on conversion. A nice one is
irfanview (win), a (free) multipurpose graphic utility.
http://www.irfanview.com/
To do a TIF conversion, use this command line :
C:\IrfanView\i_view32" d:\multi.tif /extract=(d:\,tif) /killmesoftly

irfanview is an amazing software when it comes to transform a graphic format to another one. You
can use it from a command line or from a GUI.
See also : Convert many singlepage TIF into one multipage TIF

3.72 Convert many singlepage TIF into one multipage TIF


Tag(s): AWT

Current version of this HowTo :


http://www.rgagnon.com/javadetails/../javadetails/javaconvertmanysingletifintoonemultiplepageti
This HowTo takes a list of singlepage TIF and convert them into one multipage TIF.
This is done with the JAI (Java Advance Image) package.
import
import
import
import
import

java.io.FileOutputStream;
java.io.OutputStream;
java.util.ArrayList;
java.util.List;
java.awt.image.BufferedImage;

import javax.media.jai.NullOpImage;
import javax.media.jai.OpImage;

3.72 Convert many singlepage TIF into one multipage TIF Tag(s): AWT

import javax.media.jai.PlanarImage;
import
import
import
import
import
import

com.sun.media.jai.codec.ImageEncoder;
com.sun.media.jai.codec.SeekableStream;
com.sun.media.jai.codec.FileSeekableStream;
com.sun.media.jai.codec.ImageDecoder;
com.sun.media.jai.codec.ImageCodec;
com.sun.media.jai.codec.TIFFEncodeParam;

public class TiffUtils {


public static void main(String[] args) throws Exception {
// 2 single page TIF to be in a multipage
String [] tifs = {
"C:/temp/test01.tif",
"C:/temp/test02.tif"
};
int numTifs = tifs.length; // 2 pages
BufferedImage image[] = new BufferedImage[numTifs];
for (int i = 0; i < numTifs; i++) {
SeekableStream ss = new FileSeekableStream(tifs[i]);
ImageDecoder decoder = ImageCodec.createImageDecoder("tiff", ss, null);
PlanarImage pi = new NullOpImage
(decoder.decodeAsRenderedImage(0),null,null,OpImage.OP_IO_BOUND);
image[i] = pi.getAsBufferedImage();
ss.close();
}
TIFFEncodeParam params = new TIFFEncodeParam();
params.setCompression(TIFFEncodeParam.COMPRESSION_DEFLATE);
OutputStream out = new FileOutputStream("C:/temp/multipage.tif");
ImageEncoder encoder = ImageCodec.createImageEncoder("tiff", out, params);
List <BufferedImage>list = new ArrayList<BufferedImage>(image.length);
for (int i = 1; i < image.length; i++) {
list.add(image[i]);
}
params.setExtraImages(list.iterator());
encoder.encode(image[0]);
out.close();
System.out.println("Done.");
}
}

See also : Convert a multipage TIF into singlepage TIF

3.73 Convert an Image to a BufferedImageTag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0601.html
import java.awt.*;

3.73 Convert an Image to a BufferedImageTag(s): AWT

import java.awt.image.*;
import javax.imageio.*;
import java.io.*;
public class ImageUtils {
public static BufferedImage imageToBufferedImage(Image im) {
BufferedImage bi = new BufferedImage
(im.getWidth(null),im.getHeight(null),BufferedImage.TYPE_INT_RGB);
Graphics bg = bi.getGraphics();
bg.drawImage(im, 0, 0, null);
bg.dispose();
return bi;
}
public static BufferedImage readImageFromFile(File file)
throws IOException
{
return ImageIO.read(file);
}
public static void writeImageToPNG
(File file,BufferedImage bufferedImage)
throws IOException
{
ImageIO.write(bufferedImage,"png",file);
}
public static void writeImageToJPG
(File file,BufferedImage bufferedImage)
throws IOException
{
ImageIO.write(bufferedImage,"jpg",file);
}
}

You need to do something to transform an Image to BufferedImage. But since BufferedImage


extends Image, so there isn't a backconversion, it's not needed.

3.74 Detect if a TIF is blank Tag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0631.html
import
import
import
import
import
import
import
import
import

javax.media.jai.PlanarImage;
com.sun.media.jai.codec.ByteArraySeekableStream;
com.sun.media.jai.codec.ImageCodec;
com.sun.media.jai.codec.ImageDecoder;
com.sun.media.jai.codec.SeekableStream;
java.io.FileInputStream;
java.nio.ByteBuffer;
java.nio.channels.FileChannel;
java.awt.Color;

3.74 Detect if a TIF is blank Tag(s): AWT

import
import
import
import
import

java.awt.Graphics;
java.awt.Image;
java.awt.image.PixelGrabber;
java.awt.image.BufferedImage;
java.awt.image.RenderedImage;

/**
* This utility loads a given TIF and try to detect if it's
* blank or not.
*
* We create inmemory image and then calculate the standard
* deviation of the color information. If a certain value is not
* reached then we assume that the image is mainly uniform and
* probably blank. The threshold value is an estimate. Depending
* the source of the TIF this value can be higher. For example,
* TIF from a FAX machine or a scanner can be dirty, with hair/dust presence,
* but with no content.
*
* jai_core.jar and jai_codec.jar are required.
* http://java.sun.com/products/javamedia/jai/index.jsp
*
* @author http://www.rgagnon.com/howto.html
*/
public class BlankDetection {
public static final int FAILURE = 2;
public static final int BLANK = 0;
public static final int NOTBLANK = 1;
// value where we can consider that this is a blank image
// can be much higher depending of the TIF source
// (ex. scanner or fax)
public static final int BLANK_THRESHOLD = 1000;
/**
* Creates an Image from a byte array
* @param data
* @return Image
* @throws Exception
*/
public static Image load(byte[] data) throws Exception {
Image image = null;
SeekableStream stream = new ByteArraySeekableStream(data);
String[] names = ImageCodec.getDecoderNames(stream);
ImageDecoder dec =
ImageCodec.createImageDecoder(names[0], stream, null);
RenderedImage im = dec.decodeAsRenderedImage();
image = PlanarImage.wrapRenderedImage(im).getAsBufferedImage();
// scaledown the image , maximum width : 500 px
// to preserve memory
Image imageScaled =
image.getScaledInstance(500, 1, Image.SCALE_SMOOTH);
return imageScaled;
}
/**
* Converts an Image to a BufferedImage
* @param im une Image
* @return BufferedImage
*/
public static BufferedImage imageToBufferedImage(Image im) {
BufferedImage bi = new BufferedImage
(im.getWidth(null),im.getHeight(null),BufferedImage.TYPE_INT_RGB);

3.74 Detect if a TIF is blank Tag(s): AWT

Graphics bg = bi.getGraphics();
bg.drawImage(im, 0, 0, null);
bg.dispose();
return bi;
}
/**
* Check if an Image is blank or not
* Computes the standard deviation based on the color information
* @param bi bufferedimage
* @return true it's blank
*/
public static boolean isBlank(BufferedImage bi) throws Exception {
long count = 0;
long total = 0;
double totalVariance = 0;
double stdDev = 0;
int height = bi.getHeight();
int width = bi.getWidth();
int[] pixels = new int[width * height];
PixelGrabber pg = new PixelGrabber
(bi, 0, 0, width, height, pixels, 0, width);
pg.grabPixels();
for (int j = 0; j < height; j++) {
for (int i = 0; i < width; i++) {
count++;
int pixel = pixels[j * width + i];
int red = (pixel >> 16) & 0xff;
int green = (pixel >> 8) & 0xff;
int blue = (pixel) & 0xff;
int pixelValue = new Color(red, green,blue,0).getRGB();
total += pixelValue;
double avg = total /count;
totalVariance += Math.pow(pixelValue avg, 2);
stdDev = Math.sqrt(totalVariance / count);
}
}
return (stdDev <BLANK_THRESHOLD);
}
/**
* Accept on the command line the path to a TIF file
*
* Returns an errorlevel based on the analysis
* 0 blank
* 1 not blank
* 2 IO error
*
* @param args path vers complet vers un PROPS
*/
public static void main(String[] args) {
try {
if (args.length==0) {
System.out.println("Missing parameter.");
System.exit(FAILURE);
}
String path = args[0];
FileInputStream in = new FileInputStream(path);
FileChannel channel = in.getChannel();
ByteBuffer buffer = ByteBuffer.allocate((int)channel.size());
channel.read(buffer);

3.74 Detect if a TIF is blank Tag(s): AWT

Image image = load(buffer.array());


BufferedImage bufferedImage = imageToBufferedImage(image);
boolean isBlank = BlankDetection.isBlank(bufferedImage);
System.exit( isBlank ? BLANK : NOTBLANK );
}
catch (Exception e) {
e.printStackTrace();
System.exit(FAILURE);
}
}
}

3.75 Convert TIF to PDFTag(s): AWT IO IO Open Source


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0645.html
This HowTo is based on the iText package. You need a recent version (ex. 2.*)
This a command line utility. You pass one or many tif files as argument and corresponding PDF are
produced. Multipage TIF are supported. TIF are resized to fit a letterpage dimension.
import java.io.FileOutputStream;
import
import
import
import
import
import
import
import

com.lowagie.text.Document;
com.lowagie.text.Image;
com.lowagie.text.PageSize;
com.lowagie.text.Rectangle;
com.lowagie.text.pdf.PdfContentByte;
com.lowagie.text.pdf.PdfWriter;
com.lowagie.text.pdf.RandomAccessFileOrArray;
com.lowagie.text.pdf.codec.TiffImage;

public class TiffToPDF {


public static void main(String[] args) {
if (args.length < 1) {
System.out
.println("Usage: Tiff2Pdf file1.tif [file2.tif ... fileN.tif]");
System.exit(1);
}
String tiff;
String pdf;
for (int i = 0; i < args.length; i++) {
tiff = args[i];
pdf = tiff.substring(0, tiff.lastIndexOf('.') + 1) + "pdf";
Document document = new Document(PageSize.LETTER, 0, 0, 0, 0);
try {
PdfWriter writer = PdfWriter.getInstance(document,
new FileOutputStream(pdf));
int pages = 0;
document.open();

3.75 Convert TIF to PDFTag(s): AWT IO IO Open Source

PdfContentByte cb = writer.getDirectContent();
RandomAccessFileOrArray ra = null;
int comps = 0;
try {
ra = new RandomAccessFileOrArray(tiff);
comps = TiffImage.getNumberOfPages(ra);
}
catch (Throwable e) {
System.out.println("Exception in " + tiff + " "
+ e.getMessage());
continue;
}
System.out.println("Processing: " + tiff);
for (int c = 0; c < comps; ++c) {
try {
Image img = TiffImage.getTiffImage(ra, c + 1);
if (img != null) {
System.out.println("page " + (c + 1));
img.scalePercent
(7200f / img.getDpiX(), 7200f / img.getDpiY());
document.setPageSize
(new Rectangle(img.getScaledWidth(), img.getScaledHeight()));
img.setAbsolutePosition(0, 0);
cb.addImage(img);
document.newPage();
++pages;
}
}
catch (Throwable e) {
System.out.println("Exception " + tiff + " page "
+ (c + 1) + " " + e.getMessage());
}
}
ra.close();
document.close();
}
catch (Throwable e) {
e.printStackTrace();
}
System.out.println("done");
}
}
}

3.76 Convert a TIF to a JPGTag(s): AWT


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/javaconverttiftojpg.html
You need the Java Advanced Imaging (JAI) API.
http://java.sun.com/javase/technologies/desktop/media/jai/
import java.io.File;

3.76 Convert a TIF to a JPGTag(s): AWT

import
import
import
import
import
import
import
import
import
import

java.io.FileOutputStream;
java.io.IOException;
java.awt.image.RenderedImage;
com.sun.image.codec.jpeg.JPEGCodec;
com.sun.image.codec.jpeg.JPEGImageEncoder;
com.sun.media.jai.codec.SeekableStream;
com.sun.media.jai.codec.FileSeekableStream;
com.sun.media.jai.codec.TIFFDecodeParam;
com.sun.media.jai.codec.ImageDecoder;
com.sun.media.jai.codec.ImageCodec;

public class TiffUtils {


public static void TiffToJpg(String tiff, String output)
throws IOException
{
File tiffFile = new File(tiff);
SeekableStream s = new FileSeekableStream(tiffFile);
TIFFDecodeParam param = null;
ImageDecoder dec = ImageCodec.createImageDecoder("tiff", s, param);
RenderedImage op = dec.decodeAsRenderedImage(0);
FileOutputStream fos = new FileOutputStream(output);
JPEGImageEncoder jpeg = JPEGCodec.createJPEGEncoder(fos);
jpeg.encode(op.getData());
fos.close();
}
public static void main(String[] args) throws Exception {
TiffUtils.TiffToJpg("c:/users/public/temp/test.tif",
"c:/users/public/temp/test.jpg");
}
}

Need some TIFFs for testing ? Just ask Google!

Written and compiled Ral Gagnon 2007 [email protected]


http://www.rgagnon.com

3.76 Convert a TIF to a JPGTag(s): AWT

4 Environment
4.1 javaenv

4.2 Read environment variables from an applicationTag(s):


Environment
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0150.html
NOTE: JDK1.5 or better provides a simpler way to achieve this, see this HowTo.
JDK up to 1.4
Start the JVM with the "D" switch to pass properties to the application and read them with the
System.getProperty() method.
SET myvar=Hello world
SET myothervar=nothing
java Dmyvar="%myvar%" Dmyothervar="%myothervar%" myClass

then in myClass
String myvar = System.getProperty("myvar");
String myothervar = System.getProperty("myothervar");

If you don't know in advance, the name of the variable to be passed to the JVM, then there is no
100% Java way to retrieve them.
One approach (not the easiest one), is to use a JNI call to fetch the variables, see this HowTo.
A more lowtech way, is to launch the appropriate call to the operating system and capture the
output. The following snippet puts all environment variables in a Properties class and display the
value the TEMP variable.
import java.io.*;
import java.util.*;
public class ReadEnv {
public static Properties getEnvVars() throws Throwable {
Process p = null;
Properties envVars = new Properties();
Runtime r = Runtime.getRuntime();
String OS = System.getProperty("os.name").toLowerCase();
// System.out.println(OS);
if (OS.indexOf("windows 9") > 1) {
p = r.exec( "command.com /c set" );
}
else if ( (OS.indexOf("nt") > 1)
|| (OS.indexOf("windows 2000") > 1 )
|| (OS.indexOf("windows xp") > 1) ) {
// thanks to JuanFran for the xp fix!
p = r.exec( "cmd.exe /c set" );
}

4 Environment

else {
// our last hope, we assume Unix (thanks to H. Ware for the fix)
p = r.exec( "env" );
}
BufferedReader br = new BufferedReader
( new InputStreamReader( p.getInputStream() ) );
String line;
while( (line = br.readLine()) != null ) {
int idx = line.indexOf( '=' );
String key = line.substring( 0, idx );
String value = line.substring( idx+1 );
envVars.setProperty( key, value );
// System.out.println( key + " = " + value );
}
return envVars;
}
public static void main(String args[]) {
try {
Properties p = ReadEnv.getEnvVars();
System.out.println("the current value of TEMP is : " +
p.getProperty("TEMP"));
}
catch (Throwable e) {
e.printStackTrace();
}
}
}
thanks to w.rijnders for the w2k fix.

An update from Van Ly :


I found that, on Windows 2003 server, the property value for "os.name" is actually "windows 2003."
So either that has to be added to the bunch of tests or just relax the comparison strings a bit:
else if ( (OS.indexOf("nt") > 1)
|| (OS.indexOf("windows 2000") > 1 )
|| (OS.indexOf("windows 2003") > 1 )

// ok
// but specific to 2003

|| (OS.indexOf("windows xp") > 1) ) {

else if ( (OS.indexOf("nt") > 1)


|| (OS.indexOf("windows 20") > 1 )

// better,
// since no other OS would
// return "windows"
|| (OS.indexOf("windows xp") > 1) ) {

I started with "windows 200" but thought "what the hell" and made it "windows 20" to lengthen its
longivity. You could push it further and use "windows 2," I suppose. The only thing to watch out for
is to not overlap with "windows 9."
On Windows, preJDK 1.2 JVM has trouble reading the Output stream directly from the SET
command, it never returns. Here 2 ways to bypass this behaviour.
First, instead of calling directly the SET command, we use a BAT file, after the SET command we
print a known string. Then, in Java, when we read this known string, we exit from loop.
4 Environment

[env.bat]
@set
@echo **end

[java]
...
if (OS.indexOf("windows") > 1) {
p = r.exec( "env.bat" );
}
...
while( (line = br.readLine()) != null ) {
if (line.indexOf("**end")>1) break;
int idx = line.indexOf( '=' );
String key = line.substring( 0, idx );
String value = line.substring( idx+1 );
hash.put( key, value );
System.out.println( key + " = " + value );
}

The other solution is to send the result of the SET command to file and then read the file from Java.
...
if (OS.indexOf("windows 9") > 1) {
p = r.exec( "command.com /c set > envvar.txt" );
}
else if ( (OS.indexOf("nt") > 1)
|| (OS.indexOf("windows 2000") > 1
|| (OS.indexOf("windows xp") > 1) ) {
// thanks to JuanFran for the xp fix!
p = r.exec( "cmd.exe /c set > envvar.txt" );
}
...
// then read back the file as a Proprties
Properties p = new Properties();
p.load(new FileInputStream("envvar.txt"));
Thanks to JP Daviau

// UNIX
public Properties getEnvironment() throws java.io.IOException {
Properties env = new Properties();
env.load(Runtime.getRuntime().exec("env").getInputStream());
return env;
}
Properties env = getEnvironment();
String myEnvVar = env.get("MYENV_VAR");

To read only one variable :


// NT version , adaptation for other OS is left as an exercise...
Process p = Runtime.getRuntime().exec("cmd.exe /c echo %MYVAR%");
BufferedReader br = new BufferedReader
( new InputStreamReader( p.getInputStream() ) );
String myvar = br.readLine();
System.out.println(myvar);

4 Environment

Java's System properties contains some useful informations about the environment, for example,
the TEMP and PATH environment variables (on Windows).
public class ShowSome {
public static void main(String args[]){
System.out.println("TEMP : "
+ System.getProperty("java.io.tmpdir"));
System.out.println("PATH : "
+ System.getProperty("java.library.path"));
System.out.println("CLASSPATH : "
+ System.getProperty("java.class.path"));
System.out.println("SYSTEM DIR : " +
System.getProperty("user.home")); // ex. c:\windows on Win9x
System.out.println("CURRENT DIR: "
+ System.getProperty("user.dir"));
}
}

Here some tips from H. Ware about the PATH on different OS.
PATH is not quite the same as library path. In unixes, they are completely differentthe libraries
typically have their own directories.
System.out.println("the current value of PATH is:
p.getProperty("PATH")+"}");

{" +

System.out.println("LIBPATH: {" +
System.getProperty("java.library.path")+"}");

gives
the current value of PATH is:
{/home/hware/bin:/usr/local/bin:/usr/xpg4/bin:/opt/SUNWspro/bin:
/usr/ucb:/bin:/usr/bin:/home/hware/linuxbin:/usr/openwin/bin/:
/usr/local/games:/usr/ccs/lib/:/usr/new:/usr/sbin/:/sbin/:
/usr/openwin/lib:/usr/X11/bin:/usr/bin/X11/:/usr/local/bin/X11:
/usr/bin/pbmplus:/usr/etc/:/usr/dt/bin/:/usr/lib:
/usr/lib/nis:/usr/share/bin:/usr/share/bin/X11:
/home/hware/work/cdk/main/cdk/../bin:.}
LIBPATH:
{/usr/lib/j2re1.3/lib/i386:/usr/lib/j2re1.3/lib/i386/native_threads:
/usr/lib/j2re1.3/lib/i386/client:/usr/lib/j2sdk1.3/lib/i386:/usr/lib:/lib}

on my linux workstation. (java added all those except /lib and /usr/lib). But these two lines aren't the
same on window either:
This system is windows nt
the current value of PATH is:
{d:\OrbixWeb3.2\bin;D:\jdk1.3\bin;c:\depot\cdk\main\cdk\bin;c:\depot\
cdk\main\cdk\..\bin;d:\OrbixWeb3.2\bin;D:\Program
Files\IBM\GSK\lib;H:\pvcs65\VM\win32\bin;c:\cygnus
\cygwinb20\Hi586cygwin32\bin;d:\cfn\bin;D:\orant\bin;
C:\WINNT\system32;C:\WINNT;
d:\Program Files\Symantec\pcAnywhere;
C:\Program Files\Executive Software\DiskeeperServer\;}
LIBPATH:
{D:\jdk1.3\bin;.;C:\WINNT\System32;C:\WINNT;D:\jdk1.3\bin;
c:\depot\cdk\main\cdk\bin;c:\depot\cdk\main\cdk\..\bin;

4 Environment

d:\OrbixWeb3.2\bin;D:\Program Files\IBM\GSK\lib;
H:\pvcs65\VM\win32\bin;c:\cygnus\cygwinb20\Hi586cygwin32\bin;d:\cfn\bin;
D:\orant\bin;C:\WINNT\system32;
C:\WINNT;C:\Program Files\Dell\OpenManage\ResolutionAssistant\Common\bin;
d:\Program Files\Symantec\pcAnywhere;
C:\Program Files\Executive Software\DiskeeperServer\;}

Java is prepending itself! That confused me and broke my exec from ant.
Belorussian translation

4.3 Retrieve environment variables (JDK1.5)Tag(s): Environment


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0466.html
JDK1.5
System.getenv() is back!
import java.util.*;
public class Test {
public static void main(String args[]) {
// just one
System.out.println("PATH = " + System.getenv("PATH"));
// all of them
Map env = System.getenv();
for (Iterator it=env.entrySet().iterator(); it.hasNext(); ) {
Map.Entry entry = (Map.Entry)it.next();
System.out.println(entry.getKey() + " = " + entry.getValue());
}
}
}

See also this HowTo.


See this Howto for common XP environment variables

4.4 Retrieve environment variable (JNI)Tag(s): Environment JNI


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0460.html
4.3 Retrieve environment variables (JDK1.5)Tag(s): Environment

For some odd reasons, the getenv() method was removed from the JDK. Rumors is that a
mechanism to retrieve an environment will be back in JDK1.5 (see this HowTo). But for now, you
can use D switch to retrieve named environment variable and pass them to the JVM (see this
HowTo) or use this JNI routine :
JNIEXPORT jstring JNICALL JavaHowTo_getenv
(JNIEnv *env, jclass c, jstring jname){
if ( jname == NULL ) {
return NULL ;
}
const char *name =
(*env)>GetStringUTFChars(env, jname, (jboolean *)NULL) ;
const char *value = getenv(name) ;
(*env)>ReleaseStringUTFChars(env, jname, name) ;
return value ? (*env)>NewStringUTF(env, value) : NULL ;
}

NOTE : This is fine if the environment variable contains only regular 7bit ASCII characters.
See also this HowTo.

4.5 Use a MAKE fileTag(s): Environment


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0158.html
# jMAKEFILE a MAKEFILE for JAVA development
#
(Microsoft nMAKE)
# nmake /f j.makefile.mak doc
#
to generate JAVADOC
.SUFFIXES: .class .java
JAVAHOME=c:\windev\jdk1.1.3
JAVAC= $(JAVAHOME)\bin\javac
PATH=$(JAVAHOME)\bin;$(PATH)
CLASSPATH=.;$(JAVAHOME)\lib\classes.zip;$(JSDKHOME)\lib\classes.zip
DEST=.
DOC=.
JAVA=$(JAVAHOME)\bin\java
JAVACFLAGS=deprecation
.SUFFIXES: .java .class
.java.class:
$(JAVAC) classpath $(CLASSPATH) $(JAVACFLAGS) $<
CLASSFILES

= GetImage.class \
myCanvas.class

SOURCEFILES = GetImage.java \
myCanvas.java

4.5 Use a MAKE fileTag(s): Environment

# begin JAR support


JARFILE= theJAR.jar
$(JARFILE): $(CLASSFILES) $(SOURCEFILES)
jar cfm0 $(JARFILE) <<manifest.tmp
$(DATAFILES)
Name: GetImage.class
JavaBean: False

$(CLASSFILES)

Name: myCanvas.class
JavaBean: True
<<
# end JAR support
all : $(JARFILE) $(CLASSFILES) doc
doc : $(CLASSFILES)
javadoc version author d $(DOC) $(SOURCEFILES)
install :
copy $CLASSESFILE $(DEST)
clean:
del $(CLASSFILES)

4.6 Detect the browser/JVM type (deprecated)Tag(s):


Environment DEPRECATED
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0160.html
This HowTo is obsolete. Check this one instead : Detect browser type from an Applet
One way is to instanciate a known browserspecific method and catch the Exception if not found
import java.applet.*;
public class BrowserDetector extends Applet {
public void init() {
if ( isNetscape() )
System.out.println("This browser is a Netscape Browser.");
if ( isMicrosoft() )
System.out.println("This browser is a Microsoft Browser.");
}
public static boolean isNetscape() {
try {
Class.forName("netscape.applet.MozillaAppletContext");
}
catch (ClassNotFoundException e) {
System.out.println("This browser is not a Netscape Browser.");
return false;
}
return true;

4.6 Detect the browser/JVM type (deprecated)Tag(s): Environment DEPRECATED

}
public static boolean isMicrosoft() {
try {
Class.forName("com.ms.applet.GenericAppletContext");
}
catch (ClassNotFoundException e) {
System.out.println("This browser is not a Microsoft Browser.");
return false;
}
return true;
}
}

Or by examining the string representation of the getAppletContext() method


String theBrowser = "APPLICATION";
String appletContext = getAppletContext().toString();
if (appletContext.startsWith("sun.applet.AppletViewer"))
theBrowser = "APPLETVIEWER";
else if (appletContext.startsWith("netscape.applet."))
theBrowser = "NETSCAPE";
else if (appletContext.startsWith("com.ms.applet."))
theBrowser = "MICROSOFT";
else if (appletContext.startsWith("sunw.hotjava.tags.TagAppletPanel"))
theBrowser = "HOTJAVA";
else if (appletContext.startsWith( "sun.plugin.navig.win32.AppletPlugin"))
theBrowser = "NETSCAPEPLUGIN";
else if (appletContext.startsWith( "sun.plugin.ocx.ActiveXApplet"))
theBrowser = "MICROSOFTPLUGIN;
else if (appletContext.startsWith
( "sun.plugin.viewer.context.IExplorerAppletContext")
theBrowser = "MICROSOFTPLUGINJRE1.4;

For an application, by looking at the string representation of the getDefaultToolkit() method, we


detect the JVM type
String theJVM = "";
String toolkit = Toolkit.getDefaultToolkit().toString();
if (theBrowser.equals("APPLICATION") {
if (toolkit.startsWith( "sun.awt.windows.WToolkit"))
theJVM = "JAVA";
else if (toolkit.startsWith( "com.ms.awt.WToolkit"))
theJVM = "JVIEW";
}

For example, our MyApplet.class exists in three versions. One is using Microsoftspecific classes,
the other is a JDK1.1 applet and finally a version for JDK102only browser. The idea is to put all the
required classes in an ARCHIVE file. By using a javascript entities, we decide which archive to use.
During layout time, the javascript entity is remplaced by the right archive name.
<HTML></HTML><HEAD>
<SCRIPT>
function isBrowser(b,v) {
browserOk = false;
versionOk = false;
browserOk = (navigator.appName.indexOf(b) != 1);
versionOk = (v <= parseInt(navigator.appVersion));
return browserOk &versionOk;
}

4.6 Detect the browser/JVM type (deprecated)Tag(s): Environment DEPRECATED

archiveToBeUsed = "java102.jar";
if (isBrowser("Microsoft", 4)) {
archiveToBeUsed = "ie4.jar";
}
else {
if isBrowser("Netscape", 4) {
archiveToBeUsed = "n4.jar";
}
}

</SCRIPT></HEAD><BODY>
<APPLET CODE ="MyApplet.class"
HEIGHT=100
WIDTH=400
ARCHIVE=}; >
</APPLET>
</BODY></HTML>
NOTE: You may need to use the document.write() method to generate the right APPLET tag instead of a the Javascript entity to be compatible
with Netscape and IE.

4.7 Fix the "Wrong magic number" error messageTag(s):


Environment
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0163.html
The "magic number" is represented by the first few bytes of a given file. It is used to identified the
file type.
For Java classes, the magic number is 0xCAFEBABE (you can verify this by viewing a class file
with hexadecimal editor or the DOS Debug utility). This is used by the browser JVM as a quick
check of whether the called file is really a Java class.
If the message is displayed and you are sure that you have uploaded a "real" class to web server
then it's probably because the FTP download has been done in TEXT mode instead of BINARY so
the resulting file on the server is corrupted.

4.7 Fix the "Wrong magic number" error messageTag(s): Environment

4.8 Use a precompiler " la C" with JavaTag(s): Environment


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0164.html

4.9 Open source packages


Check this list of what is available.
Also take a look at JEnable

4.10 Ant
For simple need, Ant can be used to do substitution in your sources.
We insert into the code a special tag to delimit code that need to be stripped by the Ant script. Let's
say we use //@STARTDEBUG@// and //@ENDDEBUG@//.
package com.rgagnon.howto;
import javax.swing.JFrame;
public class Example {
public static void main(String args[]){
JFrame f = new JFrame();
f.setSize(300,200);
f.setVisible(true);
f.setTitle("HowTo");
//@STARTDEBUG@//
f.setTitle(f.getTitle() + " DEBUG version");
//@ENDDEBUG@//
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}

If you execute this code, the JFrame title will have the word "DEBUG" appended to it.
The Ant script to remove the debugging code is :
<project default="buildme">
<target name="compileprod">
<copy todir="../out" includeEmptyDirs="false">
<filterchain>
<tokenfilter>
<replacestring from="//@STARTDEBUG@//" to="/*" />
<replacestring from="//@ENDDEBUG@//" to="*/" />
</tokenfilter>
</filterchain>
<fileset dir=".">
<include name="**/*.java" />
</fileset>
</copy>
<javac srcdir="../out" />
</target>

4.8 Use a precompiler " la C" with JavaTag(s): Environment

<target name="compiledebug">
<javac srcdir="." />
</target>

<target name="buildme" depends="compileprod" />


</project>

After running this script, the source (in the ..\out directory)
package com.rgagnon.howto;
import javax.swing.JFrame;
public class Example {
public static void main(String args[]){
JFrame f = new JFrame();
f.setSize(300,200);
f.setVisible(true);
f.setTitle("HowTo");
/*
f.setTitle(f.getTitle() + " DEBUG version");
*/
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}

4.11 Simple boolean flag


See this HowTo. This technique relies on the compiler optimization which remove code in the
bytecode generated because it will never be executed.

4.12 Determine what are the classes actually used in a Java


Applet or applicationTag(s): Environment
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0165.html
In Netscape
1. Open the Java console
2. Press "9" to set the Debug level
3. Execute your applet.
4. Check the console and take note of the loaded classes.
In application
java verbose:class MyApp

4.11 Simple boolean flag

NOTE: This can be useful if you want to trim a JAR to include only classes actually used.

4.13 Set the memory available to the JVMTag(s): Environment


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0131.html
If your program allocates a lot of memory, you may need to increase this value to give more room to
the garbage collector.
When starting the JVM, two parameters can be adjusted to suit your memory needs :
Xms<size> specifies the initial Java heap size and
Xmx<size> the maximum Java heap size.
To set the minimum at 64Mb and the maximum at 256Mb
java Xms64m Xmx256m ...

The default value for the minimum is 2Mb, for the maximum it's 64Mb.

4.14 Generate the Javadoc "en franais"Tag(s):


Environment Environment Internationalization
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0437.html
The javadoc utility uses the regular Java mechanism to internationalize its output. The tools.jar in
the lib directory contains the resource bundle standard.properties used by Javadoc to generated the
labels. To add a new language, you need to create the appropriate resource bundle, in our case for
french, we need a file called standard_fr.properties.
The new file must be in the package com.sun.tools.doclets.standard.resources.
Extract from tools.jar, the standard.properties files (keep the directory structure). Copy it under the
name standard_fr.properties. Translate it (or you can download my "incomplete" version here).
[standard.properties (extract)]
doclet.Window_Split_Index={0}\: {1}Index

4.13 Set the memory available to the JVMTag(s): Environment

doclet.Packages=Packages
doclet.SerialData=Serial Data\:
doclet.Since=Since\:
doclet.Warn_inline_taglet=Inline tag {0} should only be used with a {1}.
doclet.ClassUse_Subinterface=Subinterfaces of {0} in {1}
doclet.Frame_Version=Frame version
doclet.Generated_Docs_Untitled=Generated Documentation (Untitled)

[standard_fr.properties (extract)]
doclet.Window_Split_Index={0}\: {1}Index
doclet.Packages=Paquetages
doclet.SerialData=Donn\u00E9e s\u00E9rialis\u00E9e\:
doclet.Since=Depuis\:
doclet.Warn_inline_taglet=Inline tag {0} should only be used with a {1}.
doclet.ClassUse_Subinterface=Sousinterfaces de {0} dans {1}
doclet.Frame_Version=Version avec cadres
doclet.Generated_Docs_Untitled=Documentation g\u00E9n\u00E9r\u00E9e

Once everything translated, put your standard_fr.properties into the tools.jar making sure that the
file is located in the right package (along standard.properties in
com.sun.tools.doclets.standard.resources).
To generate in french, use the locale switch on the command line
javadoc locale fr ....

NOTE : Make sure the locale switch is the first one.


Using Ant,
<javadoc
locale="fr"
sourcefiles="c:/client/Client.java"
destdir="javadoc/Client"
author="true"
version="true"
use="true"
private="true"
windowtitle="Client">
<doctitle><![CDATA[<h1>Client</h1>]]></doctitle>
<bottom><![CDATA[<i>Copyright &#169; 2003 Real's Howto.</i>]]></bottom>
</javadoc>

4.15 Use JDK1.5 new featuresTag(s): Environment


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0462.html
Download the JDK1.5 and install it.
From a shell, type
4.15 Use JDK1.5 new featuresTag(s): Environment

java version

The response should be something like


java version "1.5.0beta"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0betab32c)
JAVA HOTSPOT(TM) CLIENT VM (BUILD 1.5.0BETAB32C, MIXED MODE)

On Windows, if you have a "file not found" message, it's because the JVM can't be found
through the PATH. Do it again but with the complete path (if the path contains spaces, make
sure to use quotes!) :
"c:\program files\java\j2sdk1.5.0\bin\java" version

Let's do our first jdk1.5 program :


public class Test15 {
public static void main(String ... args) {
System.out.printf("Local time: %tT", java.util.Calendar.getInstance());
}
}

Compile it (again you may need to specify the complete path to the compiler if the PATH is
not set correctly):
"c:\program files\java\j2sdk1.5.0\bin\javac" source 1.5 Test15.java

Note the switch "source 1.5", if you don't specify it you won't be able to access the new
features (like System.out.printf()).
Run it
>"C:\Program Files\Java\j2sdk1.5.0\bin\java" Test15
Local time: 15:26:04

4.16 Check the class versionTag(s): Environment


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0544.html
The first 4 bytes are a magic number, 0xCAFEBABe, to identify a valid class file then the next 2
bytes identify the class format version (major and minor).
Possible major/minor value :
major
45
45
46
47
48
49
50

minor Java platform version


3
1.0
3
1.1
0
1.2
0
1.3
0
1.4
0
1.5
0
1.6

import java.io.*;

4.16 Check the class versionTag(s): Environment

public class ClassVersionChecker {


public static void main(String[] args) throws IOException {
for (int i = 0; i < args.length; i++)
checkClassVersion(args[i]);
}
private static void checkClassVersion(String filename)
throws IOException
{
DataInputStream in = new DataInputStream
(new FileInputStream(filename));
int magic = in.readInt();
if(magic != 0xcafebabe) {
System.out.println(filename + " is not a valid class!");;
}
int minor = in.readUnsignedShort();
int major = in.readUnsignedShort();
System.out.println(filename + ": " + major + " . " + minor);
in.close();
}
}
> java ClassVersionChecker ClassVersionChecker.class
ClassVersionChecker.class: 49 . 0

from The Java Virtual Machine Specification


magic
The magic item supplies the magic number identifying the class file format; it has the value
0xCAFEBABE.
minor_version, major_version
The values of the minor_version and major_version items are the minor and major version numbers
of this class file.Together, a major and a minor version number determine the version of the class
file format. If a class file has major version number M and minor version number m, we denote the
version of its class file format as M.m. Thus, class file format versions may be ordered
lexicographically, for example, 1.5 < 2.0 < 2.1.
A Java virtual machine implementation can support a class file format of version v if and only if v lies
in some contiguous range Mi.0 v Mj.m. Only Sun can specify what range of versions a Java virtual
machine implementation conforming to a certain release level of the Java platform may support.

4.17 Get the system properties or the JVM uptimeTag(s):


Environment
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0549.html

4.17 Get the system properties or the JVM uptimeTag(s): Environment

The RuntimeMXBean defines several convenient methods for accessing system properties about
the Java virtual machine.
[J2SE 1.5]
import java.util.Date;
import java.lang.management.RuntimeMXBean;
import java.lang.management.ManagementFactory;
class JMXTest {
public static void main(String args[]) {
JMXTest x = new JMXTest();
x.doit();
}
public void doit() {
try{
RuntimeMXBean mx = ManagementFactory.getRuntimeMXBean();
System.out.println("BOOTCLASSPATH:\n" + mx.getBootClassPath());
System.out.println("CLASSPATH:\n" + mx.getClassPath());
// the input arguments passed to the Java virtual machine
// which does not include the arguments to the main method.
System.out.println("COMMAND LINE ARGS:\n" + mx.getInputArguments());
// a map of names and values of all system properties.
System.out.println("SYSTEM PROPERTIES:\n" + mx.getSystemProperties());
System.out.println("VM start time : " + new Date(mx.getStartTime()));
System.out.println("VM up time : " + mx.getUptime() + " ms");
}
catch (Exception e) {
e.printStackTrace();
}
}
}

4.18 Detect if running in a 64bit JVMTag(s): Environment


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0565.html
public static boolean is64BitVM() {
String bits = System.getProperty("sun.arch.data.model", "?");
if (bits.equals("64") {
return true;
}
if (bits.equals("?") {
// probably sun.arch.data.model isn't available
// maybe not a Sun JVM?
// try with the vm.name property
return

4.18 Detect if running in a 64bit JVMTag(s): Environment

System.getProperty("java.vm.name")
.toLowerCase().indexOf("64") >= 0;
}
// probably 32bit
return false;
}
}

4.19 Set the default JVM typeTag(s): Environment


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0566.html
If you type, in a Shell
> java version

you get
java version "1.5.0"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0b64)
Java HotSpot(TM) Client VM (build 1.5.0b64, mixed mode, sharing)

The default JVM with a JIT (JustInTime compiler) for a "client" mode is used. The other available
mode is "server".
From the Hot Spot FAQ at http://java.sun.com/docs/hotspot/HotSpotFAQ.html#compiler_types.
What's the difference between the client and server systems?

These two systems are different binaries. They are essentially two different compilers
(JITs)interfacing to the same runtime system. The client system is optimal for applications which
need fast startup times or small footprints, the server system is optimal for applications where the
overall performance is most important. In general the client system is better suited for interactive
applications such as GUIs. Some of the other differences include the compilation policy,heap
defaults, and inlining policy.
Where do I get the server and client systems?
Client and server systems are both downloaded with the 32bit Solaris and Linux downloads. For
32bit Windows, if you download the JRE, you get only the client, you'll need to download the SDK
to get both systems.
For 64bit, only the server system is included. On Solaris, the 64bit JRE is an overlay on top of the
32bit distribution. However, on Linux and Windows, it's a completely separate distribution. The
default setting is defined the file jvm.cfg.
On Debian GNU/Linux with Sun Java 1.5.0, the file is in /etc/java1.5.0sun.
4.19 Set the default JVM typeTag(s): Environment

On Windows, it's in C:\Program Files\Java\jre1.5.0\lib\i386.


A content like
client KNOWN
server KNOWN

defines the client as the default.


server KNOWN
client KNOWN

sets the server as the default.

4.20 Select a particular JRE from the command lineTag(s):


Environment
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0634.html
It's possible to have many JRE sidebyside on a computer.
If the JRE is properly installed on Windows, informations about each version are stored in the
registry. The installation process installs a special java.exe in the system PATH. So you don't need
to alter you PATH because this special java.exe will find the current JRE. From a command line,
type java version to display the current jre version installed.
With release 1.6, it's now possible to select a different JRE installation than the last one without any
registry modification.
The JRE installation are listed in the registry in the key
HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment
Take this simple test class
public class ShowVersion {
public static void main(String args[]) {
System.out.println(System.getProperty("java.version"));
}
}

On a system, with 1.6 and 1.5 installed. If you type


> java ShowVersion

It's probably the 1.6 JRE that will be used since it's the last installed.

4.20 Select a particular JRE from the command lineTag(s): Environment

To force the 1.5 JRE instead, use this command line.


> java version:"1.5" ShowVersion

If the bytecode is incompatible with the given JRE then .. it won't work, of course.
ref : Java 6 technotes
You can always give the complete path to use a specific installation. Launching the JVM this way
does not use the registry setting at all.
>"C:\Program Files\Java\j2re1.4.1_02\bin\java" version
java version "1.4.1_02"

4.21 Get the PID (pure Java solution)Tag(s): Environment


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0651.html
This solution use the RuntimeMXBean. The name of the bean contains the pid (ex.
12345@localhost).
Warning : The returned name string can be any arbitrary string and a Java virtual machine
implementation can choose to embed platformspecific useful information in the returned name
string.
On the Sun JVM (Windows plateform), the PID is present.
public class SystemUtils {
private SystemUtils() {}
public static long getPID() {
String processName =
java.lang.management.ManagementFactory.getRuntimeMXBean().getName();
return Long.parseLong(processName.split("@")[0]);
}
public static void main(String[] args) {
String msg = "My PID is " + SystemUtils.getPID();
javax.swing.JOptionPane.showConfirmDialog((java.awt.Component)
null, msg, "SystemUtils", javax.swing.JOptionPane.DEFAULT_OPTION);
}
}

The result is

4.21 Get the PID (pure Java solution)Tag(s): Environment

For a JavaJNI solution, see this HowTo.

4.22 Get the PIDTag(s): Environment JNI


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0467.html
class JavaHowTo {
public native long getCurrentProcessId();
static {
System.loadLibrary("jni2");
}
}
public class JNIJavaHowTo {
public static void main(String[] args) {
JavaHowTo jht = new JavaHowTo();
System.out.println("Press Any key...");
java.io.BufferedReader input =
new java.io.BufferedReader(new java.io.InputStreamReader(System.in));
try { input.readLine();}
catch (Exception e) { e.printStackTrace();}
System.out.println(jht.getCurrentProcessId());
}
}
// jni2.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h"
#include <process.h>
#include "JavaHowTo.h"
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}

JNIEXPORT jlong JNICALL Java_JavaHowTo_getCurrentProcessId


(JNIEnv *, jobject) {
// return GetCurrentProcessId();
return getpid();
}

You can download the whole thing here.


For a Javaonly solution, see this HowTo

4.22 Get the PIDTag(s): Environment JNI

4.23 Set default value for java property (system wide)Tag(s):


Environment
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/javasetjavapropertiessystemwide.html
If you find yourself using the same options over and over before laucing a java process, you can set
up a special environment variable to contain your default options and the JVM will pick up the the
values.
If the Java process is launch via java.exe then the environment variable is called
_JAVA_OPTIONS,
e.g. In Windows:
set _JAVA_OPTIONS=Xms64m Xmx128m Dawt.useSystemAAFontSettings=lcd

In Linux:
export _JAVA_OPTIONS='Xms64m Xmx128m Dawt.useSystemAAFontSettings=lcd'

ref : http://java.sun.com/j2se/1.5.0/docs/guide/2d/flags.html
If the Java process is launch via javaw.exe (Applet) then the environment variable is called
_JPI_VM_OPTIONS.
For example :
_JPI_VM_OPTIONS = Dsome.property=true

For a Java Web Start process (javaws.exe), the environment variable is called
JAVAWS_VM_ARGS.
For example :
JAVAWS_VM_ARGS = Dsome.property=true
ref : http://docs.oracle.com/javase/7/docs/webnotes/tsg/TSGDesktop/html/plugin.html#gcexdd

4.23 Set default value for java property (system wide)Tag(s): Environment

4.24 Detect if running in a debug modeTag(s): Environment


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/javadetectifrunningindebugmode.html
If you want to detect if your program is running in debug mode (ex. Eclipse).
public class Test {
public static void main(String args[]) {
boolean isDebug =
java.lang.management.ManagementFactory.getRuntimeMXBean().
getInputArguments().toString().indexOf("agentlib:jdwp") > 0;
System.out.println("In debug : " + isDebug);
}
}

4.25 Capture the output of JAVACTag(s): Environment


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0147.html
method 1a : redirect to a file
// Win95 (?)
javac JDjavac.pipe.output=true myClass.java >output.txt
// WinNT (or better)
javac MyClass.java 2output.txt

method 1a : redirect to stdout with a pause after each screen full


// WinNT (or better)
javac MyClass.java 21 | MORE

method 2 : use JAVA to capture the output


//
//
//
//

[JDK 1.1]
to compile: java JC mySource.java
(use redirection to keep the output)
java JC mySource.java >output.txt

import java.io.*;
public class JC {
public static void main( String args[] )
throws IOException, InterruptedException {
String fn = "JC.java";
if( args.length > 0 ) fn = args[0];
System.out.println( "BEGIN (" + fn + ")" );
Process p =
Runtime.getRuntime().exec( "javac verbose " + fn );
String buf;
BufferedReader se = new BufferedReader

4.24 Detect if running in a debug modeTag(s): Environment

( new InputStreamReader( p.getErrorStream() ) );


while( (buf = se.readLine()) != null )
System.out.println( " : " + buf );
System.out.println( "END (rc:" + p.waitFor() + ")" );
}
}

or you can always use a small text editor like Textpad where you can write with Java code (with
syntax coloring), compile, capture compiler output and launch your Applet or Application directly
from the editor.

4.26 Freeze the JVIEW window in MS VJ++Tag(s): Environment


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0148.html
In your source, add the following line at the end :
java.io.DataInputStream in =
new java.io.DataInputStream(System.in);
String aLine = in.readLine();

and the JVIEW window won't close until you hit ENTER.
Or simply execute JVIEW directly in a DOS window with
jview <classname>
Check this Howto for a better way...

4.27 Wrap a Java beans in a COM objectTag(s): Environment


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0045.html
The previous Howto was using a Microsoft utility to enable access to Java objects from a
COMaware development tool. Sun provides a similar tool but you must package everything in a jar
file and use the Beans technology. The tool is called packager, written in Java, you execute it from
the sun.beans.ole package. The Java Plugin 1.2 and the JDK1.2 must be installed on the system
(for download, see Java Sun Web site).
Let's try it with this simple class :

4.26 Freeze the JVIEW window in MS VJ++Tag(s): Environment

package JavaCom;
public class JavaBeanSays {
private String _hello = "Hello World!";
public String getHello() {
return _hello ;
}
public void setHello(String s) {
_hello = s;
}
}
NOTE: This is not really a Bean but let's keep it simple!

The next step is to build a manifest file to identify the bean in the jar. Here it is (manifest.txt):
Name: JavaCom/JavaBeanSays
JavaBean: true
NOTE: If no manifest is present all classes in the jar are treated as beans.

The JavaBeanSays class is in the directory JavaCom, the manifest.txt is the directory under it. From
the directory under (the one containing manifest.txt), we built the jar with :
jar cfm javacom.jar manifest.txt javacom\JavaBeanSays.class
NOTE: You can download my JavaCom.jar if you to proceed more rapidly.

The next step is to run the packager. You run it from the JDK installation directory. If the JDK is
installed in c:\dev\java\jdk1.2.1\ for example , you go there. And you start the packager with
bin\java.exe cp jre\lib\rt.jar;jre\lib\jaws.jar sun.beans.ole.Packager

A wizard is started, you follow the 5 steps to create the "JavaBeans bridge for ActiveX" for the
JavabeanSays component.
The first step is to specify where is located the JavaCom.jar file. When selected, the wizard should
list the JavaCom.JavaBeanSays bean, press Next. The "ActiveX" name under which the beans will
be seen is shown, press Next (in VbScript, the beans suffix must be added to this name).
An output directory is needed, be careful because this directory name will be hardcoded in the
generated files (REG and TLB), you need to specify a valid directory name. The packager assume
that a subdirectory bin is present with the file beans.ocx in it. You can create it and then copy
beans.ocx from the JRE\bin into it or edit the REG file to specify the original JRE\bin and update the
registry with the good location.
The Bean is now registered and ready to be used as a COM object.
NOTE: There is a commandline interface available in the packager if you want to bypass the wizard.

To test it, try this VbScript (TestJavaBeansSays.vbs)


' VBSCRIPT connect to a Java Bean
Dim objJava
Set objJava = WScript.CreateObject("JavaBeanSays.Bean")

4.26 Freeze the JVIEW window in MS VJ++Tag(s): Environment

strFromJava = objJava.getHello
MsgBox strFromJava, _
0,
_
"JAVA BEAN OUTPUT"
objJava.setHello("Bonjour le monde!")
strFromJava = objJava.getHello
MsgBox strFromJava, _
0,
_
"JAVA BEAN OUTPUT"
NOTE: Check the JAVA PLUGIN SCRIPTING documentation (jdk1.2) or (jsdk1.4). document for more infos.

4.28 Know details about the JAVA at runtimeTag(s):


Environment
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0149.html
Applets can read certain system properties by invoking System.getProperty(String key)
java.version
java.vendor
java.vendor.url
os.name
os.arch
file.separator
path.separator
line.separator
java.class.version

Java version number


Java vendorspecific string
Java vendor URL
Operating system name
Operating system architecture
File separator (eg, "/")
Path separator (eg, ":")
Line separator
Java class version number

But applets are prevented from reading these system properties (for security reason):
java.home
java.class.path
user.name
user.home
user.dir

Java installation directory


Java classpath
User account name
User home directory
User's current working directory

To read a system property from within an applet, simply invoke System.getProperty(key) on the
property you are interested in.
String s = System.getProperty("java.vendor");

Here a dump that can be useful in a log file:


public String dump() {
StringBuffer sb = new StringBuffer();
Runtime rt = Runtime.getRuntime();

4.28 Know details about the JAVA at runtimeTag(s): Environment

long freeMemory = rt.freeMemory();


long totalMemory = rt.totalMemory();
sb.append("free memory=" + freeMemory); sb.append("\n");
sb.append("total memory=" + totalMemory); sb.append("\n");
java.util.Properties p = null;
try {
p = System.getProperties();
}
catch(Exception e) {
e.printStackTrace();
return "";
}
java.util.Enumeration en = p.propertyNames();
while (en.hasMoreElements()){
String s = (String) en.nextElement();
String strValue= p.getProperty(s);
sb.append(s + "=<" + strValue + ">"); sb.append("\n");
}
// result to a string
return sb.toString();
}

4.29 Detect the Microsoft JVM version installedTag(s):


Environment
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0327.html
class MSJVMversion
{
public static void main(String[] args)
{
String build;
build=com.ms.util.SystemVersionManager.getVMVersion().getProperty
("BuildIncrement");
System.out.println("Microsoft JVM installed is " + build);
}
}
NOTE:The above snippet will return the Microsoft VM version. This not the same thing as as the JDK version. In this case , Microsoft's Java
environment only goes up to 1.1.4 and there is no plan to upgrade it.

4.29 Detect the Microsoft JVM version installedTag(s): Environment

4.30 Run JAVA as a Windows serviceTag(s): Environment Open


Source
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0151.html
A solution adapted to Java, is YAJSW( Yet Another Java Service Wrapper ) (
http://yajsw.sourceforge.net/ ) (opensource).
The setup is very simple with one configuration file and your Java service can be notified when the
service is stopped.
If you log in and log out from a machine and a java service is running then the service may be
stopped. The fix is to use Java 1.3.1 or higher and start the process with the JVM switch Xrs
(Reduce Signals Xtendedswitch) to stop the Windows signal from killing the JVM.
For BEA JRockit, it's the Xnohup
Also, it's possible to the utility SRVANY.EXE, included with the NT resource Kit.
http://www.techeez.com/windows_tips/service_under_nt.htm
SVRANY is used to run any EXE as a windows service. In our situation, SVRANY will run the
specified JAVA.EXE with our class a parameter. But this solution presents many problems. For
exemple, if you kill the SVRANY.EXE process (stop the service) then the JAVA.EXE is not killed,
you need to do it manually.

4.31 Execute a class from Windows ExplorerTag(s):


Environment
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0328.html
This HowTo will you show how to start a class (with a main() method) without opening a DOS Shell
or using a JAR file directly from Windows Explorer.
Type the following VBScript using a text editor and save it as WRunJava.vbs.
You need to save the script in the SendTo subdirectory located in the Windows directory
On a Win98 system, it's C:\Windows\SendTo.
On XP, go to Documents and Settings folder then select the folder of a specific user, eg.
4.30 Run JAVA as a Windows serviceTag(s): Environment Open Source

c:\documents and settings\'user name'\SendTo.


NOTE The SendTo folder is hidden by default. If it is not visible, on the Tools menu, click Folder
Options. On the View tab, click Show hidden files and folders. SO you save the scripts shown
below, into the SendTo folder.
Then in Window Explorer, locate a class file that can be executed (with a main() method). Right
click on it, select the Send To menu and you should see an entry called WRunJava.vbs. Simply
select it and the class should be launched via javaw.exe .
' [WRunJava.vbs] start a java class without a console
Dim WSHShell, FSO, javaclass, javacompletepath, cmdline
Set WSHShell = WScript.CreateObject("WScript.Shell")
Set FSO = WScript.CreateObject("Scripting.FileSystemObject")
If WScript.Arguments.Count = 0 Then
WScript.Echo "no argument on the command line."
Else
javaclass = WScript.Arguments(0)
If fso.GetExtensionName(javaclass) = "class" Then
javacompletepath = fso.GetAbsolutePathName(javaclass)
javapath = fso.GetParentFolderName(javacompletepath)
javaclass = fso.GetBaseName(javaclass)
cmdline = "javaw.exe cp " &javapath &" " &javaclass
WSHShell.Run cmdline, 1, false
ElseIf fso.GetExtensionName(javaclass) = "jar" Then
javacompletepath = fso.GetAbsolutePathName(javaclass)
cmdline = javaclass
WSHShell.Run cmdline, 1, false
Else
WScript.Echo "Not a java class! (" &javaclass &")"
End if
End If
Set WSHShell = Nothing
Set FSO = Nothing
WScript.Quit(0)

You need a second script to launch a java class with a console (useful to see debugging traces or
textonly Java program). Called it CRunJava.vbs . Then you will have two choices from the
SendTo menu, one for consolebased program and one for GUIbased (Windows) program.
' [CRunJava.vbs] start a java class with a console
Dim WSHShell, FSO, javaclass, javacompletepath, cmdline
Set WSHShell = WScript.CreateObject("WScript.Shell")
Set FSO = WScript.CreateObject("Scripting.FileSystemObject")
If WScript.Arguments.Count = 0 Then
WScript.Echo "no argument on the command line."
Else
javaclass = WScript.Arguments(0)
If fso.GetExtensionName(javaclass) = "class" Then
javacompletepath = fso.GetAbsolutePathName(javaclass)
javapath = fso.GetParentFolderName(javacompletepath)
javaclass = fso.GetBaseName(javaclass)
' keep the console open

4.30 Run JAVA as a Windows serviceTag(s): Environment Open Source

cmdline = "cmd /k java.exe cp " &javapath &" " &javaclass


' close the console
' cmdline = "cmd /c java.exe cp " &javapath &" " &javaclass
WSHShell.Run cmdline, 1, false
ElseIf fso.GetExtensionName(javaclass) = "jar" Then
javacompletepath = fso.GetAbsolutePathName(javaclass)
cmdline = "java.exe jar " &javaclass
WSHShell.Run cmdline, 1, false
Else
WScript.Echo "Not a java class! (" &javaclass &")"
End if
End If
Set WSHShell = Nothing
Set FSO = Nothing
'WScript.Quit(0)

Note : A JAR can be made self executable (with double click), see this HowTo

4.32 Create an icon to launch java apps for Windows?Tag(s):


Environment
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0157.html
Let's say you have a class named myApp.class and it is located in the directory myJavaApp on
drive C:. Then create a Shortcut to the myApp.class. Next edit the properties of the Shortcut and
change the line
c:\myjavaapp\MyApp.class

to

javaw MyApp

In the properties tab panel, you also havethe possibility to assign an icon to the Shortcut. If you click
on the newly created icon, your Java application will start without opening a DOS box. If your
application is Text mode application use "java" instead of "javaw".
If the Microsoft JVM is used then use "wjview" (instead of "jview") to start a GUI Java application
from an icon.

4.33 Fix the "out of environment" error when setting a new


CLASSPATHTag(s): Environment
4.32 Create an icon to launch java apps for Windows?Tag(s): Environment

Current version of this HowTo :


http://www.rgagnon.com/javadetails/../javadetails/java0159.html
DOS has a limit on available environment space. You can adjust this in CONFIG.SYS. If your
SHELL statement is set to COMMAND.COM, simply add/modify the SHELL parameter for adjusting
the environment size:
SHELL=C:\windows\command.com C:\windows /p /E:4096

will set off 4 Kb for environment variables.


Command line in DOS has a limit of 127 characters. If you need more room to lanch the JVM then
you have the following workaround.
Use environment variable like
SET MYCLASSPATH = /files/classes/lib/examples.jar
SET MYARGS = Djava.security.policy=/files/policy
java cp %MYCLASSPATH% %MYARGS% myClass

Use a BAT file.

4.34 Query Windows registryTag(s): Environment


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0480.html
We launch the REG utility and capture the output. The performance is poor so it's a good idea to
cache frequently used values.
Note : The Microsoft Windows NT Server 4.0 Resource Kit contains REG.EXE. In Windows 2000 and later REG.EXE is a native command.
The REG utility can be used to write values in the registry (reg add /? for more infos).

In this example,we query the registry to extract the personal folder path ("My Documents") and the
processor ID and its name.
import java.io.*;
public class RegQuery {
private static final String REGQUERY_UTIL = "reg query ";
private static final String REGSTR_TOKEN = "REG_SZ";
private static final String REGDWORD_TOKEN = "REG_DWORD";
private static final String PERSONAL_FOLDER_CMD = REGQUERY_UTIL +
"\"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\"
+ "Explorer\\Shell Folders\" /v Personal";
private static final String CPU_SPEED_CMD = REGQUERY_UTIL +
"\"HKLM\\HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0\""
+ " /v ~MHz";
private static final String CPU_NAME_CMD = REGQUERY_UTIL +
"\"HKLM\\HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0\""
+ " /v ProcessorNameString";

4.34 Query Windows registryTag(s): Environment

public static String getCurrentUserPersonalFolderPath() {


try {
Process process = Runtime.getRuntime().exec(PERSONAL_FOLDER_CMD);
StreamReader reader = new StreamReader(process.getInputStream());
reader.start();
process.waitFor();
reader.join();
String result = reader.getResult();
int p = result.indexOf(REGSTR_TOKEN);
if (p == 1)
return null;
return result.substring(p + REGSTR_TOKEN.length()).trim();
}
catch (Exception e) {
return null;
}
}
public static String getCPUSpeed() {
try {
Process process = Runtime.getRuntime().exec(CPU_SPEED_CMD);
StreamReader reader = new StreamReader(process.getInputStream());
reader.start();
process.waitFor();
reader.join();
String result = reader.getResult();
int p = result.indexOf(REGDWORD_TOKEN);
if (p == 1)
return null;
// CPU speed in Mhz (minus 1) in HEX notation, convert it to DEC
String temp = result.substring(p + REGDWORD_TOKEN.length()).trim();
return Integer.toString
((Integer.parseInt(temp.substring("0x".length()), 16) + 1));
}
catch (Exception e) {
return null;
}
}
public static String getCPUName() {
try {
Process process = Runtime.getRuntime().exec(CPU_NAME_CMD);
StreamReader reader = new StreamReader(process.getInputStream());
reader.start();
process.waitFor();
reader.join();
String result = reader.getResult();
int p = result.indexOf(REGSTR_TOKEN);
if (p == 1)
return null;
return result.substring(p + REGSTR_TOKEN.length()).trim();

4.34 Query Windows registryTag(s): Environment

}
catch (Exception e) {
return null;
}
}
static class StreamReader extends Thread {
private InputStream is;
private StringWriter sw;
StreamReader(InputStream is) {
this.is = is;
sw = new StringWriter();
}
public void run() {
try {
int c;
while ((c = is.read()) != 1)
sw.write(c);
}
catch (IOException e) { ; }
}
String getResult() {
return sw.toString();
}
}
public static void main(String s[]) {
System.out.println("Personal directory : "
+ getCurrentUserPersonalFolderPath());
System.out.println("CPU Name : " + getCPUName());
System.out.println("CPU Speed : " + getCPUSpeed() + " Mhz");
}
}

See also this HowTo and this one.


For a better way to access the Registry, see Read/Write Windows Registry using JNA.

4.35 Read/Write the Registry (Windows)Tag(s): Environment


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0630.html
The JDK contains the required code (java.util.prefs.WindowsPreferences) to access the Windows
registry but to preserve the "purity" of Java, the code is declared as private so it's not visible. The
trick is to use reflection to access private methods defined in the WindowsPreference class.
This technique was first seen in this post.

4.35 Read/Write the Registry (Windows)Tag(s): Environment

Remember : This code is a hack and may break anytime. A better alternative is to use JNA.
import
import
import
import
import
import
import

java.lang.reflect.InvocationTargetException;
java.lang.reflect.Method;
java.util.HashMap;
java.util.Map;
java.util.ArrayList;
java.util.List;
java.util.prefs.Preferences;

public class WinRegistry {


// inspired by
// http://javabyexample.wisdomplug.com/javaconcepts/34corejava/62javaregistrywrapper.ht
// http://www.snipcode.org/java/1java/23javaclassforaccessingreadingandwritingfromw
// http://snipplr.com/view/6620/accessingwindowsregistryinjava/
public static final int HKEY_CURRENT_USER = 0x80000001;
public static final int HKEY_LOCAL_MACHINE = 0x80000002;
public static final int REG_SUCCESS = 0;
public static final int REG_NOTFOUND = 2;
public static final int REG_ACCESSDENIED = 5;
private
private
private
private
private
private
private
private
private
private
private
private
private
private
private

static
static
static
static
static
static
static
static
static
static
static
static
static
static
static

final int KEY_ALL_ACCESS = 0xf003f;


final int KEY_READ = 0x20019;
Preferences userRoot = Preferences.userRoot();
Preferences systemRoot = Preferences.systemRoot();
Class<? extends Preferences> userClass = userRoot.getClass();
Method regOpenKey = null;
Method regCloseKey = null;
Method regQueryValueEx = null;
Method regEnumValue = null;
Method regQueryInfoKey = null;
Method regEnumKeyEx = null;
Method regCreateKeyEx = null;
Method regSetValueEx = null;
Method regDeleteKey = null;
Method regDeleteValue = null;

static {
try {
regOpenKey = userClass.getDeclaredMethod("WindowsRegOpenKey",
new Class[] { int.class, byte[].class, int.class });
regOpenKey.setAccessible(true);
regCloseKey = userClass.getDeclaredMethod("WindowsRegCloseKey",
new Class[] { int.class });
regCloseKey.setAccessible(true);
regQueryValueEx = userClass.getDeclaredMethod("WindowsRegQueryValueEx",
new Class[] { int.class, byte[].class });
regQueryValueEx.setAccessible(true);
regEnumValue = userClass.getDeclaredMethod("WindowsRegEnumValue",
new Class[] { int.class, int.class, int.class });
regEnumValue.setAccessible(true);
regQueryInfoKey = userClass.getDeclaredMethod("WindowsRegQueryInfoKey1",
new Class[] { int.class });
regQueryInfoKey.setAccessible(true);
regEnumKeyEx = userClass.getDeclaredMethod(
"WindowsRegEnumKeyEx", new Class[] { int.class, int.class,
int.class });
regEnumKeyEx.setAccessible(true);
regCreateKeyEx = userClass.getDeclaredMethod(
"WindowsRegCreateKeyEx", new Class[] { int.class,
byte[].class });
regCreateKeyEx.setAccessible(true);
regSetValueEx = userClass.getDeclaredMethod(

4.35 Read/Write the Registry (Windows)Tag(s): Environment

"WindowsRegSetValueEx", new Class[] { int.class,


byte[].class, byte[].class });
regSetValueEx.setAccessible(true);
regDeleteValue = userClass.getDeclaredMethod(
"WindowsRegDeleteValue", new Class[] { int.class,
byte[].class });
regDeleteValue.setAccessible(true);
regDeleteKey = userClass.getDeclaredMethod(
"WindowsRegDeleteKey", new Class[] { int.class,
byte[].class });
regDeleteKey.setAccessible(true);
}
catch (Exception e) {
e.printStackTrace();
}
}
private WinRegistry() {

/**
* Read a value from key and value name
* @param hkey
HKEY_CURRENT_USER/HKEY_LOCAL_MACHINE
* @param key
* @param valueName
* @return the value
* @throws IllegalArgumentException
* @throws IllegalAccessException
* @throws InvocationTargetException
*/
public static String readString(int hkey, String key, String valueName)
throws IllegalArgumentException, IllegalAccessException,
InvocationTargetException
{
if (hkey == HKEY_LOCAL_MACHINE) {
return readString(systemRoot, hkey, key, valueName);
}
else if (hkey == HKEY_CURRENT_USER) {
return readString(userRoot, hkey, key, valueName);
}
else {
throw new IllegalArgumentException("hkey=" + hkey);
}
}
/**
* Read value(s) and value name(s) form given key
* @param hkey HKEY_CURRENT_USER/HKEY_LOCAL_MACHINE
* @param key
* @return the value name(s) plus the value(s)
* @throws IllegalArgumentException
* @throws IllegalAccessException
* @throws InvocationTargetException
*/
public static Map<String, String> readStringValues(int hkey, String key)
throws IllegalArgumentException, IllegalAccessException,
InvocationTargetException
{
if (hkey == HKEY_LOCAL_MACHINE) {
return readStringValues(systemRoot, hkey, key);
}
else if (hkey == HKEY_CURRENT_USER) {
return readStringValues(userRoot, hkey, key);
}

4.35 Read/Write the Registry (Windows)Tag(s): Environment

else {
throw new IllegalArgumentException("hkey=" + hkey);
}
}
/**
* Read the value name(s) from a given key
* @param hkey HKEY_CURRENT_USER/HKEY_LOCAL_MACHINE
* @param key
* @return the value name(s)
* @throws IllegalArgumentException
* @throws IllegalAccessException
* @throws InvocationTargetException
*/
public static List<String> readStringSubKeys(int hkey, String key)
throws IllegalArgumentException, IllegalAccessException,
InvocationTargetException
{
if (hkey == HKEY_LOCAL_MACHINE) {
return readStringSubKeys(systemRoot, hkey, key);
}
else if (hkey == HKEY_CURRENT_USER) {
return readStringSubKeys(userRoot, hkey, key);
}
else {
throw new IllegalArgumentException("hkey=" + hkey);
}
}
/**
* Create a key
* @param hkey HKEY_CURRENT_USER/HKEY_LOCAL_MACHINE
* @param key
* @throws IllegalArgumentException
* @throws IllegalAccessException
* @throws InvocationTargetException
*/
public static void createKey(int hkey, String key)
throws IllegalArgumentException, IllegalAccessException,
InvocationTargetException
{
int [] ret;
if (hkey == HKEY_LOCAL_MACHINE) {
ret = createKey(systemRoot, hkey, key);
regCloseKey.invoke(systemRoot, new Object[] { new Integer(ret[0]) });
}
else if (hkey == HKEY_CURRENT_USER) {
ret = createKey(userRoot, hkey, key);
regCloseKey.invoke(userRoot, new Object[] { new Integer(ret[0]) });
}
else {
throw new IllegalArgumentException("hkey=" + hkey);
}
if (ret[1] != REG_SUCCESS) {
throw new IllegalArgumentException("rc=" + ret[1] + " key=" + key);
}
}
/**
* Write a value in a given key/value name
* @param hkey
* @param key
* @param valueName

4.35 Read/Write the Registry (Windows)Tag(s): Environment

* @param value
* @throws IllegalArgumentException
* @throws IllegalAccessException
* @throws InvocationTargetException
*/
public static void writeStringValue
(int hkey, String key, String valueName, String value)
throws IllegalArgumentException, IllegalAccessException,
InvocationTargetException
{
if (hkey == HKEY_LOCAL_MACHINE) {
writeStringValue(systemRoot, hkey, key, valueName, value);
}
else if (hkey == HKEY_CURRENT_USER) {
writeStringValue(userRoot, hkey, key, valueName, value);
}
else {
throw new IllegalArgumentException("hkey=" + hkey);
}
}
/**
* Delete a given key
* @param hkey
* @param key
* @throws IllegalArgumentException
* @throws IllegalAccessException
* @throws InvocationTargetException
*/
public static void deleteKey(int hkey, String key)
throws IllegalArgumentException, IllegalAccessException,
InvocationTargetException
{
int rc = 1;
if (hkey == HKEY_LOCAL_MACHINE) {
rc = deleteKey(systemRoot, hkey, key);
}
else if (hkey == HKEY_CURRENT_USER) {
rc = deleteKey(userRoot, hkey, key);
}
if (rc != REG_SUCCESS) {
throw new IllegalArgumentException("rc=" + rc + " key=" + key);
}
}
/**
* delete a value from a given key/value name
* @param hkey
* @param key
* @param value
* @throws IllegalArgumentException
* @throws IllegalAccessException
* @throws InvocationTargetException
*/
public static void deleteValue(int hkey, String key, String value)
throws IllegalArgumentException, IllegalAccessException,
InvocationTargetException
{
int rc = 1;
if (hkey == HKEY_LOCAL_MACHINE) {
rc = deleteValue(systemRoot, hkey, key, value);
}
else if (hkey == HKEY_CURRENT_USER) {

4.35 Read/Write the Registry (Windows)Tag(s): Environment

rc = deleteValue(userRoot, hkey, key, value);


}
if (rc != REG_SUCCESS) {
throw new IllegalArgumentException("rc=" + rc + "
}

key=" + key + "

value=" + value);

}
// =====================
private static int deleteValue
(Preferences root, int hkey, String key, String value)
throws IllegalArgumentException, IllegalAccessException,
InvocationTargetException
{
int[] handles = (int[]) regOpenKey.invoke(root, new Object[] {
new Integer(hkey), toCstr(key), new Integer(KEY_ALL_ACCESS) });
if (handles[1] != REG_SUCCESS) {
return handles[1]; // can be REG_NOTFOUND, REG_ACCESSDENIED
}
int rc =((Integer) regDeleteValue.invoke(root,
new Object[] {
new Integer(handles[0]), toCstr(value)
})).intValue();
regCloseKey.invoke(root, new Object[] { new Integer(handles[0]) });
return rc;
}
private static int deleteKey(Preferences root, int hkey, String key)
throws IllegalArgumentException, IllegalAccessException,
InvocationTargetException
{
int rc =((Integer) regDeleteKey.invoke(root,
new Object[] { new Integer(hkey), toCstr(key) })).intValue();
return rc; // can REG_NOTFOUND, REG_ACCESSDENIED, REG_SUCCESS
}
private static String readString(Preferences root, int hkey, String key, String value)
throws IllegalArgumentException, IllegalAccessException,
InvocationTargetException
{
int[] handles = (int[]) regOpenKey.invoke(root, new Object[] {
new Integer(hkey), toCstr(key), new Integer(KEY_READ) });
if (handles[1] != REG_SUCCESS) {
return null;
}
byte[] valb = (byte[]) regQueryValueEx.invoke(root, new Object[] {
new Integer(handles[0]), toCstr(value) });
regCloseKey.invoke(root, new Object[] { new Integer(handles[0]) });
return (valb != null ? new String(valb).trim() : null);
}
private static Map<String,String> readStringValues
(Preferences root, int hkey, String key)
throws IllegalArgumentException, IllegalAccessException,
InvocationTargetException
{
HashMap<String, String> results = new HashMap<String,String>();
int[] handles = (int[]) regOpenKey.invoke(root, new Object[] {
new Integer(hkey), toCstr(key), new Integer(KEY_READ) });
if (handles[1] != REG_SUCCESS) {
return null;
}
int[] info = (int[]) regQueryInfoKey.invoke(root,

4.35 Read/Write the Registry (Windows)Tag(s): Environment

new Object[] { new Integer(handles[0]) });


// int count = info[2]; // count
int count = info[0];
// bug fix 20130112
int maxlen = info[3]; // value length max
for(int index=0; index<count; index++) {
byte[] name = (byte[]) regEnumValue.invoke(root, new Object[] {
new Integer
(handles[0]), new Integer(index), new Integer(maxlen + 1)});
String value = readString(hkey, key, new String(name));
results.put(new String(name).trim(), value);
}
regCloseKey.invoke(root, new Object[] { new Integer(handles[0]) });
return results;
}
private static List<String> readStringSubKeys
(Preferences root, int hkey, String key)
throws IllegalArgumentException, IllegalAccessException,
InvocationTargetException
{
List<String> results = new ArrayList<String>();
int[] handles = (int[]) regOpenKey.invoke(root, new Object[] {
new Integer(hkey), toCstr(key), new Integer(KEY_READ)
});
if (handles[1] != REG_SUCCESS) {
return null;
}
int[] info = (int[]) regQueryInfoKey.invoke(root,
new Object[] { new Integer(handles[0]) });
// int count = info[2]; // count
int count = info[0];
// bug fix 20130112
int maxlen = info[3]; // value length max
for(int index=0; index<count; index++) {
byte[] name = (byte[]) regEnumKeyEx.invoke(root, new Object[] {
new Integer
(handles[0]), new Integer(index), new Integer(maxlen + 1)
});
results.add(new String(name).trim());
}
regCloseKey.invoke(root, new Object[] { new Integer(handles[0]) });
return results;
}
private static int [] createKey(Preferences root, int hkey, String key)
throws IllegalArgumentException, IllegalAccessException,
InvocationTargetException
{
return (int[]) regCreateKeyEx.invoke(root,
new Object[] { new Integer(hkey), toCstr(key) });
}
private static void writeStringValue
(Preferences root, int hkey, String key, String valueName, String value)
throws IllegalArgumentException, IllegalAccessException,
InvocationTargetException
{
int[] handles = (int[]) regOpenKey.invoke(root, new Object[] {
new Integer(hkey), toCstr(key), new Integer(KEY_ALL_ACCESS) });
regSetValueEx.invoke(root,
new Object[] {

4.35 Read/Write the Registry (Windows)Tag(s): Environment

new Integer(handles[0]), toCstr(valueName), toCstr(value)


});
regCloseKey.invoke(root, new Object[] { new Integer(handles[0]) });
}
// utility
private static byte[] toCstr(String str) {
byte[] result = new byte[str.length() + 1];
for (int i = 0; i < str.length(); i++) {
result[i] = (byte) str.charAt(i);
}
result[str.length()] = 0;
return result;
}
}

How to use it :
package com.rgagnon.howto;
public class WinRegistryTest {
public static void main(String args[]) throws Exception {
String value = "";
// IE Download directory (HKEY_CURRENT_USER)
value = WinRegistry.readString(
WinRegistry.HKEY_CURRENT_USER,
"Software\\Microsoft\\Internet Explorer",
"Download Directory");
System.out.println("IE Download directory = " + value);
// Query for Acrobat Reader installation path (HKEY_LOCAL_MACHINE)
value = WinRegistry.readString(
WinRegistry.HKEY_LOCAL_MACHINE,
"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\AcroRd32.exe",
"");
System.out.println("Acrobat Reader Path = " + value);

/*
this code is broken under win7 64 :(

20130112

// Loop through installed JRE and print the JAVA_HOME value


// HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment
java.util.Map res1 = WinRegistry.readStringValues(
WinRegistry.HKEY_LOCAL_MACHINE,
"SOFTWARE\\Wow6432Node\\JavaSoft\\Java Runtime Environment");
System.out.println("1:" + res1.toString());
*/
// on 64bit Windows, you need Wow6432Node to access 32bit related information
//
"SOFTWARE\\Wow6432Node\\Microsoft\\Windows NT\\CurrentVersion"
java.util.List res2 = WinRegistry.readStringSubKeys(
WinRegistry.HKEY_LOCAL_MACHINE,
"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion");
System.out.println(res2.toString());
WinRegistry.createKey(
WinRegistry.HKEY_CURRENT_USER, "SOFTWARE\\rgagnon.com");
WinRegistry.writeStringValue(
WinRegistry.HKEY_CURRENT_USER,
"SOFTWARE\\rgagnon.com",

4.35 Read/Write the Registry (Windows)Tag(s): Environment

"HowTo",
"java");
//
//
//
//
//
//

WinRegistry.deleteValue(
WinRegistry.HKEY_CURRENT_USER,
"SOFTWARE\\rgagnon.com", "HowTo");
WinRegistry.deleteKey(
WinRegistry.HKEY_CURRENT_USER,
"SOFTWARE\\rgagnon.com\\");
System.out.println("Done." );
}

The output :
IE Download directory = C:\Documents and Settings\Ral\Bureau
Acrobat Reader Path = C:\Program Files\Adobe\Acrobat 5.0\Reader\AcroRd32.exe
{SubVersionNumber=, CurrentBuild=1.511.1 () (snipped)...
[Accessibility, AeDebug, Asr, Classes, Compatibility, (snipped)...
Done.

4.36 Quickly retrieve available Java JVM on a workstation


(Windows)Tag(s): Environment
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0525.html

4.37 Using regedit


Use regedit utility to query the Windows registry, the result is written into a file.
start /w regedit /e jre.txt
"HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment"

The content of jre.txt on my machine :


Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment]
"CurrentVersion"="1.5"
[HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment\1.4]
"JavaHome"="C:\\Program Files\\Java\\j2re1.4.1_02"
"RuntimeLib"="C:\\Program Files\\Java\\j2re1.4.1_02\\bin\\client\\jvm.dll"
"MicroVersion"="1"
[HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment\1.4.1_02]
"JavaHome"="C:\\Program Files\\Java\\j2re1.4.1_02"

4.36 Quickly retrieve available Java JVM on a workstation (Windows)Tag(s): Environment

"MicroVersion"="1"
"RuntimeLib"="C:\\Program Files\\Java\\j2re1.4.1_02\\bin\\client\\jvm.dll"
[HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment\1.5]
"JavaHome"="C:\\Program Files\\Java\\jre1.5.0"
"RuntimeLib"="C:\\Program Files\\Java\\jre1.5.0\\bin\\client\\jvm.dll"
"MicroVersion"="0"
[HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment\1.5.0]
"JavaHome"="C:\\Program Files\\Java\\jre1.5.0"
"MicroVersion"="0"
"RuntimeLib"="C:\\Program Files\\Java\\jre1.5.0\\bin\\client\\jvm.dll"

4.38 Using a CMD file


A CMD file for Windows to display the default JRE used :
@echo off
::Find the current (most recent) Java version
start /w regedit /e reg1.txt "HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment"
type reg1.txt | find "CurrentVersion" > reg2.txt
if errorlevel 1 goto ERROR
for /f "tokens=2 delims==" %%x in (reg2.txt) do set JavaTemp=%%~x
if errorlevel 1 goto ERROR
echo Java Version = %JavaTemp%
del reg1.txt
del reg2.txt

::Get the home directory of the most recent Java


start /w regedit /e reg1.txt "HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment\%Ja
type reg1.txt | find "JavaHome" > reg2.txt
if errorlevel 1 goto ERROR
for /f "tokens=2 delims==" %%x in (reg2.txt) do set JavaTemp=%%~x
if errorlevel 1 goto ERROR
echo Java home path (per registry) = %JavaTemp%
del reg1.txt
del reg2.txt
pause

Output example :
C:\temp>findjava.cmd
Java Version = 1.6
Java home path (per registry) = C:\\applications\\dev\\jre6

Note :
The above script returns the default JVM if the PATH variable does not override it!
Oracle client installation is famous to force an outdated Java at the beginning of the PATH. This
oneliner displays the java.exe (if any) found in the PATH :
c:\> for %i in (java.exe) do @echo.
C:\WINDOWS\system32\java.exe

%~$PATH:i

The java.exe in the system32 relies on the CurrentVersion registry setting to determine which
registry key to use to look up the location of the Java RE.

4.38 Using a CMD file

4.39 Get a return code from a VBSTag(s): IO Environment


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0575.html
You can't detect directly if Windows service is running or not in Java.
However, it's easy to do from a VBS. You execute the script from Java, wait for its completion and
capture the return code.
Obviously, this is useful only on the Windows plateform.
import java.io.File;
import java.io.FileWriter;
public class VBSUtils {
private VBSUtils() { }
public static boolean isServiceRunning(String serviceName) {
try {
File file = File.createTempFile("realhowto",".vbs");
file.deleteOnExit();
FileWriter fw = new java.io.FileWriter(file);
String vbs = "Set sh = CreateObject(\"Shell.Application\") \n"
+ "If sh.IsServiceRunning(\""+ serviceName +"\") Then \n"
+ "
wscript.Quit(1) \n"
+ "End If \n"
+ "wscript.Quit(0) \n";
fw.write(vbs);
fw.close();
Process p = Runtime.getRuntime().exec("wscript " + file.getPath());
p.waitFor();
return (p.exitValue() == 1);
}
catch(Exception e){
e.printStackTrace();
}
return false;
}

public static void main(String[] args){


//
// DEMO
//
String result = "";
msgBox("Check if service 'Themes' is running (should be yes)");
result = isServiceRunning("Themes") ? "" : " NOT ";
msgBox("service 'Themes' is " + result + " running ");
msgBox("Check if service 'foo' is running (should be no)");
result = isServiceRunning("foo") ? "" : " NOT ";
msgBox("service 'foo' is " + result + " running ");
}

4.39 Get a return code from a VBSTag(s): IO Environment

public static void msgBox(String msg) {


javax.swing.JOptionPane.showConfirmDialog((java.awt.Component)
null, msg, "VBSUtils", javax.swing.JOptionPane.DEFAULT_OPTION);
}
}

4.40 List currently running processes (Windows)Tag(s):


Environment
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0593.html

4.40.1 Using TASKLIST.EXE


The Microsoft TASKLIST.EXE is used to dump the list of the currently running processes. It is
similar to tasklist window but for the console.
From a Java program, we are launching TASKLIST.EXE and capture its output.
Note : TASKLIST.EXE is not included the HOME edition of XP. But you can download it from Web,
for example : http://www.computerhope.com/download/winxp.htm.
import java.io.*;
import java.util.*;
public class WindowsUtils {
public static List<String> listRunningProcesses() {
List<String> processes = new ArrayList<String>();
try {
String line;
Process p = Runtime.getRuntime().exec("tasklist.exe /fo csv /nh");
BufferedReader input = new BufferedReader
(new InputStreamReader(p.getInputStream()));
while ((line = input.readLine()) != null) {
if (!line.trim().equals("")) {
// keep only the process name
line = line.substring(1);
processes.add(line.substring(0, line.indexOf(""")));
}
}
input.close();
}
catch (Exception err) {
err.printStackTrace();
}
return processes;
}
public static void main(String[] args){
List<String> processes = listRunningProcesses();

4.40 List currently running processes (Windows)Tag(s): Environment

String result = "";


// display the result
Iterator<String> it = processes.iterator();
int i = 0;
while (it.hasNext()) {
result += it.next() +",";
i++;
if (i==10) {
result += "\n";
i = 0;
}
}
msgBox("Running processes : " + result);
}
public static void msgBox(String msg) {
javax.swing.JOptionPane.showConfirmDialog((java.awt.Component)
null, msg, "WindowsUtils", javax.swing.JOptionPane.DEFAULT_OPTION);
}
}
Thanks to M. Korbel

4.40.2 Using a VBS


Another technique to build the required VBScript onthefly, execute it and capture its output.
import
import
import
import
import

java.io.BufferedReader;
java.io.File;
java.io.FileWriter;
java.io.InputStreamReader;
java.util.*;

public class VBSUtils {


private VBSUtils() { }
public static List<String> listRunningProcesses() {
List<String> processList = new ArrayList<String>();
try {
File file = File.createTempFile("realhowto",".vbs");
file.deleteOnExit();
FileWriter fw = new java.io.FileWriter(file);
String vbs =
+
+
+
+
+
+
+
+

"Set WshShell = WScript.CreateObject(\"WScript.Shell\")\n"


"Set locator = CreateObject(\"WbemScripting.SWbemLocator\")\n"
"Set service = locator.ConnectServer()\n"
"Set processes = service.ExecQuery _\n"
" (\"select name from Win32_Process\")\n"
"For Each process in processes\n"
"wscript.echo process.Name \n"
"Next\n"
"Set WSHShell = Nothing\n";

fw.write(vbs);
fw.close();
Process p = Runtime.getRuntime().exec("cscript //NoLogo " + file.getPath());
BufferedReader input =
new BufferedReader
(new InputStreamReader(p.getInputStream()));
String line;

4.40.2 Using a VBS

while ((line = input.readLine()) != null) {


processList.add(line);
}
input.close();
}
catch(Exception e){
e.printStackTrace();
}
return processList;
}
public static void main(String[] args){
List<String> processes = VBSUtils.listRunningProcesses();
String result = "";
Iterator<String> it = processes.iterator();
int i = 0;
while (it.hasNext()) {
result += it.next() +",";
i++;
if (i==10) {
result += "\n";
i = 0;
}
}
msgBox("Running processes : " + result);
}
public static void msgBox(String msg) {
javax.swing.JOptionPane.showConfirmDialog((java.awt.Component)
null, msg, "VBSUtils", javax.swing.JOptionPane.DEFAULT_OPTION);
}
}

See this HowTo to check for a specific application is running or not.

4.41 Check if a program or process is running (Windows)Tag(s):


Environment
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0610.html
Based on this HowTo which list the currently running processes, we adapt it to check for a specific
program name.
In this example, we check if the text editor TextPad.exe is running.
import
import
import
import

java.io.BufferedReader;
java.io.File;
java.io.FileWriter;
java.io.InputStreamReader;

4.41 Check if a program or process is running (Windows)Tag(s): Environment

public class VBSUtils {


private VBSUtils() { }
public static boolean isRunning(String process) {
boolean found = false;
try {
File file = File.createTempFile("realhowto",".vbs");
file.deleteOnExit();
FileWriter fw = new java.io.FileWriter(file);
String vbs =
+
+
+
+
+
+
+
+

"Set WshShell = WScript.CreateObject(\"WScript.Shell\")\n"


"Set locator = CreateObject(\"WbemScripting.SWbemLocator\")\n"
"Set service = locator.ConnectServer()\n"
"Set processes = service.ExecQuery _\n"
" (\"select * from Win32_Process where name='" + process +"'\")\n"
"For Each process in processes\n"
"wscript.echo process.Name \n"
"Next\n"
"Set WSHShell = Nothing\n";

fw.write(vbs);
fw.close();
Process p = Runtime.getRuntime().exec("cscript //NoLogo " + file.getPath());
BufferedReader input =
new BufferedReader
(new InputStreamReader(p.getInputStream()));
String line;
line = input.readLine();
if (line != null) {
if (line.equals(process)) {
found = true;
}
}
input.close();
}
catch(Exception e){
e.printStackTrace();
}
return found;
}
public static void main(String[] args){
boolean result = VBSUtils.isRunning("TextPad.exe");
msgBox("Is TextPad running ?

" + (result ? " Yes" : "No"));

}
public static void msgBox(String msg) {
javax.swing.JOptionPane.showConfirmDialog((java.awt.Component)
null, msg, "VBSUtils", javax.swing.JOptionPane.DEFAULT_OPTION);
}
}

See also this HowTo

4.41 Check if a program or process is running (Windows)Tag(s): Environment

4.42 Detect if a process is running using WMIC Tag(s): Misc


Prog HowTo Java Environment
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../gp/windowsdetectifaprocessisrunning.html
WMIC is a powerful Windows utility. You can use to know if a particular process is running or not.
This example detects if a Tomcat instance (can be anything, ex: Apache or Excel) is running from a
batch file.
@echo off
wmic process list brief | find /i "tomcat.exe"
set result=%ERRORLEVEL%
if "%result%"=="1" echo "not running"
if "%result%"=="0" echo "running"

/i is to make the find operation caseinsensitive.


For Java code :
import
import
import
import
import
import

java.io.BufferedReader;
java.io.IOException;
java.io.InputStream;
java.io.InputStreamReader;
java.util.ArrayList;
java.util.List;

public class WindowsUtils {


private WindowsUtils() {}
public static boolean isProcessRunning(String processName) throws IOException {
InputStream is = null;
InputStreamReader isr = null;
BufferedReader br = null;
List<String> command = new ArrayList<String>();
command.add("WMIC");
command.add("process");
command.add("list");
command.add("brief");
try {
ProcessBuilder builder = new ProcessBuilder(command);
Process process = builder.start();
is = process.getInputStream();
isr = new InputStreamReader(is);
br = new BufferedReader(isr);
String line;
processName = processName.toUpperCase();
while ((line = br.readLine()) != null) {
if (line.toUpperCase().indexOf(processName) > 1) return true;
}
return false;
}
finally {
if (br != null) br.close();
if (isr != null) isr.close();
if (is != null) is.close();
}

4.42 Detect if a process is running using WMIC Tag(s): Misc Prog HowTo Java Environment

}
public static void main(String[] args) throws IOException {
System.out.println(WindowsUtils2.isProcessRunning("excel.exe"));
}
}

See also this HowTo.

4.43 Windows registry vs. Java JDK/JRE installationTag(s):


Environment
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0604.html
The JDK itself does not use the windows registry to run.
It is the JRE that uses the system registry to run in some situations like an Applet or a program
started with the WebStart technolgy.
Finally, the JRE will only use the registry if it is run from the Windows system directory (ex .
C:/winnt/system32/java.exe). This would happen if the user just types "java" on the commandline in
some random directory, because the system directory is always in the user's path. In this situation,
the java.exe will locate the current Java installation by looking at the registry key
[HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment\CurrentVersion]

and then get the path of the JRE from the corresponding key
[HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment\1.5\JavaHome]

Beware that some software (eg. Oracle) installs themself at the beginning of the PATH definition, so
it's their Java installation that will be found first.
You can run the absolute path to the java.exe file, as in
"C:\Program Files\Java\jre1.5.0\bin\java.exe" MyClass

It will not use the registry, and it will be guaranteed to use jre1.5.0.
So for a regular Java SE program, it is safe to specify the complete path to the JRE to launch it.
But for the Applet/Plugin or WebStartbased programs, the registry is always used to determine the
current JRE.

4.43 Windows registry vs. Java JDK/JRE installationTag(s): Environment

4.44 Get the current Java version from a BAT fileTag(s):


Environment
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0642.html
[j.cmd]
@echo off
cls
setlocal ENABLEEXTENSIONS
set KEY_NAME="HKLM\SOFTWARE\JavaSoft\Java Runtime Environment"
set VALUE_NAME=CurrentVersion
::
:: get the current version
::
FOR /F "usebackq skip=4 tokens=3" %%A IN (`REG QUERY %KEY_NAME% /v %VALUE_NAME% 2^>nul`) DO (
set ValueValue=%%A
)
if defined ValueValue (
@echo the current Java runtime is %ValueValue%
) else (
@echo %KEY_NAME%\%VALUE_NAME% not found.
goto end
)
set JAVA_CURRENT="HKLM\SOFTWARE\JavaSoft\Java Runtime Environment\%ValueValue%"
set JAVA_HOME=JavaHome

::
:: get the javahome
::
FOR /F "usebackq skip=4 tokens=3,4" %%A IN (`REG QUERY %JAVA_CURRENT% /v %JAVA_HOME% 2^>nul`) D
set JAVA_PATH=%%A %%B
)
echo the path of the current Java JVM according to the registry is
echo %JAVA_PATH%
echo.
echo now if we try it :
"%JAVA_PATH%\bin\java.exe" version
:end
>j.cmd
the current Java runtime is 1.6
the path of the current Java JVM according to the registry is
C:\Program Files\Java\jre1.6.0_06
now if we try it :
java version "1.6.0_06"
Java(TM) SE Runtime Environment (build 1.6.0_06b02)

4.44 Get the current Java version from a BAT fileTag(s): Environment

Java HotSpot(TM) Client VM (build 10.0b22, mixed mode, sharing)

4.45 Get the Windows "My Documents" pathTag(s):


Environment
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0572.html
This value is stored in the registry and there is no easy way to get it with regular Java unless you
execute an external utility, see this HowTo.
As an alternative, we can use a method provided by the JFileChooser class.
import javax.swing.JFileChooser;
javax.swing.filechooser.FileSystemView;
public class GetMyDocuments {
public static void main(String args[]) {
JFileChooser fr = new JFileChooser();
FileSystemView fw = fr.getFileSystemView();
System.out.println(fw.getDefaultDirectory());
}
}

See also Get Windows Special Folders (JNA)

4.46 Get the Windows Desktop pathTag(s): Environment


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0652.html
import java.io.*;
public class WindowsUtils {
private static final String REGQUERY_UTIL = "reg query ";
private static final String REGSTR_TOKEN = "REG_SZ";
private static final String DESKTOP_FOLDER_CMD = REGQUERY_UTIL +
"\"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\"
+ "Explorer\\Shell Folders\" /v DESKTOP";
private WindowsUtils() {}
public static String getCurrentUserDesktopPath() {
try {

4.45 Get the Windows "My Documents" pathTag(s): Environment

Process process = Runtime.getRuntime().exec(DESKTOP_FOLDER_CMD);


StreamReader reader = new StreamReader(process.getInputStream());
reader.start();
process.waitFor();
reader.join();
String result = reader.getResult();
int p = result.indexOf(REGSTR_TOKEN);
if (p == 1)
return null;
return result.substring(p + REGSTR_TOKEN.length()).trim();
}
catch (Exception e) {
return null;
}
}

/**
* @param args
*/
public static void main(String[] args) {
System.out.println("Desktop directory : "
+ getCurrentUserDesktopPath());
}
static class StreamReader extends Thread {
private InputStream is;
private StringWriter sw;
StreamReader(InputStream is) {
this.is = is;
sw = new StringWriter();
}
public void run() {
try {
int c;
while ((c = is.read()) != 1)
sw.write(c);
}
catch (IOException e) { ; }
}
String getResult() {
return sw.toString();
}
}
}

See also Get Windows Special Folders (JNA)

4.45 Get the Windows "My Documents" pathTag(s): Environment

4.47 Get the Windows Special FoldersTag(s): Environment


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0653.html
import
import
import
import

java.io.BufferedReader;
java.io.File;
java.io.FileWriter;
java.io.InputStreamReader;

public class VBSUtils {


public
public
public
public
public
public
public
public
public
public
public
public

static
static
static
static
static
static
static
static
static
static
static
static

String
String
String
String
String
String
String
String
String
String
String
String

private VBSUtils() {

SF_ALLUSERSDESKTOP
SF_ALLUSERSSTARTMENU
SF_ALLUSERSPROGRAMS
SF_ALLUSERSSTARTUP
SF_DESKTOP
SF_FAVORITES
SF_MYDOCUMENT
SF_PROGRAMS
SF_RECENT
SF_SENDTO
SF_STARTMENU
SF_STARTUP

=
=
=
=
=
=
=
=
=
=
=
=

"AllUsersDesktop";
"AllUsersStartMenu";
"AllUsersPrograms";
"AllUsersStartup";
"Desktop";
"Favorites";
"MyDocuments";
"Programs";
"Recent";
"SendTo";
"StartMenu";
"Startup";

public static String getSpecialFolder(String folder) {


String result = "";
try {
File file = File.createTempFile("realhowto",".vbs");
file.deleteOnExit();
FileWriter fw = new java.io.FileWriter(file);
String vbs = "Set WshShell = WScript.CreateObject(\"WScript.Shell\")\n"
+ "wscript.echo WshShell.SpecialFolders(\"" + folder + "\")\n"
+ "Set WSHShell = Nothing\n";
fw.write(vbs);
fw.close();
Process p = Runtime.getRuntime().exec("cscript //NoLogo " + file.getPath());
BufferedReader input =
new BufferedReader
(new InputStreamReader(p.getInputStream()));
result = input.readLine();
input.close();
}
catch(Exception e){
e.printStackTrace();
}
return result;
}
public static void main(String[] args){
System.out.println(VBSUtils.getSpecialFolder(VBSUtils.SF_ALLUSERSDESKTOP));
System.out.println(VBSUtils.getSpecialFolder(VBSUtils.SF_DESKTOP));
System.out.println(VBSUtils.getSpecialFolder(VBSUtils.SF_PROGRAMS));
}
}

4.47 Get the Windows Special FoldersTag(s): Environment

See also :
Get Windows Desktop path using the registry
Get Windows "My Documents" path using FileSystemView.getDefaultDirectory()
See also Get Windows Special Folders (JNA)

4.48 Create an Internet Shortcut (Windows)Tag(s): Environment


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0660.html
import java.io.*;
public class WindowsUtils {
private WindowsUtils() {

// see note
private static final String WINDOWS_DESKTOP = "Desktop";
/**
* the current user desktop path
* @return the current user desktop path
*/
public static String getWindowsCurrentUserDesktopPath() {
return System.getenv("userprofile") + "/" + WINDOWS_DESKTOP ;
}
/**
* Create an Internet shortcut on User's Desktop no icon specified
* @param name
name of the shortcut
* @param target URL
* @throws IOException
*/
public static void createInternetShortcutOnDesktop(String name, String target)
throws IOException
{
String path = getWindowsCurrentUserDesktopPath() + "/"+ name + ".URL";
createInternetShortcut(name, path, target, "");
}
/**
* Create an Internet shortcut on User's Desktop, icon specified
* @param name
name of the shortcut
* @param target URL
* @param icon
URL (ex. http://www.server.com/favicon.ico)
* @throws IOException
*/
public static void createInternetShortcutOnDesktop
(String name, String target, String icon)
throws IOException
{
String path = getWindowsCurrentUserDesktopPath() + "/"+ name + ".URL";

4.48 Create an Internet Shortcut (Windows)Tag(s): Environment

createInternetShortcut(name, path, target, icon);


}
/**
* Create an Internet shortcut
* @param name
name of the shortcut
* @param where
location of the shortcut
* @param target
URL
* @param icon
URL (ex. http://www.server.com/favicon.ico)
* @throws IOException
*/
public static void createInternetShortcut
(String name, String where, String target, String icon)
throws IOException
{
FileWriter fw = new FileWriter(where);
fw.write("[InternetShortcut]\n");
fw.write("URL=" + target + "\n");
if (!icon.equals("")) {
fw.write("IconFile=" + icon + "\n");
}
fw.flush();
fw.close();
}
/**
* @param args
*/
public static void main(String[] args) throws IOException {
WindowsUtils.createInternetShortcutOnDesktop
("GOOGLE", "http://www.google.com");
}
}

NOTE:
Prior Vista, the desktop path for a localized Windows can be different. With an english version, it's
Desktop while for a french version, it's called Bureau.
The only way to get the right name is to ask the Registry, see this HowTo.

4.49 Detect if running in remote session (Windows)Tag(s):


Environment
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/javadetectremotesession.html
[Windows only]
To decect if an application is running in a Remote Desktop session, you can call the Windows API
GetSystemMetrics. The GetSystemMetrics() function will return a nonzero value with a
SM_REMOTESESSION parameter value if the application is associated with a client terminal
session.
4.49 Detect if running in remote session (Windows)Tag(s): Environment

It is useful to detect if running in a remote session to optimize visual effects or colors.


In Java, you need to use JNI (Java Native Interface) to call this Windows native API. Native Call is
an Open Source project which provide an easy way to that.
http://johannburkard.de/software/nativecall/
All you need is 2 jars (nativecall0,4,1.jar and nativeloader200505172341.jar) plus 1 DLL
(NativeCall.dll) in your classpath.
When running from Eclipse, the DLL should be in the bin directory of your application.
import java.io.IOException;
import com.eaio.nativecall.IntCall;
import com.eaio.nativecall.NativeCall;
public class WindowsUtils {
public static final int SM_REMOTESESSION = 4096;

// remote session

private WindowsUtils() {}
public static boolean isRemote() throws SecurityException, UnsatisfiedLinkError,
UnsupportedOperationException, IOException
{
NativeCall.init();
IntCall ic = null;
try {
ic = new IntCall("user32", "GetSystemMetrics");
int rc = ic.executeCall(new Integer(SM_REMOTESESSION));
return (rc gt; 0);
}
finally {
if (ic != null) ic.destroy();
}
}
public static void main(String ... args) throws Exception {
System.out.println(WindowsUtils.isRemote());
}
}

An easy way is to check the Windows environment variable sessionname. The value of this
environment variable will be 'Console' for a normal, local session. For an Remote Desktop session it
will contain the phrase 'RDP'.
public static boolean isRemoteDesktopSession() {
System.getenv("sessionname").toLowerCase().startsWith("rdp");
}

Note that environment varialbe values are read at the JVM startup. So if the JVM process was
started by a console session, but then accessed by an RDP session, further calls to
System.getenv("sessionname") still return 'Console'
See this HowTo to detect a Citrix session.

4.49 Detect if running in remote session (Windows)Tag(s): Environment

4.50 Detect if running a Citrix session (Windows)Tag(s): IO


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/javadetectifrunningincitrixsession.html
The easiest way is to query the environment variable SESSIONNAME. The value starts with ICA...
in a Citrix session, RDP if in remote desktop session or Console if directly on a workstation.
public static boolean isRemoteDesktopSession() {
System.getenv("sessionname").toLowerCase().startsWith("rdp");
}
public static boolean isCitrixSession() {
System.getenv("sessionname").toLowerCase().startsWith("ica");
}
public static boolean isConsoleSession() {
System.getenv("sessionname").toLowerCase().startsWith("console");
}

4.51 Create a Taglet to document database access


(Javadoc)Tag(s): Environment
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0473.html
Since JDK1.4, it is possible to create a taglet to be used with javadoc to customized the generated
documentation.
This example implements a new javadoc tag to document which tables a class is dealing with. If a
method interact with 2 tables, employee and address, then the javadoc tag
/**
*@table employee:firstname,lastname;address:city,country
* @return value
*/
public String newMethod() {
return "yo";
}

will be documented as

4.50 Detect if running a Citrix session (Windows)Tag(s): IO

4.51.1 newMethod
public java.lang.String newMethod()

Returns:
value
Table(s):
firstname
lastname

city
country

The "table" taglet source


/*
* Table.java
*/
package com.rgagnon.taglet;
import com.sun.tools.doclets.Taglet;
import com.sun.javadoc.*;
import java.util.Map;
/**
* This is a taglet to document tables and fields used by a classes
* example : @table employee:lastname,firstname;address:city,country
*
* @author Ral Gagnon
*/
public class Table implements Taglet{
private static final String NAME = "table";
private static final String HEADER = "Table(s):";
/**
* Return the name of this custom tag.
*/
public String getName() {
return NAME;
}
/**
* Will return true since <code>@todo</code>
* can be used in field documentation.
* @return true since <code>@todo</code>
* can be used in field documentation and false
* otherwise.
*/
public boolean inField() {
return false;
}
/**
* Will return true since <code>@todo</code>
* can be used in constructor documentation.
* @return true since <code>@todo</code>
* can be used in constructor documentation and false
* otherwise.
*/
public boolean inConstructor() {
return true;
}

4.51.1 newMethod

/**
* Will return true since <code>@todo</code>
* can be used in method documentation.
* @return true since <code>@todo</code>
* can be used in method documentation and false
* otherwise.
*/
public boolean inMethod() {
return true;
}
/**
* Will return true since <code>@todo</code>
* can be used in method documentation.
* @return true since <code>@todo</code>
* can be used in overview documentation and false
* otherwise.
*/
public boolean inOverview() {
return true;
}
/**
* Will return true since <code>@todo</code>
* can be used in package documentation.
* @return true since <code>@todo</code>
* can be used in package documentation and false
* otherwise.
*/
public boolean inPackage() {
return true;
}
/**
* Will return true since <code>@todo</code>
* can be used in type documentation (classes or interfaces).
* @return true since <code>@todo</code>
* can be used in type documentation and false
* otherwise.
*/
public boolean inType() {
return true;
}
/**
* Will return false since <code>@todo</code>
* is not an inline tag.
* @return false since <code>@todo</code>
* is not an inline tag.
*/
public boolean isInlineTag() {
return false;
}
/**
* Register this Taglet.
* @param tagletMap the map to register this tag to.
*/
public static void register(Map tagletMap) {
Table tag = new Table();
Taglet t = (Taglet) tagletMap.get(tag.getName());
if (t != null) {

4.51.1 newMethod

tagletMap.remove(tag.getName());
}
tagletMap.put(tag.getName(), tag);
}
/**
* Given the <code>Tag</code> representation of this custom
* tag, return its string representation.
* @param tag
the <code>Tag</code> representation of this custom tag.
*/
public String toString(Tag tag) {
String output = "";
String tables [] = tag.text().split(";");
int j = tables.length;
if (j > 0) {
output = "<DT><B>" + HEADER
+ "</B><DD><TABLE><TR>";
for (int i=0; i < j ; i++){
// deals with the current table and its fields
String current[] = tables[i].split(":");
output +=
"<TD><TABLE style=\"borderstyle:solid;"
+ " borderwidth:thin\">";
output +=
"<TH ALIGN=\"center\" STYLE=\"borderstyle:solid;"
+ " borderwidth:thin\">"
+ current[0] + "</TH>";
if (current.length > 1) {
String fields[] = current[1].split(",");
int k = fields.length;
for (int n=0; n < k ; n++) {
output += "<TR><TD ALIGN=\"center\">"
+ fields[n] + "</TD></TR>";
}
}
output += "</TABLE>";
}
output += "</TR></TABLE>";
}
return output;
}
/**
* Given an array of Tags representing this custom
* tag, return its string representation.
* @param tags the array of Tags representing of this custom tag.
*/
public String toString(Tag[] tags) {
if (tags.length == 0) {
return null;
}
String result = "";
for (int i = 0; i < tags.length; i++) {
result += toString(tags[i]);
}
return result ;
}
}

Compile your taglet. Use javac compiler version 1.4.0 (or later) in the Java 2 SDK. The required
class files are in the lib\tools.jar file in the SDK. Assuming the SDK is installed at C:\Program
Files\j2sdk1.4.1 :
4.51.1 newMethod

javac classpath "C:\Program Files\j2sdk1.4.1\lib\tools.jar"


com\rgagnon\taglet\Table.java

Run the javadoc tool using the taglet and tagletpath options. For example, if your taglet class file
is defined to be in package com.rgagnon.taglet and is stored in
C:\taglets\com\rgagnon\taglet\Table.class, then you should set tagletpath to C:\taglets. This
example calls javadoc on package com.package1, including Table taglet tags:
C:\dev\Work\java\taglet>javadoc taglet com.rgagnon.taglet.Table
tagletpath c:\dev\work\java\taglet com.package1

Download this taglet here.

4.52 Generate the Javadoc "en franais"Tag(s):


Environment Environment Internationalization
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0437.html
The javadoc utility uses the regular Java mechanism to internationalize its output. The tools.jar in
the lib directory contains the resource bundle standard.properties used by Javadoc to generated the
labels. To add a new language, you need to create the appropriate resource bundle, in our case for
french, we need a file called standard_fr.properties.
The new file must be in the package com.sun.tools.doclets.standard.resources.
Extract from tools.jar, the standard.properties files (keep the directory structure). Copy it under the
name standard_fr.properties. Translate it (or you can download my "incomplete" version here).
[standard.properties (extract)]
doclet.Window_Split_Index={0}\: {1}Index
doclet.Packages=Packages
doclet.SerialData=Serial Data\:
doclet.Since=Since\:
doclet.Warn_inline_taglet=Inline tag {0} should only be used with a {1}.
doclet.ClassUse_Subinterface=Subinterfaces of {0} in {1}
doclet.Frame_Version=Frame version
doclet.Generated_Docs_Untitled=Generated Documentation (Untitled)

[standard_fr.properties (extract)]
doclet.Window_Split_Index={0}\: {1}Index
doclet.Packages=Paquetages
doclet.SerialData=Donn\u00E9e s\u00E9rialis\u00E9e\:
doclet.Since=Depuis\:
doclet.Warn_inline_taglet=Inline tag {0} should only be used with a {1}.
doclet.ClassUse_Subinterface=Sousinterfaces de {0} dans {1}
doclet.Frame_Version=Version avec cadres

4.52 Generate the Javadoc "en franais"Tag(s): Environment Environment Internationalization

doclet.Generated_Docs_Untitled=Documentation g\u00E9n\u00E9r\u00E9e

Once everything translated, put your standard_fr.properties into the tools.jar making sure that the
file is located in the right package (along standard.properties in
com.sun.tools.doclets.standard.resources).
To generate in french, use the locale switch on the command line
javadoc locale fr ....

NOTE : Make sure the locale switch is the first one.


Using Ant,
<javadoc
locale="fr"
sourcefiles="c:/client/Client.java"
destdir="javadoc/Client"
author="true"
version="true"
use="true"
private="true"
windowtitle="Client">
<doctitle><![CDATA[<h1>Client</h1>]]></doctitle>
<bottom><![CDATA[<i>Copyright &#169; 2003 Real's Howto.</i>]]></bottom>
</javadoc>

4.53 Document a package using Javadoc Tag(s): Environment


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0502.html
Suppose I have a package called com.rgagnon with one HelloWorld class.
com
rgagnon
HelloWorld.java

In the directory containing HelloWorld.java, add a file called package.html.


This must be a complete HTML file (with HEAD and BODY). the first line of the body will be used a
the package description by javadoc.
<html><head></head><body>
this is <i>com.rgagnon</i> package description,
see <a href="http://www.rgagnon.com" target="_top">web site</a>
</body></html>

Now execute the javadoc utility located in [JDK]\bin directory from the root of the com.rgagnon
package.
4.53 Document a package using Javadoc Tag(s): Environment

\progra~1\Java\jdk1.5.0\bin\javadoc d javadoc0 linksource com.rgagnon

where d javadoc0 is used to specify the output directory and


linksource to create HTML version of the source file.
See the result.
Since JDK 1.5, to create a package comment file, you have a choice of two files to place your
comments:
packageinfo.java Can contain a package declaration, package annotations, package
comments and Javadoc tags. This file is new in JDK 5.0, and is preferred over
package.html.
package.html Can contain only package comments and Javadoc tags, no package
annotations.
See http://java.sun.com/j2se/1.5.0/docs/tooldocs/windows/javadoc.html#packagecomment

4.54 Display a comment in a JavadocTag(s): Environment


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0615.html
Use the numerical identity to represent the / in the javadoc section to avoid any conflict with a real
comment.
import java.awt.*;
public class Example {
/**
* Simple Frame
* <pre>
* &#47;* create a frame *&#47;
* Frame f = new Frame()
* </pre>
* @param args
*/
public static void main(String args[]){
Frame f = new Frame();
f.setSize(200,200);
f.setVisible(true);
}
}

and the javadoc output is :

You can represent any character with a numerical identity, the syntax is &#nnn; where nnn is the
Unicode code (decimal value) of the character.

4.54 Display a comment in a JavadocTag(s): Environment

4.55 Display XML in a javadocTag(s): Environment


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0623.html
Let's say you have a comment like this
/**
* To use this class use this XML
*
* <xml>
*
<parameter>foo</parameter>
*
<value>bar</value>
* </xml>
*
*/

The XML will not be visible since it will embedded in the HTML as tag and not as text.
With Javadoc 1.5, you can use the {@code ... } command. :
/**
* To use this class use this XML
* <pre>
* {@code
* <xml>
*
<parameter>foo</parameter>
*
<value>bar</value>
* </xml>
* }
* </pre>
*/

With the previous versions, one way was to add a space after the <.
/**
* To use this class use this XML
* <pre>
* < xml>
*
< parameter>foo< /parameter>
*
< value>bar< /value>
* < /xml>
* }
* </pre>
*/

4.55 Display XML in a javadocTag(s): Environment

4.56 Add a copyright notice to a JavadocTag(s): Environment


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0626.html
Use the bottom parameter to the javadoc command line.
bottom '<font size="1"><a href="http://www.rgagnon.com">Reals HowTo</a>
<br>&copy; 2008 rgagnon.com</font>'

The result looks like this :

4.57 Use a Log fileTag(s): Environment


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0501.html
Since 1.4, a logging functionnality is included with the JDK. It's the java.util.logging package.
import java.util.logging.*;
import java.io.*;
public class TestLog {
public static Logger logger;
static {
try {
boolean append = true;
FileHandler fh = new FileHandler("TestLog.log", append);
//fh.setFormatter(new XMLFormatter());
fh.setFormatter(new SimpleFormatter());
logger = Logger.getLogger("TestLog");
logger.addHandler(fh);
}
catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String args[]) {
logger.severe("my severe message");
logger.warning("my warning message");
logger.info("my info message");
}
}

and the result is


20050228 21:19:28 TestLog main

4.56 Add a copyright notice to a JavadocTag(s): Environment

GRAVE: my severe message


20050228 21:19:28 TestLog main
ATTENTION: my warning message
20050228 21:19:28 TestLog main
INFO: my info message

if the XMLFormatter is in use then the output is


<?xml version="1.0" encoding="windows1252" standalone="no"?>
<!DOCTYPE log SYSTEM "logger.dtd">
<log>
<record>
<date>20050228T21:21:09</date>
<millis>1109643669250</millis>
<sequence>0</sequence>
<logger>TestLog</logger>
<level>SEVERE</level>
<class>TestLog</class>
<method>main</method>
<thread>10</thread>
<message>my severe message</message>
</record>
<record>
<date>20050228T21:21:09</date>
<millis>1109643669328</millis>
<sequence>1</sequence>
<logger>TestLog</logger>
<level>WARNING</level>
<class>TestLog</class>
<method>main</method>
<thread>10</thread>
<message>my warning message</message>
</record>
<record>
<date>20050228T21:21:09</date>
<millis>1109643669328</millis>
<sequence>2</sequence>
<logger>TestLog</logger>
<level>INFO</level>
<class>TestLog</class>
<method>main</method>
<thread>10</thread>
<message>my info message</message>
</record>
</log>

to customize the output, you can provide you own formatter


import java.util.logging.*;
import java.io.*;
public class TestLog {
public static Logger logger;
static {
try {
boolean append = true;
FileHandler fh = new FileHandler("TestLog.log", append);
fh.setFormatter(new Formatter() {
public String format(LogRecord rec) {
StringBuffer buf = new StringBuffer(1000);

4.56 Add a copyright notice to a JavadocTag(s): Environment

buf.append(new java.util.Date());
buf.append(' ');
buf.append(rec.getLevel());
buf.append(' ');
buf.append(formatMessage(rec));
buf.append('\n');
return buf.toString();
}
});
logger = Logger.getLogger("TestLog");
logger.addHandler(fh);
}
catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String args[]) {
logger.severe("my severe message");
logger.warning("my warning message");
logger.info("my info message");
}
}

then the output is


Mon Feb 28 21:30:54 EST 2005 SEVERE my severe message
Mon Feb 28 21:30:54 EST 2005 WARNING my warning message
Mon Feb 28 21:30:54 EST 2005 INFO my info message

To limit the log file size and set a rolling pattern


int limit = 1000000; // 1 Mb
int numLogFiles = 3;
FileHandler fh = new FileHandler("TestLog%g.log", limit, numLogFiles);

will give TestLog0.log, TestLog1.log and so on.


Default values are defined in JRE_HOME/lib/logging.properties. To use a different properties file,
you specify a filename with the java.util.logging.config.file system property.
java Djava.util.logging.config.file=mylogging.props TestLog

To suppress the logging output to the console


Logger rootLogger = Logger.getLogger("");
Handler[] handlers = rootLogger.getHandlers();
if (handlers[0] instanceof ConsoleHandler) {
rootLogger.removeHandler(handlers[0]);
}

or modify the logging.properties file located in JRE_HOME/lib (default).


Look for the property handlers and remove the value java.util.logging.ConsoleHandler
You may want to take a look at another popular logging mechanism : Log4J.
See also this HowTo and this one

4.56 Add a copyright notice to a JavadocTag(s): Environment

4.58 Trace the executionTag(s): Environment


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0301.html
Generate a StackTrace and then parse the StackTraceElements.
[LogUtils.java]
public class LogUtils {
private static final String NEWLINE = System.getProperty("line.separator");
private LogUtils (){

public static String getStack(int deep) {


// deep = 0 no level, only current calling method
//
n
from "n" levels
StringBuilder sb = new StringBuilder();
StackTraceElement ste [] = Thread.currentThread().getStackTrace();
int k = 2; // startingpoint 0:getstacktrace() 1: getStack()
int j = ste.length 1;
// process the stack
if (deep > j) deep = j;
else deep = deep + k;
while (k <= deep) {
String line = ste[k].toString();
sb.append(line + NEWLINE);
k++;
}
return sb.toString();
}
public static void main(String args[]){
Test test = new Test();
test.doit();
}
}
class Test {
public void doit() {
System.out.println("*Howto Trace only 1 level\n" + LogUtils.getStack(1));
System.out.println("*Howto Trace only 10 levels\n" + LogUtils.getStack(10));
System.out.println("*Howto Trace no level (current)\n" + LogUtils.getStack(0));
}
}

And the output should be


*Howto Trace only 1 level
Test.doit(LogUtils.java:35)
LogUtils.main(LogUtils.java:29)

4.58 Trace the executionTag(s): Environment

*Howto Trace only 10 levels


Test.doit(LogUtils.java:36)
LogUtils.main(LogUtils.java:29)
*Howto Trace no level (current)
Test.doit(LogUtils.java:37)

4.59 Time the executionTag(s): Environment


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0132.html
public class ExecutionTimer {
private long start;
private long end;
public ExecutionTimer() {
reset();
}
public void start() {
start = System.currentTimeMillis();
}
public void end() {
end = System.currentTimeMillis();
}
public long duration(){
return (endstart);
}
public void reset() {
start = 0;
end
= 0;
}
public static void main(String s[]) {
// simple example
ExecutionTimer t = new ExecutionTimer();
t.start();
for (int i=0; i < 80; i++){ System.out.print(".");}
t.end();
System.out.println("\n" + t.duration() + " ms");
}
}

See this HowTo to format a duration in ms into a string as "Days , Hours , minutes and seconds".

4.59 Time the executionTag(s): Environment

4.60 Log information efficiently (with Log4J)Tag(s): Environment


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0527.html
In production code, a good practice is to only log what is necessary in the context.
With Log4J, you can have different levels of message written into your log.
public class MyClass {
/**
* Logger log4j
*/
static Logger logger = Logger.getLogger(MyClass.class.getName());
...
logger.debug("I'm here");
logger.info(e.getMessage());
logger.warning("something wrong " + e.getMessage());
logger.error("omg " + e.getMessage());
...

While you can set the level in your code with something like
logger.setLevel(Level.WARN);

it's more flexible to do it from the Log4J properties file


; can be OFF, FATAL, ERROR, WARN, INFO, DEBUG, ALL
log4j.threshold=WARN

You put the properties file in the classpath and then from your code
URL url = ClassLoader.getSystemResource("log4j.props");
PropertyConfigurator.configure(url);

Logging activities have a cost. Even if you set the level at DEBUG level, the logger.debug(...) is
interpreted. Consider this line :
logger.setLevel(Level.DEBUG);
logger.debug("something wrong with the value of " + myValue.toString());

the toString() method will be called and the result concatened to a String even if the DEBUG level is
disabled.
The best practice is to check if the level is enabled or not.
logger.setLevel(Level.DEBUG);
if (logger.isDebugEnabled()) {
logger.debug("something wrong with the value of " + myValue.toString());
}

4.60 Log information efficiently (with Log4J)Tag(s): Environment

This way you will not incur the cost of parameter construction if debugging is disabled for logger.
You can even remove the unwanted logging operation from the bytecode! See this HowTo.

Finally it's a good idea to design a robust toString() method for your class like this one :
public String toString(){
StringBuffer sb = new StringBuffer();
sb.append(getClass().getName())
sb.append(" myValue=[").append(this.myValue).append("]");
sb.append(" anotherValue=[").append(this.anotherProperty).append("]");
return sb.toString();
}

even if myValue is null, this toString() method will display "null" as the value and not throw a
NullPointerExeception.
See also this HowTo and this one

4.61 Change the logging level onthefly (Log4J)Tag(s):


Environment
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0621.html
While you can set the logging level through the configuration properties file
; can be OFF, FATAL, ERROR, WARN, INFO, DEBUG, ALL
log4j.threshold=WARN

It may be useful to change it onthefly for debugging purpose. You need to get the Log4J "root"
Logger and then change its "level".
...
setLogLevel("DEBUG");
...
setLogLevel("INFO");
...
private void setLogLevel(String level) {
Logger root = Logger.getRootLogger();
if ("DEBUG".equals(level)) {
root.setLevel(org.apache.log4j.Level.DEBUG);
}
else {
root.setLevel(org.apache.log4j.Level.INFO);
}
}

4.61 Change the logging level onthefly (Log4J)Tag(s): Environment

4.62 Enable debug log level on OpenSource package(Apache


Commons Logging)Tag(s): Environment
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/javaenabledebuglogging.html
Typically, Apache products are using the Apache Commons Logging.
You can enable the logging at the DEBUG level by simply setting 2 environment variable.
For example, if you have something using the Axis library to do a Web Service call, then
java.exe Dorg.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog
Dorg.apache.commons.logging.simplelog.defaultlog=debug
MyClassUsingAxis

will launch the program and output to stdout the debugging information.

[DEBUG] ProjectResourceBundle getBundle(org.apache.axis,org.apache.axis.i18n,resource,null,.


[DEBUG] ProjectResourceBundle loadBundle: Ignoring MissingResourceException: Can't find bund
[DEBUG] ProjectResourceBundle Created org.apache.axis.i18n.resource, linked to parent null
[DEBUG] ProjectResourceBundle getBundle(org.apache.axis,org.apache.axis.utils,resource,null,
[DEBUG] ProjectResourceBundle loadBundle: Ignoring MissingResourceException: Can't find bund
[DEBUG] ProjectResourceBundle org.apache.axis.i18n.resource::handleGetObject(setMsgForm)
[DEBUG] SOAPPart Setting current message form to: FORM_STRING (currentMessage is now <?xml v
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://w
<soapenv:Header>
<ns1:biBusHeader soapenv:mustUnderstand="0" xmlns:ns1="http://developer.cognos.com/schemas/bi
</soapenv:Header>
<soapenv:Body>
<ns2:logon soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns2="http:
...
[DEBUG]
[DEBUG]
[DEBUG]
[DEBUG]
[DEBUG]

HTTPSender
HTTPSender
HTTPSender
HTTPSender
HTTPSender

HTTP/1.1 405 Method Not Allowed


Allow OPTIONS, TRACE, GET, HEAD
ContentLength 1564
ContentType text/html
Server MicrosoftIIS/6.0

...

It's possible to enable only the logging for HTTP activities.


Dorg.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog
Dorg.apache.commons.logging.simplelog.showdatetime=true
Dorg.apache.commons.logging.simplelog.log.httpclient.wire=debug
Dorg.apache.commons.logging.simplelog.log.org.apache.commons.httpclient=debug
2009/08/21 12:15:56:109 EDT [DEBUG] header >> "SOAPAction: urn:GeteBayOfficialTime[\r][\n]"
2009/08/21 12:15:56:109 EDT [DEBUG] header >> "UserAgent: Axis2[\r][\n]"

4.62 Enable debug log level on OpenSource package(Apache Commons Logging)Tag(s): Environment

2009/08/21
2009/08/21
2009/08/21
2009/08/21

12:15:56:109
12:15:56:109
12:15:56:109
12:15:56:109

EDT
EDT
EDT
EDT

[DEBUG]
[DEBUG]
[DEBUG]
[DEBUG]

header
header
header
header

>>
>>
>>
>>

"Host: api.sandbox.ebay.com[\r][\n]"
"ContentLength: 1546[\r][\n]"
"ContentType: text/xml; charset=UTF8[\r][\n]"
"[\r][\n]"

Apache PDFBox emits a lot of infos in debug mode.


To remove the debug mode for PDFBox :
if (logger.isDebugEnabled()) {
Logger logpdfengine = Logger.getLogger("org.apache.pdfbox.util.PDFStreamEngine");
logpdfengine.setLevel(org.apache.log4j.Level.OFF);
}

4.63 Use a JAR/ZIP/CAB file with an AppletTag(s): Environment


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0153.html
[JAR format]
JAR (Java ARchive) is a platformindependent file format that allows you to bundle a Java applet
and its requisite components (.class files, images and sounds) into a single JAR file. JAR supports
compression, which reduces the file size, further improving the download time.
The applet author can digitally sign individual entries in a JAR file to authenticate their origin (using
the JAVAKEY utility). However, to sign JAR to be used with a "realworld" browser (eg. Netscape),
you must use Netscape's utilities ZIGbert or GUI JAR Archiver to sign it. These utilities can be freely
downloaded from the Netscape Web site. For more infos about signing Applet for Netscape, check
this JAVA Howto.
The browser need to be JDK1.1 compatible to handle JAR file.
If a JAR file is used with an Applet, the browser will look first into the JAR to load all classes. If the
search fails in the JAR file, then the browser looks in the applet's base directory. To specify the use
of a JAR file with an applet:
<APPLET CODE=a.class
ARCHIVE="abc.jar"
WIDTH=100
HEIGHT=100>
</APPLET>

In theory, you can specify many JARs in one ARCHIVE tag. But the current version of Netscape will
only load the first JAR and ignore the others.
Microsoft IEv4 can handle multiple JAR files.
In an application, simply include the JAR in the CLASSPATH :
4.63 Use a JAR/ZIP/CAB file with an AppletTag(s): Environment

java classpath c:\jdk1.1.3\lib\classes.zip;.;.\HelloWorld.jar HelloWorld

To create a JAR file (compressed), use the JAR utility included with JDK1.1
jar cvf abc.jar a.class b.class c.class
According to some JAVA developers, JAR in CLASSPATH needs to be uncompressed (JDK1.1). To create uncompressed JAR:

jar cvfO myArchive.jar *.class

[ZIP format]
JDK1.0.2 introduces the ZIP "uncompressed" format. To create an archive, simply use a ZIP tool
that supports the long filename format and specify the ZERO compression mode. You can use
Sun's JAR utility (included with JDK1.1) to create a JDK1.0.2 compatible ZIP file:
jar cvfO myArchive.zip *.class

or check for InfoZIP at http://www.cdrom.com/pub/infozip/


To use a ZIP archive, simply use the HTML ARCHIVE tag
<APPLET CODE="a.class"
ARCHIVE="abc.zip"
WIDTH=618
HEIGHT=410>
</APPLET>

[CAB format]
CAB (for CABINET) is used only by Microsoft Internet Explorer. It offers compression (like the JAR
but the ZIP format is uncompressed). To create a CAB file, use the CABARC utility from Microsoft :
CABARC n myArchive.cab *.*

to create myArchive.cab.
It is possible sign a CAB file using the Authenticode mechanism, check the Microsoft Web site for
more infos.
To associate a CAB file with an Applet, simply use the HTML :
<APPLET CODE="a.class"
WIDTH=100
HEIGHT=100>
<PARAM
NAME="cabbase"
VALUE="abc.cab">
</APPLET>

the cabbase parameter will be interpreted only by MSIE, nonMS browsers browser will simply
ignore it.
An Applet can support ZIP and CAB format by using the following HTML:
<APPLET
CODEBASE="."
ARCHIVE=abc.zip
CODE=a.class

4.63 Use a JAR/ZIP/CAB file with an AppletTag(s): Environment

width=610
height=600 >
<PARAM NAME="cabbase" VALUE="abc.cab">
</APPLET>

while Netscape will use the ZIP file and ignore de CAB parameter, MSIE will use CAB and ignore
the ZIP file.

4.64 Make ZIP/JAR file always accessible from appletTag(s):


Environment
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0154.html
[Netscape 4]
Manual method
Copy the ZIP/JAR file in the PLUGINS directory and remove the reference in the ARCHIVE
parameter of the APPLET tag.
For example, to be able use SWING classes from Netscape, copy SWING.JAR and ROSE.JAR in
the PLUGINS directory and restart Netscape.
Automatic method
Automatic installation can be done with Netscape using the SmartUpdate mechanism. The JAR
must be signed with the Netscape Signing Tool.Check the following links for more infos:
http://developer.netscape.com/docs/manuals/communicator/jarman/
http://developer.netscape.com/docs/manuals/signedobj/overview.html

4.65 Make a JAR executableTag(s): Environment


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0166.html
In the manifest file of a JAR, it is possible to specify the class to be used when the JVM is lauched
with the JAR as parameter. The class must have a main().
Try with this simple class
import java.awt.*;
import java.awt.event.*;

4.64 Make ZIP/JAR file always accessible from appletTag(s): Environment

public class MyClass {


public static void main(String[] args) {
Frame f = new Frame();
f.addWindowListener
(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
);
f.add(new Label("Hello world"));
f.setSize(200,200);
f.setVisible(true);
}
}

Then create this manifest file (manifest.mft) with any text editor.
ManifestVersion: 1.0
MainClass: MyClass
Classpath: .

MainClass specifies the entry point with the main(String args[]) method.
The Classpath is used to specify the dependency of this jar (if any). You add the directories and
jars separated by a space. It is important because when running a jar , the CLASSPATH definition
(as defined by the environnement variable) is overridden.
Next, you include the manifest file in the JAR (MyJar.jar) with the MyClass class.
jar cvfm myjar.jar manifest.mft *.class

Then you are able to start the MyClass.class by doubleclicking on the MyJar.jar file (if the JRE is
correctly installed) or by typing
java jar myjar.jar

If you need to pass parameters, use the D switch before the jar switch and use the getProperty()
method to get the value.
The file association mechanism is made during the installation of the JRE.
You can verify that everything is ok with the following command from a DOS Shell
>assoc .jar
.jar=jarfile
>ftype jarfile
jarfile="C:\Program Files\Java\jre1.5.0_10\bin\javaw.exe" jar "%1" %*

If the association is broken or you need to change the JRE used then by using the assoc/ftype
utilities, you can modify the association easily (use /? to display the syntax of the assoc and ftype
utilities).
NOTE: On WinXp (or better), your user account needs to be at the Admin level.

4.64 Make ZIP/JAR file always accessible from appletTag(s): Environment

On Windows (NT or better), you can also make JARs run from the commandline by setting the
PATHEXT environment variable, for example
SET PATHEXT=.EXE;.BAT;.CMD;.JAR

Then if you have the jar file MyJar.jar accessible via the PATH environment variable, typing "MyJar"
on the DOS command line will invoke "javaw jar MyJar.jar" .

4.66 Accessing jars from within a jarTag(s): Environment


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0319.html
Supposed we have a jar called Main.jar for the application. This application needs Second.jar and
Third.jar . In the manifest file of the first jar (Main.jar), you adjust the ClassPath setting :
ManifestVersion: 1.0
MainClass: MyClass
ClassPath: Second.jar Third.jar

The value of the ClassPath attribute specifies the relative URLs of the extensions or libraries that
this application or extension needs. URLs are separated by one or more spaces. The application or
extension class loader uses the value of this attribute to construct its internal search path.
You can use the i option to speed up your application's class loading time:
jar i main.jar

This will build an an INDEX.LIST file in the METAINF directory which will enable the application
class loader to download the right jar files when it is searching for classes or resources.

4.67 Access a JAR outside the CLASSPATHTag(s): Environment


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0409.html
import java.net.*;
import java.io.*;
public class ExtraLoader {
public static void main(String[] args) {
try {
URL urlA =

4.66 Accessing jars from within a jarTag(s): Environment

new File("C:/xtras/xercesImpl.jar").toURL();
URL urlB =
new File("C:/xtras/xmlParserAPIs.jar").toURL();
URL[] urls = { urlA,urlB };
URLClassLoader ulc = new URLClassLoader(urls);
//
Class c = Class.forName
("org.apache.xerces.dom.ChildNode", true, ulc);
//
System.out.println(c.getName());
}
catch(Exception e) {
e.printStackTrace();
}
}
}

4.68 Extract a file from a JarTag(s): IO Environment


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0429.html
The following snippet extract a file (mydb.mdb) from a jar.
import java.io.*;
import java.util.jar.*;
import java.util.zip.*;

public class ExtractFromJAR {


public void extractMyMDBromJAR(String dest){
try {
String home = getClass().getProtectionDomain().
getCodeSource().getLocation().toString().
substring(6);
JarFile jar = new JarFile(home);
ZipEntry entry = jar.getEntry("mydb.mdb");
File efile = new File(dest, entry.getName());
InputStream in =
new BufferedInputStream(jar.getInputStream(entry));
OutputStream out =
new BufferedOutputStream(new FileOutputStream(efile));
byte[] buffer = new byte[2048];
for (;;) {
int nBytes = in.read(buffer);
if (nBytes <= 0) break;
out.write(buffer, 0, nBytes);
}
out.flush();
out.close();
in.close();
}

4.68 Extract a file from a JarTag(s): IO Environment

catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String args []){
new ExtractFromJAR().extractMyMDBFromJAR(".");
}
}

Grab this autorun Jar if you want to try it.


To create an autorun JAR, first create a manifest.mft
ManifestVersion: 1.0
Classpath: .\mydb.jar
MainClass: ExtractFromJAR

Create the JAR


C:\jdk141\bin\jar cvfm mydb.jar manifest.mft ExtractFromJAR.class mydb.mdb

Run it ... and the mydb.mdb file should appear in the current directory.
java jar mydb.jar

(A tip from Fred Hommersom) Your code reads:


String home = getClass().getProtectionDomain().
getCodeSource().getLocation().toString().substring(6);

I got a problem when the jar file was located in C:\Program Files\xyz due to the embedded space.
So I modified the code to
String home = getClass().getProtectionDomain()
.getCodeSource().getLocation()
.getPath().replaceAll("%20", " ");

4.69 Determine if running from JARTag(s): Environment


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0391.html
package com.rgagnon;
public class HelloClass {
public static void main(String[] args) {
new HelloClass().say();
}

4.69 Determine if running from JARTag(s): Environment

public void say() {


String className = this.getClass().getName().replace('.', '/');
String classJar =
this.getClass().getResource("/" + className + ".class").toString();
if (classJar.startsWith("jar:")) {
System.out.println("*** running from jar!");
}
System.out.println(classJar);
}
}

The output
>jar cvfm Hello.jar manifest.mft com\rgagnon\HelloClass.class
added manifest
adding: com/rgagnon/HelloClass.class (in=1059) (out=601) (deflated 43%)
>java com.rgagnon.HelloClass
file:/C:/DEV/WORK/JAVA/com/rgagnon/HelloClass.class
>java jar Hello.jar
*** running from jar!
jar:file:/C:/DEV/WORK/JAVA/Hello.jar!/com/rgagnon/HelloClass.class

Here a variation on this subject, a method to return the name of the current running jar.
package com.rgagnon.howto;
public class RunningJar {
public static void main(String[] args) {
String runningJarName = new RunningJar().getRunningJarName();
if (runningJarName != null) {
System.out.println("Running from " + runningJarName);
}
else {
System.out.println("Not running from a jar");
}
}
public String getRunningJarName() {
String className = this.getClass().getName().replace('.', '/');
String classJar =
this.getClass().getResource("/" + className + ".class").toString();
if (classJar.startsWith("jar:")) {
String vals[] = classJar.split("/");
for (String val: vals) {
if (val.contains("!")) {
return val.substring(0, val.length() 1);
}
}
}
return null;
}
}
/*
output :
>java jar yop.jar
Running from yop.jar
>ren yop.jar yip.jar

4.69 Determine if running from JARTag(s): Environment

>java jar yip.jar


Running from yip.jar
*/

See these related HowTo's : 1 2

4.70 Get list of classes in package (in a Jar)Tag(s): Environment


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0513.html
import java.util.jar.*;
import java.util.*;
import java.io.*;
public class PackageUtils {
private static boolean debug = true;
public static List getClasseNamesInPackage
(String jarName, String packageName){
ArrayList classes = new ArrayList ();
packageName = packageName.replaceAll("\\." , "/");
if (debug) System.out.println
("Jar " + jarName + " looking for " + packageName);
try{
JarInputStream jarFile = new JarInputStream
(new FileInputStream (jarName));
JarEntry jarEntry;
while(true) {
jarEntry=jarFile.getNextJarEntry ();
if(jarEntry == null){
break;
}
if((jarEntry.getName ().startsWith (packageName)) &
(jarEntry.getName ().endsWith (".class")) ) {
if (debug) System.out.println
("Found " + jarEntry.getName().replaceAll("/", "\\."));
classes.add (jarEntry.getName().replaceAll("/", "\\."));
}
}
}
catch( Exception e){
e.printStackTrace ();
}
return classes;
}
/**

4.70 Get list of classes in package (in a Jar)Tag(s): Environment

*
*/
public static void main (String[] args){
List list = PackageUtils.getClasseNamesInPackage
("C:/j2sdk1.4.1_02/lib/mail.jar", "com.sun.mail.handlers");
System.out.println(list);
/*
output :
Jar C:/j2sdk1.4.1_02/lib/mail.jar looking for com/sun/mail/handlers
Found com.sun.mail.handlers.text_html.class
Found com.sun.mail.handlers.text_plain.class
Found com.sun.mail.handlers.text_xml.class
Found com.sun.mail.handlers.image_gif.class
Found com.sun.mail.handlers.image_jpeg.class
Found com.sun.mail.handlers.multipart_mixed.class
Found com.sun.mail.handlers.message_rfc822.class
[com.sun.mail.handlers.text_html.class,
com.sun.mail.handlers.text_xml.class, com
.sun.mail.handlers.image_jpeg.class,
, com.sun.mail.handlers.message_rfc822.class]
*/
}
}

4.71 Add version to Jar packagingTag(s): Environment


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0388.html
Let's say we have the following class (package is mandatory)
package com.rgagnon;
public class Hello {
public static void main(String[] args) {
new Hello().say("Hello World!");
}
public void say(String s) {
System.out.println(s);
}
}

First create a MANIFEST.MF file :


ManifestVersion: 1.0
MainClass: com.rgagnon.Hello

Then build the executable Jar and run it.


>jar cvfm hello.jar MANIFEST.MF com\rgagnon\Hello.class

4.71 Add version to Jar packagingTag(s): Environment

>java jar hello.jar


Hello World!

Now modify the manifest to include versioning information.


ManifestVersion: 1.0
MainClass: com.rgagnon.Hello
SpecificationVersion: 2.1
ImplementationVersion: 1.1

Modify the class to display the version.


package com.rgagnon;
public class Hello {
public static void main(String[] args) {
new Hello().say("Hello World!");
}
Hello() {
Package p = this.getClass().getPackage();
System.out.println("Hello Specification Version : "
+ p.getSpecificationVersion());
System.out.println("Hello Implementation Version : "
+ p.getImplementationVersion());
}
public void say(String s) {
System.out.println(s);
}
}

Compile and rebuild the Jar and execute


> jar cvfm hello.jar MANIFEST.MF com\rgagnon\Hello.class
> java jar hello.jar
Specification Version : 2.1
Implementation Version : 1.1
Hello World!

See also this Howto.


This example opens a given Jar and outputs its version information.
package com.rgagnon.howto;
import java.util.jar.*;
public class JarUtils {
public static String getJarImplementationVersion(String jar)
throws java.io.IOException
{
JarFile jarfile = new JarFile(jar);
Manifest manifest = jarfile.getManifest();
Attributes att = manifest.getMainAttributes();
return att.getValue("ImplementationVersion");
}

4.71 Add version to Jar packagingTag(s): Environment

public static String getJarSpecificationVersion(String jar)


throws java.io.IOException
{
JarFile jarfile = new JarFile(jar);
Manifest manifest = jarfile.getManifest();
Attributes att = manifest.getMainAttributes();
return att.getValue("SpecificationVersion");
}
public static void main(String[] args) throws java.io.IOException{
String javaMailJar = "C:/Program Files/Java/jre1.5.0/lib/mail.jar";
System.out.println("SpecificationVersion: "
+ JarUtils.getJarSpecificationVersion(javaMailJar));
System.out.println("ImplementationVersion: "
+ JarUtils.getJarImplementationVersion(javaMailJar));
/*
* output :
*
SpecificationVersion: 1.3
*
ImplementationVersion: 1.3.1
*/
}
}

4.72 Use ANT to Build a JAR with version/build numberTag(s):


Environment
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0532.html
Download ANT from http://ant.apache.org/bindownload.cgi
Unzip into the root of C: (Windows), rename the folder to \Ant
Create a file call antenv.cmd. Before using ANT, you must execute this file to set up the
environment. You may need to adjust the values according to your installation!
set ANT_HOME=c:\ant
set JAVA_HOME=C:\Progra~1\Java\jdk1.5.0
set PATH=%ANT_HOME%\bin;%JAVA_HOME%\bin;%path%

Create a simple Hello class as shown below (you need have a package).
package howto;
public class Hello {
public static void main( String[] args ){
System.out.println( "Hello World" );
}
}

Execute your antenv.cmd to set the environment


Compile your Hello class and make a jar to check if your environment is ok.
> javac howto/Hello.java
> jar cvf hello.jar howto/Hello.class
added manifest
adding: howto/hello.class(in = 415) (out= 284) (deflated 31%)
> java cp hello.jar howto.Hello
Hello World

Create a build.xml which is the default ant build file ...


4.72 Use ANT to Build a JAR with version/build numberTag(s): Environment

... and load it into your favorite editor. Type the following ant script and save it.
<project default="buildHello">
<target name="compile">
<javac srcdir="." />
</target>
<target name="buildHello" depends="compile" />
</project>

Go back to the DOS shell and launch Ant with


> ant compile
Buildfile: build.xml
compile:
[javac] Compiling 1 source file

Go back to the editor and add the jar building command. The target compile is also executed
since the target jar depends on it.
<project default="buildHello">
<target name="compile">
<javac srcdir="." />
</target>
<target name="jar" depends="compile">
<jar destfile="hello.jar"
basedir="."
includes="**/*.class"
/>
</target>
<target name="buildHello" depends="compile,jar" />
</project>

Execute your Ant script :


> ant jar
Buildfile: build.xml
compile:
jar:
[jar] Building jar: /Dev/hello.jar
BUILD SUCCESSFUL
Total time: 2 seconds
$ jar tvf hello.jar
jar tvf hello.jar
0 Wed May 03 17:06:32
55 Wed May 03 17:06:32
55 Wed May 03 17:06:32
335 Wed May 03 16:36:16

EST
EST
EST
EST

2006
2006
2006
2006

METAINF/
METAINF/MANIFEST.MF
howto/
howto/Hello.class

Try your new Jar file


> java cp Hello.jar howto.Hello
Hello World

Make your Jar autoexecutable by specifying the Main class into a MANIFEST.MF file to be
included in the Jar. Add the following lines to build.xml
<project default="buildHello">
<target name="compile">
<javac srcdir="." />
</target>
<target name="jar" depends="compile">
<delete file="hello.jar"/>

4.72 Use ANT to Build a JAR with version/build numberTag(s): Environment

<delete file="MANIFEST.MF"/>
<manifest file="MANIFEST.MF">
<attribute name="BuiltBy" value="${user.name}"/>
<attribute name="MainClass" value="howto.Hello"/>
</manifest>
<jar destfile="hello.jar"
basedir="."
includes="**/*.class"
manifest="MANIFEST.MF"
/>
</target>
<target name="buildHello" depends="compile,jar" />
</project>

Now you can launch Hello with only


> ant jar
...
> java jar hello.jar
Hello World

Add a build number with the Ant task buildnumber . Ant will create (if necessary) and increment a
property in a file called build.num (so you need to keep it!). Then a property, build.number, is
available in your Ant script. The version number is also a property. Here it is hardcoded in the
script but you can read it from a file.
<project default="buildHello">
<target name="compile">
<javac srcdir="." />
</target>
<target name="jar" depends="compile">
<delete file="hello.jar"/>
<delete file="MANIFEST.MF"/>
<property name="version.num" value="1.00"/>
<buildnumber file="build.num"/>
<manifest file="MANIFEST.MF">
<attribute name="BuiltBy" value="${user.name}"/>
<attribute name="MainClass" value="howto.Hello"/>
<attribute name="ImplementationVersion"
value="${version.num}b${build.number}"/>
</manifest>
<jar destfile="hello.jar"
basedir="."
includes="**/*.class"
manifest="MANIFEST.MF"
/>
</target>
<target name="buildHello" depends="compile,jar" />
</project>

If you examine the MANIFEST.MF, you now see a new entry


ImplementationVersion: 1.00b1

and after the next build operation, the entry will be


ImplementationVersion: 1.00b2

Modify the Hello class to read the ImplementationVersion information and display it.
package howto;
public class Hello {
public static void main( String[] args ){
System.out.println( "Hello World ");
System.out.println("version : " +

4.72 Use ANT to Build a JAR with version/build numberTag(s): Environment

Hello.class.getPackage().getImplementationVersion() );
}
}

Finally we add a target to cleanup and the main target to build everything to the build.xml file.
<project default="buildHello">
<target name="compile">
<javac srcdir="." />
</target>
<target name="jar">
<delete file="hello.jar"/>
<property name="version.num" value="1.00"/>
<buildnumber file="build.num"/>
<manifest file="MANIFEST.MF">
<attribute name="BuiltBy" value="${user.name}"/>
<attribute name="MainClass" value="howto.Hello"/>
<attribute name="ImplementationVersion"
value="${version.num}b${build.number}"/>
</manifest>
<jar destfile="hello.jar"
basedir="."
includes="**/*.class"
manifest="MANIFEST.MF"
/>
</target>
<target name="cleanup">
<delete>
<fileset dir="." includes="**/*.class"/>
<fileset file="MANIFEST.MF"/>
</delete>
</target>
<target name="buildHello" depends="compile,jar,cleanup" />
</project>

Build and launch the Hello class


> ant buildHello
...
> java jar hello.jar
Hello World
version : 1.00b3

b3 == build #3 (if it's your third build !)


Build number is great but a Built date is useful too!
...
<target name="jar">
<delete file="hello.jar"/>
<property name="version.num" value="1.00"/>
<buildnumber file="build.num"/>
<tstamp>
<format property="TODAY" pattern="yyyyMMdd HH:mm:ss" />
</tstamp>
<manifest file="MANIFEST.MF">
<attribute name="BuiltBy" value="${user.name}"/>
<attribute name="MainClass" value="howto.Hello"/>
<attribute name="ImplementationVersion"
value="${version.num}b${build.number}"/>

4.72 Use ANT to Build a JAR with version/build numberTag(s): Environment

<attribute name="BuiltDate" value="${TODAY}"/>


</manifest>
<jar destfile="hello.jar"
basedir="."
includes="**/*.class"
manifest="MANIFEST.MF"
/>
</target>
See also this Howto .

4.73 Include all jars in the classpath definitionTag(s):


Environment
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0587.html
Specifying all the required jar in the classpath can be a pain. Here some techniques to set the
classpath definition automatically.

4.74 Windows batch file


For Windows 2000 (or better), we need a set of 3 CMD files to scan a given directory and build
the classpath defintion with all the jars found.
main.cmd
@echo off
call buildclasspath.cmd .\lib
Echo The Classpath definition is %CLASSPATH%
...
java MyClass

buildclasspath.cmd
set _CLASSPATH=%CLASSPATH%
set CLASSPATH=%1
for %%i in ( %1\*.jar ) do call buildclasspath_append.cmd %%~fsi
if "%_CLASSPATH%" == "" goto END
set CLASSPATH=%_CLASSPATH%;%CLASSPATH%
:END

buildclasspath_append.cmd
set CLASSPATH=%CLASSPATH%;%1

4.73 Include all jars in the classpath definitionTag(s): Environment

With XP (or better), it's simpler ... a single batch file can do the job.
@echo off
setlocal ENABLEDELAYEDEXPANSION
if defined CLASSPATH (set CLASSPATH=%CLASSPATH%;.) else (set CLASSPATH=.)
FOR /R .\lib %%G IN (*.jar) DO set CLASSPATH=!CLASSPATH!;%%G
Echo The Classpath definition is %CLASSPATH%
...
java MyClass

4.75 JDK6
According to http://java.sun.com/javase/6/docs/technotes/tools/windows/java.html, there is a new
way to include jars in a given directory without explicitly to specify each one of them.
As a special convenience, a class path element containing a
basename of * is considered equivalent to specifying a list
of all the files in the directory with the extension .jar
or .JAR (a java program cannot tell the difference between
the two invocations).
For example, if directory foo contains a.jar and b.JAR, then
the class path element foo/* is expanded to a A.jar:b.JAR,
except that the order of jar files is unspecified. All jar files
in the specified directory, even hidden ones, are included in
the list. A classpath entry consisting simply of * expands to a
list of all the jar files in the current directory. The CLASSPATH
environment variable, where defined, will be similarly expanded.

Note : There is a bug when using this feature with JAVAW, see
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6510337
Note : Use quote to avoid problem during the wildcard expansion, ex. javac cp "C:\mylib\*"
HelloWorld.java

4.76 JAR (and ANT)


The best solution when you have a jar is to try to include the required jars into the manifest
declaration.
ManifestVersion: 1.0
ClassPath:
customer_client.jar
mailer_client.jar
signon_client.jar

The manifest file format restrictions mandated by the JDK requires the use of a space ' ' character
as the line continuation character, so ensure that your editor is not set up to trim trailing spaces
on saves and exits.
The line with the ClassPath: header must end with a space character and each of the lines
referencing the client jar's should start and end with a space ' ' character and the manifest file as
a whole must end with a blank line.
Remember that when you launch an application with
4.75 JDK6

java jar myjar.jar

the CLASSPATH definition (as defined by the environment variable) is overriden by the
"classpath" defined the jar's manifest.
See http://java.sun.com/docs/books/tutorial/deployment/jar/downman.html
Ant can be used to build your Jar and built the manifest classpath definition.
<target name="MyJar" depends="dist, compile" description="generate jar" >
<jar destfile="${dist}/${jar}">
<manifest>
<attribute name="MainClass" value="${Main_Class}"/>
<attribute name="ClassPath" value=". lib/utils.jar lib/client.jar" />
</manifest>
</jar>
</target>

It's possible (but not so simple) to do it automatically without specifying each jar one by one :
<path id="build.classpath">
<fileset dir="${basedir}"/>
<include name="lib/*.jar"/>
</fileset>
</path>
<pathconvert property="manifest.classpath" pathsep=" ">
<path refid="build.classpath"/>
<mapper>
<chainedmapper>
<flattenmapper/>
<globmapper from="*.jar" to="lib/*.jar"/>
</chainedmapper>
</mapper>
</pathconvert>
<target depends="compile" name="buildjar">
<jar jarfile="${basedir}/${test.jar}">
<fileset dir="${build}" />
<manifest>
<attribute name="MainClass" value="com.mycompany.TestMain"/>
<attribute name="ClassPath" value="${manifest.classpath}"/>
</manifest>
</jar>
</target>

Latest Ant version (1.7) includes a task called ManifestClassPath which converts a classpath into
a spaceseparated list of items used to set the Manifest ClassPath attribute. See
http://ant.apache.org/manual/CoreTasks/manifestclasspath.html

<path id="buildclasspath">
<fileset dir="${build.dir}">
<include name="*.jar"/>
</fileset>
</path>
<manifestclasspath property="lib.list" jarfile="${build.dir}/${jar.file}">
<classpath refid="buildclasspath" />
</manifestclasspath>

4.75 JDK6

<jar>
...
<manifest>
<attribute name="MainClass" value="com.mycompany.TestMain"/>
<attribute name="ClassPath" value=". ${lib.list}"/>
</manifest>
...
</jar>

4.77 Detect browser type from an AppletTag(s):


Applet Environment Javascript interaction
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/javadetectbrowsertypefromanapplet.html

4.78 Call a Javascript from the Applet


With LiveConnect, we call a javascript to return the "UserAgent".
To compile, make sure that you have the plugin.jar in the classpath (or Eclipse Build Path). This
jar is usually located in [JRE]/lib folder. During runtime, it's already included by the Java plugin so
you don't have to worry about that.
The Java class
import
import
import
import

java.applet.*;
java.awt.event.*;
java.awt.*;
netscape.javascript.*;

public class GetUserAgent extends Applet


implements ActionListener {
private static final long serialVersionUID = 1L;
TextField tf;
Button b1;
JSObject win;
public void init(){
setLayout(new FlowLayout());
tf = new TextField(35);
b1 = new Button("get useragent from javascript");
b1.addActionListener(this);
add(tf);add(b1);
}
public void actionPerformed(ActionEvent ae) {
if (ae.getSource() == b1) {

4.77 Detect browser type from an AppletTag(s): Applet Environment Javascript interaction

JSObject win = (JSObject)JSObject.getWindow(this);


tf.setText((String)win.eval("getUserAgent();"));
}
}
}

Don't forget the MAYSCRIPT parameter in the APPLET tag, it's required since the Applet is using
the JSObject to interact with the Javascript.
<html>
<head>
<script>
function getUserAgent() {
return navigator.userAgent;
}
</script>
</head><body>
<applet code="GetUserAgent.class" MAYSCRIPT height=100 width=500></Applet>
</body>
</html>

Try it here
You need to parse the returned value to detect browser type. Look at this utility,
http://code.google.com/p/useragentutils/ or at this code :
http://nerds.palmdrive.net/useragent/code.html to get the idea.

4.79 Get the value from the serverside


When serving the HTML containing the Applet, you add the UserAgent as parameter for the
Applet.
In a JSP/EL
<applet ... >
<param ... >
<param name="userAgent" value="${header['useragent']}" />
</applet>

and in the Applet


String userAgent = getParameter("userAgent");

and parse the returned value...

4.80 Detect if Java is enabled from HTMLTag(s): Environment


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0161.html
4.79 Get the value from the serverside

For a Javascript solution, check this Howto

<HTML><HEAD></HEAD><BODY>
<APPLET CODE="MyApplet.class"
NAME="myApplet"
HEIGHT=400 WIDTH=400 ALT="Oups! You don't have JAVA enabled">
<A HREF="nojava.html">Oups! You don't have JAVA enabled, click here.</A>
</APPLET>
</BODY></HTML>

4.81 See the Java Console Window Log (Java plugin)Tag(s):


Applet Environment
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0533.html
The Java Console Window Log is also stored on disk. On the Windows plateform, it's in the folder
:
C:\Documents and Settings\
<username>\
Application Data\
Sun\
Java\
Deployment\
log

It's a file with the extension .trace

Written and compiled Ral Gagnon 2007 [email protected]


http://www.rgagnon.com

4.81 See the Java Console Window Log (Java plugin)Tag(s): Applet Environment

5 Internationalization
5.1 javainter

5.2 Load resources based upon client environment at


startupTag(s): Internationalization
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0133.html
There are two ways to include resources based on the current Locale. One way is to use Properties
files and the other are classes extending the ListResourceBundle base class. You need to follow a
naming standard so that the JVM retrieves the right resources bundle.
Note that if a resource is missing for the current locale then the default definition is used.
[International.java (main program)]
import
import
import
import
import

javax.swing.*;
java.awt.*;
java.awt.event.*;
java.util.*;
java.text.*;

public class International extends JFrame


implements ActionListener
{
JLabel aLabel;
JLabel vLabel;
JCheckBox aCheckbox;
JButton aButton;
JButton vButton;
JTextField aTextField;
NumberFormat nf;
public void initGUI(){
setLayout(new FlowLayout());
// String
aLabel = new JLabel
(MyResources.rb.getString("aLabel"));
add(aLabel);
// Object
aCheckbox =
(JCheckBox)MyResources.rb.getObject("aCheckbox");
add(aCheckbox);
// String concatenation with MessageFormat
Date d = new Date();
MessageFormat mf = new MessageFormat
(MyResources.rb.getString("aButton"));
aButton = new JButton
(mf.format(new Object [] { d }));

5 Internationalization

add(aButton);
// Number format output
double dn = 3.1416;
nf = (NumberFormat)
(MyResources.rb.getObject("aNumber"));
aTextField = new JTextField(6);
add(aTextField);
aTextField.setText(nf.format(dn));
// Number input validation
vButton =
(JButton)MyResources.rb.getObject("vButton");
add(vButton);
vButton.addActionListener(this);
vLabel = new JLabel("validation message ...");
add(vLabel);
setSize(400,400);
}
public void actionPerformed(ActionEvent ae) {
if (ae.getSource() == vButton) {
try {
nf.parse(aTextField.getText());
vLabel.setText(MyResources.rb.getString("numOK"));
vLabel.invalidate();
this.validate();
}
catch (ParseException pe) {
pe.printStackTrace();
vLabel.setText(MyResources.rb.getString("numERR"));
vLabel.invalidate();
this.validate();
}
}
}
public static void main(String args[]) {
System.out.println("Current Local : " + Locale.getDefault());
Thread t = new Thread () {
public void run() {
International frame = new International();
frame.initGUI();
frame.setVisible(true);
}
};
SwingUtilities.invokeLater(t);
}
}

[MyResources.java (default resources)]


import java.util.*;
import javax.swing.*;
import java.text.*;
public class MyResources extends ListResourceBundle {
public static ResourceBundle rb =
ResourceBundle.getBundle("MyResources");

5 Internationalization

public Object [][] getContents() {


return contents;
}
static
{
{
{
{
{
{
{
};

final Object[][] contents = {


"myLabel" , "A Label" } ,
"aCheckbox", new JCheckBox("Yes") } ,
"aButton" , "Today {0,date,long}"},
"aNumber" , new DecimalFormat("0.####")},
"vButton" , new JButton("Validate number")},
"numOK"
, "Valid!" },
"numERR"
, "Invalid"}

[MyResources_en.java (english language resources)]


The classname format is [name][language ID][country code].java.
You can retrieve a list of language IDs and country codes at the Unicode organization Web site

import java.util.*;
public class MyResources_en extends ListResourceBundle {
public Object [][] getContents() {
return contents;
}
static final Object[][] contents = {
{ "aLabel"
, "a Label (en)" }
};
}

[MyResources_fr.java (french language resources)]


import java.util.*;
import javax.swing.*;
public class MyResources_fr extends ListResourceBundle {
public Object [][] getContents() {
return contents;
}
static final Object[][] contents = {
{ "aLabel"
, "une tiquette (fr)" } ,
{ "aCheckbox", new JCheckBox("Oui (fr)")} ,
{ "vButton" , new JButton("Validation du nombre")},
{ "numOK" , "Valide!"},
{ "numERR", "Invalide"}
};
}

[MyResources_fr_CA.java (french language (for Canada) resources)]


import java.util.*;
public class myResources_fr_CA extends ListResourceBundle {
public Object [][] getContents() {
return contents;
}
static final Object[][] contents = {
{ "aLabel"
, "une tiquette (fr CA)" } ,
};

5 Internationalization

This example uses ListResourceBundle classes to store the required resources. It is possible to
substitute them for Properties files without any change to the code. The properties files must have
the .properties extension.
See this Howto.

5.3 Load resources dynamicallyTag(s): Internationalization


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0134.html
This HowTo lets you select a language and change its GUI to reflect the choice.
We are using a special class, a ListResourceBundle, to store our resources. We have a class per
Locale. If a specific resource is not in a specific Locale ListResourceBundle then the default
resource is used.
To use a properties file instead of a class to store resources then look at this HowTo.
[InternationalDynamic.java (main program)]
import
import
import
import
import

java.util.*;
java.text.*;
java.awt.*;
java.awt.event.*;
javax.swing.*;

public class InternationalDynamic extends JFrame


implements ActionListener
{
static Locale[] localesSupported = {
Locale.US, Locale.FRANCE, Locale.GERMANY
};
int localeChoosen = 0;
Locale localeCurrent;
ResourceBundle rb;
ButtonGroup bg;
JButton btnQuit;
JRadioButton r0, r1, r2;
JLabel today;
boolean defaultDone = false;
public void initLocale(){
localeCurrent = localesSupported[localeChoosen];
this.setLocale(localeCurrent);
rb = ResourceBundle.getBundle("ResourcesDynamic", localeCurrent);

5.3 Load resources dynamicallyTag(s): Internationalization

}
public void initText() {
setTitle (rb.getString("title"));
r0.setText(rb.getString("r0"));
r1.setText(rb.getString("r1"));
r2.setText(rb.getString("r2"));
btnQuit.setText(rb.getString("btnQuit"));
Date d = new Date();
MessageFormat mf = new MessageFormat
(rb.getString("today"), localeCurrent);
today.setText(mf.format(new Object [] { d }));
}
public void initGUI(){
setLayout(new FlowLayout());
// RADIO buttons
bg = new ButtonGroup();
r0 = new JRadioButton();
r1 = new JRadioButton();
r2 = new JRadioButton();
bg.add(r0);
bg.add(r1);
bg.add(r2);
add(r0);
add(r1);
add(r2);
// default RADIO button
if (!defaultDone) {
String rDef = rb.getString("rDefault");
if (rDef.equals("r0"))
r0.setSelected(true);
else if (rDef.equals("r1"))
r1.setSelected(true);
else
r2.setSelected(true);
defaultDone = true;
}
else {
if (localeChoosen == 0)
r0.setSelected(true);
else if (localeChoosen == 1)
r1.setSelected(true);
else
r2.setSelected(true);
}
// QUIT button
btnQuit = new JButton();
add(btnQuit);
// today label
today = new JLabel();
add(today);
//
r0.addActionListener(this);
r1.addActionListener(this);
r2.addActionListener(this);
btnQuit.addActionListener(this);

5.3 Load resources dynamicallyTag(s): Internationalization

setSize(400,100);
setVisible(true);
}
public void actionPerformed(ActionEvent ae){
if (ae.getSource() == btnQuit) {
System.exit(0);
}
else if (ae.getSource() == r0) localeChoosen = 0;
else if (ae.getSource() == r1) localeChoosen = 1;
else if (ae.getSource() == r2) localeChoosen = 2;
initLocale();
initText();
pack();
}
public static void main(String args[]) {
System.out.println("Current Locale : " + Locale.getDefault());
Thread t = new Thread () {
public void run() {
InternationalDynamic i = new InternationalDynamic();
i.initLocale();
i.initGUI();
i.initText();
i.pack();
}
};
SwingUtilities.invokeLater(t);
}
}

[ResourcesDynamic.java (default resources)]


import java.util.*;
public class ResourcesDynamic extends ListResourceBundle {
public Object [][] getContents() {
return contents;
}
static final Object[][] contents =
{
{ "title", "Example" },
{ "r0" , "United States" } ,
{ "r1", "France" } ,
{ "r2" , "Germany"},
{ "rDefault" , "r0" },
{ "btnQuit" , "Quit"},
{ "today" , " (def) {0,date,long}"},
};
}

[ResourcesDynamic_en.java (english language resources)]


import java.util.*;
public class ResourcesDynamic_en extends ListResourceBundle {
public Object [][] getContents() {
return contents;
}
static final Object[][] contents =
{ "title", "Example" },

5.3 Load resources dynamicallyTag(s): Internationalization

{
{
{
{
{
{
};

"r0" , "United States" } ,


"r1", "France" } ,
"r2" , "Germany"},
"rDefault" , "r0" },
"btnQuit" , "Quit"},
"today" , " (en) {0,date,long}"},

[ResourcesDynamic_fr.java (french language resources)]


import java.util.*;
public class ResourcesDynamic_fr extends ListResourceBundle {
public Object [][] getContents() {
return contents;
}
static final Object[][] contents =
{
{ "title", "Exemple" },
{ "r0" , "EtatsUnis" } ,
{ "r1", "France" } ,
{ "r2", "Allemagne" },
{ "rDefault", "r1" },
{ "btnQuit", "Quitter" },
{ "today" , " (fr) {0,date, dd/MM/yyyy}"},
};
}

[ResourcesDynamic_de.java (german language resources)]


import java.util.*;
public class ResourcesDynamic_de extends ListResourceBundle {
public Object [][] getContents() {
return contents;
}
static final Object[][] contents = {
{ "title", "Beispiel" },
{ "r0" , "Vereinigte Staaten" } ,
{ "r1", "Frankreich" } ,
{ "r2", "Deutschland" },
{ "rDefault", "r2" },
{ "btnQuit", "verlassen"},
{ "today" , " (de) {0,date,dd.MM.yyyy}"},
};
}

5.4 Load resources via a resources fileTag(s):


Internationalization
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0135.html
5.4 Load resources via a resources fileTag(s): Internationalization

With the previous JAVA Howto, the resources were stored in classes. The drawback is when there
is a modification, we must recompile the class. With a resources file, we simply add or modify the
resource in a special file with a regular text editor. The JDK provides a class,
PropertyResourceBundle, to use properties file very easily. In fact, from the programmer's point of
view, there is no difference if the resources are stored in classes or properties files.
The ResourceBundle will look first for classes and if not found, it will look for properties files. We
don't have to specify filenames, the ResourceBundle will construct the filename using the same
mechanism used for classes. The file must have the extension .properties.
The ResourceBundle try to load the properties file from the current classpath.
If the properties are stored in subdirectory , use "." instead of "/".
For example, let's say that the properties file is in a subdirectory called "subdir" (from the current
directory). Then you can load the ResourcesDynamic resources file with
ResourceBundle.getBundle("subdir.ResourcesDynamic", localeCurrent);

[InternationalDynamic.java]
import
import
import
import
import

java.util.*;
java.text.*;
java.awt.*;
java.awt.event.*;
javax.swing.*;

public class InternationalDynamic extends JFrame


implements ActionListener
{
static Locale[] localesSupported = {
Locale.US, Locale.FRANCE, Locale.GERMANY
};
int localeChoosen = 0;
Locale localeCurrent;
ResourceBundle rb;
ButtonGroup bg;
JButton btnQuit;
JRadioButton r0, r1, r2;
JLabel today;
boolean defaultDone = false;
public void initLocale(){
localeCurrent = localesSupported[localeChoosen];
this.setLocale(localeCurrent);
rb = ResourceBundle.getBundle("res.ResourcesDynamic", localeCurrent);
}

public void initText() {


setTitle (rb.getString("title"));
r0.setText(rb.getString("r0"));
r1.setText(rb.getString("r1"));
r2.setText(rb.getString("r2"));
btnQuit.setText(rb.getString("btnQuit"));
Date d = new Date();

5.4 Load resources via a resources fileTag(s): Internationalization

MessageFormat mf = new MessageFormat


(rb.getString("today"), localeCurrent);
today.setText(mf.format(new Object [] { d }));
}
public void initGUI(){
setLayout(new FlowLayout());
// RADIO buttons
bg = new ButtonGroup();
r0 = new JRadioButton();
r1 = new JRadioButton();
r2 = new JRadioButton();
bg.add(r0);
bg.add(r1);
bg.add(r2);
add(r0);
add(r1);
add(r2);
// default RADIO button
if (!defaultDone) {
String rDef = rb.getString("rDefault");
if (rDef.equals("r0"))
r0.setSelected(true);
else if (rDef.equals("r1"))
r1.setSelected(true);
else
r2.setSelected(true);
defaultDone = true;
}
else {
if (localeChoosen == 0)
r0.setSelected(true);
else if (localeChoosen == 1)
r1.setSelected(true);
else
r2.setSelected(true);
}

// QUIT button
btnQuit = new JButton();
add(btnQuit);
// today label
today = new JLabel();
add(today);
//
r0.addActionListener(this);
r1.addActionListener(this);
r2.addActionListener(this);
btnQuit.addActionListener(this);
setSize(400,100);
setVisible(true);
}
public void actionPerformed(ActionEvent ae){
if (ae.getSource() == btnQuit) {
System.exit(0);
}

5.4 Load resources via a resources fileTag(s): Internationalization

else if (ae.getSource() == r0) localeChoosen = 0;


else if (ae.getSource() == r1) localeChoosen = 1;
else if (ae.getSource() == r2) localeChoosen = 2;
initLocale();
initText();
pack();
}
public static void main(String args[]) {
System.out.println("Current Locale : " + Locale.getDefault());
Thread t = new Thread () {
public void run() {
InternationalDynamic i = new InternationalDynamic();
i.initLocale();
i.initGUI();
i.initText();
i.pack();
}
};
SwingUtilities.invokeLater(t);
}
}

[RresourcesDynamic.properties]
title=Example
r0=United States
r1=France
r2=Germany
rDefault=r0
btnQuit=Quit
today=(def) {0,date,long}

[RresourcesDynamic_en.properties]
title=Example
r0=United States
r1=France
r2=Germany
rDefault=r0
btnQuit=Quit
today=(en) {0,date,long}

[ResourcesDynamic_fr.properties]
title=Exemple
r0=EtatsUnis
r1=France
r2=Allemagne
rDefault=r1
btnQuit=Quitte
today=(fr) {0,date, dd/MM/yyyy}

[ResourcesDynamic_de.properties]
title=Beispiel
r0=Vereinigte Staaten
r1=Frankreich
r2=Deutschland
rDefault=r2
btnQuit=Verlassen

5.4 Load resources via a resources fileTag(s): Internationalization

today=(de) {0,date,dd.MM.yyyy}

5.5 Display "special character" using UnicodeTag(s):


Internationalization
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0136.html
The copyright symbol :
String COPYRIGHT = "\u00a9";

The registered symbol :


String REGISTERED = "\u00ae";

The eurocurrency sign :


String EURO = "\u20ac"

For example :
import java.awt.*;
public class TestUnicode extends java.applet.Applet {
public static final String COPYRIGHT = "\u00a9";
public static final String REGISTERED = "\u00ae";
public static final String EURO = "\u20ac";
public void init () {
setLayout(new FlowLayout());
Label a = new Label(COPYRIGHT + " R\u00e9al Gagnon");
Label b = new Label(REGISTERED + " R\u00e9al's Software "
+ " price : 100 " + EURO);
add(a);
add(b);
}
}

Output :
Java not enabled!
A list of Unicode characters is available at the Unicode organization Web site.
Here a quick list for accented letters :
\u00e0 \u00c0
\u00e1 \u00c1

5.5 Display "special character" using UnicodeTag(s): Internationalization

\u00e2
\u00e9
\u00e8
\u00ea
\u00ee
\u00e7

\u00c2
\u00c9
\u00c8
\u00ca
\u00ce
\u00c7

5.6 Display chinese/japanese charactersTag(s):


Internationalization
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0137.html
A useful link to integrate international characters set in Netscape is
http://developer.netscape.com/software/jdk/i18n.html and check also
http://www.geocities.com/Tokyo/Pagoda/1675/ for a more complete overview.

5.7 Localize a JOptionPane dialogTag(s):


Internationalization Swing
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0138.html
This example will show 2 radio buttons, one for english messages and buttons and the other one for
french. Press the button to display a localized JOptionPane according to the radio button selected.
Create 2 properties files, one for english , one for french.
[JOptionPane_en.properties]
Yes=Yes
No=No
Cancel=Cancel
SaveMsg=Do you want to save your data
[JOptionPane_fr.properties]
Yes=Oui
No=Non
Cancel=Annuler

5.6 Display chinese/japanese charactersTag(s): Internationalization

SaveMsg=Voulezvous sauvegarder vos donnees

Then
import
import
import
import

javax.swing.*;
java.awt.event.*;
java.awt.*;
java.util.*;

public class MessageBoxExample extends JPanel


implements ActionListener {
JButton go;
AbstractButton button;
ButtonGroup group;
Locale locale;
String msg ;
public MessageBoxExample() {
group = new ButtonGroup();
locale = Locale.US; // default value
button = new JRadioButton("English", true);
button.setActionCommand("en");
button.addActionListener(this);
group.add(button);
add(button);
button = new JRadioButton("Francais");
button.setActionCommand("fr");
button.addActionListener(this);
group.add(button);
add(button);
go = new JButton("Do it");
go.addActionListener(this);
add(go);
locale = Locale.US;
}
public void setUILanguage() {
ResourceBundle rb;
rb = ResourceBundle.getBundle("JOptionPane", locale);
UIManager.put("OptionPane.yesButtonText", rb.getString("Yes"));
UIManager.put("OptionPane.noButtonText", rb.getString("No"));
UIManager.put("OptionPane.cancelButtonText", rb.getString("Cancel"));
msg = rb.getString("SaveMsg");
}
public void actionPerformed(ActionEvent e) {
int result;
if (e.getSource() instanceof JRadioButton) {
if (e.getActionCommand().equals("en"))
locale = Locale.US;
else
locale = Locale.FRANCE;
setUILanguage();
}
else {
// the button action
result = JOptionPane.showConfirmDialog(this,msg);

5.6 Display chinese/japanese charactersTag(s): Internationalization

System.out.println(result);
}
}
public Dimension getPreferredSize(){
return new Dimension(200, 200);
}
public static void main(String s[]) {
JFrame frame = new JFrame("");
MessageBoxExample panel = new MessageBoxExample();
frame.addWindowListener(
new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
);
frame.getContentPane().add(panel,"Center");
frame.setSize(panel.getPreferredSize());
frame.setVisible(true);
}
}

5.8 Validate/Convert a number using the current Locale()Tag(s):


Internationalization String/Number
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0139.html
Depending on the International setting, numbers with comma as decimal separator may be
permitted. The NumberFormat class can handle this based on the current Locale().
import java.text.NumberFormat;
import java.text.ParseException;
import java.util.Locale;
public class NumberUtils {
public static double getDoubleValue(String value) throws ParseException {
// use the default locale
return NumberUtils.getDoubleValue(Locale.getDefault(), value);
}
public static double getDoubleValue(Locale loc, String value)
throws ParseException
{
// use the default locale
return NumberFormat.getInstance(loc).parse(value).doubleValue();
}
public static String convertStringAsStringNumberUnLocalized(String value)
throws ParseException

5.8 Validate/Convert a number using the current Locale()Tag(s): Internationalization String/Number

{
// use the default locale
return convertStringAsStringNumberUnLocalized(Locale.getDefault(), value);
}
public static String convertStringAsStringNumberUnLocalized
(Locale loc, String value)
throws ParseException
{
double d = NumberUtils.getDoubleValue(loc, value);
return NumberFormat.getInstance(new Locale("us")).format(d);
}

public static void main(String[] args) throws Exception{


System.out.println(Locale.getDefault());
System.out.println(NumberUtils.getDoubleValue("42,24"));
System.out.println(NumberUtils.getDoubleValue("42.24"));
System.out.println(NumberUtils.convertStringAsStringNumberUnLocalized
(new Locale("fr"), "42,24"));
/*
* output
* fr_CA
* 42.24
* 42.0
* 42.24
*/
}
}

5.9 Localize a JFileChooserTag(s): Internationalization Swing


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0299.html
Modern Swing release have now builtin readytouse translations for the JFileChooser. The
language is choosen based on the current Locale. So you don't have to do anything to display the
JFileChooser in the right language.
The user interface elements provided by the J2SE Runtime Environment 5.0, include Swing dialogs,
messages written by the runtime environment to the standard output and standard error streams, as
well as messages produced by the tools provided with the JRE. These user interface elements are
localized into the following languages:
Sun Supported Locales
This example will show 2 radio buttons, one for english, one for french. Press the button to display a
5.9 Localize a JFileChooserTag(s): Internationalization Swing

localized JFileChooser according to the radio button selected.


Create 2 properties files, one for english , one for french (these files are incomplete but should be
enough to get you started).
[JFileChooser_en.properties]
Title=Real's JFileChooser
lookInLabelText=Current
filesOfTypeLabelText=File type
upFolderToolTipText=go up

[JFileChooser_fr.properties]
Title=JFileChooser de R\u00e9al
lookInLabelText=Courant
filesOfTypeLabelText=Type de fichier
upFolderToolTipText=Remonte

Then
[LocalizeJFileChooser.java]
import
import
import
import

javax.swing.*;
java.awt.event.*;
java.awt.*;
java.util.*;

public class LocalizeJFileChooser extends JPanel


implements ActionListener {
JButton go;
AbstractButton button;
ButtonGroup group;
Locale locale;
String msg ;
protected JFileChooser z_chooser;
String z_choosertitle;
public LocalizeJFileChooser() {
group = new ButtonGroup();
locale = Locale.US; // default value
button = new JRadioButton("English", true);
button.setActionCommand("en");
button.addActionListener(this);
group.add(button);
add(button);
button = new JRadioButton("Francais");
button.setActionCommand("fr");
button.addActionListener(this);
group.add(button);
add(button);
go = new JButton("Do it");
go.addActionListener(this);
add(go);

5.9 Localize a JFileChooserTag(s): Internationalization Swing

locale = Locale.US;
}
public void setUILanguage() {
ResourceBundle rb;
rb = ResourceBundle.getBundle("JFileChooser", locale);
z_choosertitle = rb.getString("Title");
UIManager.put
("FileChooser.lookInLabelText",
rb.getString("lookInLabelText"));
UIManager.put
("FileChooser.filesOfTypeLabelText",
rb.getString("filesOfTypeLabelText"));
UIManager.put
("FileChooser.upFolderToolTipText",
rb.getString("upFolderToolTipText"));
/*
do the same with :
FileChooser.fileNameLabelText
FileChooser.homeFolderToolTipText
FileChooser.newFolderToolTipText
FileChooser.listViewButtonToolTipTextlist
FileChooser.detailsViewButtonToolTipText
FileChooser.saveButtonText=Save
FileChooser.openButtonText=Open
FileChooser.cancelButtonText=Cancel
FileChooser.updateButtonText=Update
FileChooser.helpButtonText=Help
FileChooser.saveButtonToolTipText=Save
FileChooser.openButtonToolTipText=Open
FileChooser.cancelButtonToolTipText=Cancel
FileChooser.updateButtonToolTipText=Update
FileChooser.helpButtonToolTipText=Help
Almost all Swing widgets can be customize this way. You can
examine the Swing sources to get these values or check
http://www.gargoylesoftware.com/papers/plafdiff.html for
a list of them.
*/
}
public void actionPerformed(ActionEvent e) {
int result;
if (e.getSource() instanceof JRadioButton) {
if (e.getActionCommand().equals("en"))
locale = Locale.US;
else
locale = Locale.FRANCE;
setUILanguage();
}
else {
z_chooser = new JFileChooser();
z_chooser.setCurrentDirectory(new java.io.File("."));
z_chooser.setDialogTitle(z_choosertitle);
if (z_chooser.showOpenDialog(this) !=
JFileChooser.APPROVE_OPTION)
return;

5.9 Localize a JFileChooserTag(s): Internationalization Swing

}
}
public Dimension getPreferredSize(){
return new Dimension(200, 200);
}
public static void main(String s[]) {
JFrame frame = new JFrame("");
LocalizeJFileChooser panel = new LocalizeJFileChooser();
frame.addWindowListener(
new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
);
frame.getContentPane().add(panel,"Center");
frame.setSize(panel.getPreferredSize());
frame.setVisible(true);
}
}

5.10 Disable localizationTag(s): Internationalization


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0418.html
By default, the JVM uses the current locale as defined by the OS. To bypass this configuration, you
specify on the command line the locale to be used :
java Duser.language=en Duser.region=US MyApplication

5.11 Generate the Javadoc "en franais"Tag(s):


Environment Environment Internationalization
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0437.html
The javadoc utility uses the regular Java mechanism to internationalize its output. The tools.jar in
the lib directory contains the resource bundle standard.properties used by Javadoc to generated the
labels. To add a new language, you need to create the appropriate resource bundle, in our case for
french, we need a file called standard_fr.properties.
5.10 Disable localizationTag(s): Internationalization

The new file must be in the package com.sun.tools.doclets.standard.resources.


Extract from tools.jar, the standard.properties files (keep the directory structure). Copy it under the
name standard_fr.properties. Translate it (or you can download my "incomplete" version here).
[standard.properties (extract)]
doclet.Window_Split_Index={0}\: {1}Index
doclet.Packages=Packages
doclet.SerialData=Serial Data\:
doclet.Since=Since\:
doclet.Warn_inline_taglet=Inline tag {0} should only be used with a {1}.
doclet.ClassUse_Subinterface=Subinterfaces of {0} in {1}
doclet.Frame_Version=Frame version
doclet.Generated_Docs_Untitled=Generated Documentation (Untitled)

[standard_fr.properties (extract)]
doclet.Window_Split_Index={0}\: {1}Index
doclet.Packages=Paquetages
doclet.SerialData=Donn\u00E9e s\u00E9rialis\u00E9e\:
doclet.Since=Depuis\:
doclet.Warn_inline_taglet=Inline tag {0} should only be used with a {1}.
doclet.ClassUse_Subinterface=Sousinterfaces de {0} dans {1}
doclet.Frame_Version=Version avec cadres
doclet.Generated_Docs_Untitled=Documentation g\u00E9n\u00E9r\u00E9e

Once everything translated, put your standard_fr.properties into the tools.jar making sure that the
file is located in the right package (along standard.properties in
com.sun.tools.doclets.standard.resources).
To generate in french, use the locale switch on the command line
javadoc locale fr ....

NOTE : Make sure the locale switch is the first one.


Using Ant,
<javadoc
locale="fr"
sourcefiles="c:/client/Client.java"
destdir="javadoc/Client"
author="true"
version="true"
use="true"
private="true"
windowtitle="Client">
<doctitle><![CDATA[<h1>Client</h1>]]></doctitle>
<bottom><![CDATA[<i>Copyright &#169; 2003 Real's Howto.</i>]]></bottom>
</javadoc>

5.10 Disable localizationTag(s): Internationalization

5.12 Sort a String arrayTag(s): Internationalization Varia


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0343.html
Sort utilities are now part of latest JDK versions.
Case sensitive
java.util.Arrays.sort(myArray);

Case insensitive
java.util.Arrays.sort(myArray, String.CASE_INSENSITIVE_ORDER);

Sort with international characters.


Take the following example :
import java.util.*;
import java.io.*;
public class TestSort1 {
static String [] words = { "Ral", "Real", "Raoul", "Rico" };
public static void main(String args[]) throws Exception {
try {
Writer w = getWriter();
w.write("Before :\n");
for (String s : words) {
w.write(s + " ");
}
java.util.Arrays.sort(words);
w.write("\nAfter :\n");
for (String s : words) {
w.write(s + " ");
}
w.flush();
w.close();
}
catch(Exception e){
e.printStackTrace();
}
}

// useful to output accentued characters to the console


public static Writer getWriter() throws UnsupportedEncodingException {
if (System.console() == null) {
Writer w =
new BufferedWriter
(new OutputStreamWriter(System.out, "Cp850"));
return w;
}

5.12 Sort a String arrayTag(s): Internationalization Varia

else {
return System.console().writer();
}
}
}

The output is :
Before :
Ral Real Raoul Rico
After :
Raoul Real Rico Ral

which is wrong since we expect to find "Ral" after "Real".


To solve the problem , replace
java.util.Arrays.sort(words);

by
java.util.Arrays.sort(words, java.text.Collator.getInstance(java.util.Locale.FRENCH));
// or
// java.util.Arrays.sort(words, java.text.Collator.getInstance());

and the output will be :


Before :
Ral Real Raoul Rico
After :
Raoul Real Ral Rico

Or you can do it the long way :


import java.util.Locale;
import java.text.Collator;
...
Locale loc = Locale.FRENCH;
sortArray(Collator.getInstance(loc), words);
...
public static void sortArray(Collator collator, String[] strArray) {
String tmp;
if (strArray.length == 1) return;
for (int i = 0; i < strArray.length; i++) {
for (int j = i + 1; j < strArray.length; j++) {
if( collator.compare(strArray[i], strArray[j] ) > 0 ) {
tmp = strArray[i];
strArray[i] = strArray[j];
strArray[j] = tmp;
}
}
}
}

See this HowTo

5.12 Sort a String arrayTag(s): Internationalization Varia

5.13 Accentuated characters in Properties/ResourceBundle


fileTag(s): Internationalization Language
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0492.html
The rules are
Only use ISO Latin 1 characters in the Properties/ResourceBundle files
For other characters use the \u.... notation
To avoid having to type all the \u... notation manually, use the native2ascii tool (included with
the SDK).

5.14 Compare accentuated lettersTag(s):


Internationalization String/Number
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0496.html
From the javadoc,
the result of String.compareTo() is a negative integer
if this String object lexicographically precedes the
argument string. The result is a positive integer if
this String object lexicographically follows the argument
string. The result is zero if the strings are equal;
compareTo returns 0 exactly when the equals(Object)
method would return true.

In this code, we have 2 strings, "tat" and "famille". We expect that "tat" is before "famille". But
String.compareTo() will return that "famille" is before "tat".
class Test {
public static void main(String args[]) {
String s1 = "tat";
String s2 = "famille";
// here we are expecting "" < "f"
if (s1.compareTo(s2) > 0) {
if (s1.compareTo(s2) > 0) {
// s1 lexicographically follows s2 which is not true!

5.13 Accentuated characters in Properties/ResourceBundle fileTag(s): Internationalization Language

System.out.println("not ok " + s1 + " > " + s2 );


}
}
/*
output :
not ok tat > famille
*/
}

The fix is to use java.text.Collator.compareTo(). From the javadoc :


Collator.compare() compares the source string to the target string
according to the collation rules for this Collator.
Returns an integer less than, equal to or greater than zero
depending on whether the source String is less than,
equal to or greater than the target string.
import java.text.Collator;
public class Test {
public static void main(String args[]) {
String s1 = "tat";
String s2 = "famille";
// Collator c = Collator.getInstance(java.util.Locale.FRANCE);
Collator c = Collator.getInstance();
c.setStrength(Collator.PRIMARY);
if (c.compare(s1, s2) < 0) {
// s2 lexicographically follows s1
System.out.println("ok " + s1 + " < " + s2);
}
}
/*
output :
ok tat < famille
*/
}

Equality
To compare without taking into account the presence of accentued so that "" == "e", we use a
Collator.
import java.text.Collator;
// import java.util.Locale;
public class TextTest {
public static void main(String ... args) {
String a = "Real";
String b = "Ral";
System.out.println(a + " and " + b + " equals? " +
check(a,b));
/*
* output :
* Real and Ral equals? true
*/
}

5.13 Accentuated characters in Properties/ResourceBundle fileTag(s): Internationalization Language

public static boolean check(String a, String b) {


// Collator c = Collator.getInstance(Locale.US);
//
// accent and upper/lowercase not taken into account
Collator c = Collator.getInstance();
c.setStrength(Collator.PRIMARY);
return (c.compare(a,b) == 0 );
}
}

See this HowTo.

5.15 Unaccent lettersTag(s): Internationalization String/Number


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0456.html
The following snippets remove from a String accented letters and replace them by their regular
ASCII equivalent.
These can be useful before inserting data into a database to made sorting easier.

5.15.1 Using java.text.Normalizer


It's a simple using the java.text.Normalizer class.
We are calling the normalize(). If we pass , the method returns a + ` . Then using a regular
expression, we clean up the string to keep only valid USASCII characters.
import java.text.Normalizer;
import java.util.regex.Pattern;
public class StringUtils {
private StringUtils() {}
public static String unAccent(String s) {
//
// JDK1.5
//
use sun.text.Normalizer.normalize(s, Normalizer.DECOMP, 0);
//
String temp = Normalizer.normalize(s, Normalizer.Form.NFD);
Pattern pattern = Pattern.compile("\\p{InCombiningDiacriticalMarks}+");
return pattern.matcher(temp).replaceAll("");
}
public static void main(String args[]) throws Exception{
String value = " _ @";
System.out.println(StringUtils.unAccent(value));
// output : e a i _ @

5.15 Unaccent lettersTag(s): Internationalization String/Number

}
}

5.15.2 Using String.replaceAll()


As an alternative, replaceAll() and regular expressions on a String can also be used :
public class Test {
public static void main(String args[]) {
String s = ",,,,,,,,,,,,,,,,,,,,,";
s
s
s
s
s

=
=
=
=
=

s.replaceAll("[]","e");
s.replaceAll("[]","u");
s.replaceAll("[]","i");
s.replaceAll("[]","a");
s.replaceAll("","o");

s
s
s
s
s

=
=
=
=
=

s.replaceAll("[]","E");
s.replaceAll("[]","U");
s.replaceAll("[]","I");
s.replaceAll("[]","A");
s.replaceAll("","O");

System.out.println(s);
// output : E,E,E,E,U,U,I,I,A,A,O,e,e,e,e,u,u,i,i,a,a,o
}
}

5.15.3 The String.indexOf()


While the two techniques above are ok... there are a little bit slow.
The following HowTo is faster because we using one String to contain all the possible characters to
be converted and a String with the ASCII equivalent. So we need to detect the position in the first
String and then do a lookup in the second String.

public class AsciiUtils {


private static final String PLAIN_ASCII =
"AaEeIiOoUu"
// grave
+ "AaEeIiOoUuYy" // acute
+ "AaEeIiOoUuYy" // circumflex
+ "AaOoNn"
// tilde
+ "AaEeIiOoUuYy" // umlaut
+ "Aa"
// ring
+ "Cc"
// cedilla
+ "OoUu"
// double acute
;
private static final String UNICODE =
"\u00C0\u00E0\u00C8\u00E8\u00CC\u00EC\u00D2\u00F2\u00D9\u00F9"
+ "\u00C1\u00E1\u00C9\u00E9\u00CD\u00ED\u00D3\u00F3\u00DA\u00FA\u00DD\u00FD"
+ "\u00C2\u00E2\u00CA\u00EA\u00CE\u00EE\u00D4\u00F4\u00DB\u00FB\u0176\u0177"
+ "\u00C3\u00E3\u00D5\u00F5\u00D1\u00F1"
+ "\u00C4\u00E4\u00CB\u00EB\u00CF\u00EF\u00D6\u00F6\u00DC\u00FC\u0178\u00FF"
+ "\u00C5\u00E5"
+ "\u00C7\u00E7"
+ "\u0150\u0151\u0170\u0171"
;

5.15.2 Using String.replaceAll()

// private constructor, can't be instanciated!


private AsciiUtils() { }
// remove accentued from a string and replace with ascii equivalent
public static String convertNonAscii(String s) {
if (s == null) return null;
StringBuilder sb = new StringBuilder();
int n = s.length();
for (int i = 0; i < n; i++) {
char c = s.charAt(i);
int pos = UNICODE.indexOf(c);
if (pos > 1){
sb.append(PLAIN_ASCII.charAt(pos));
}
else {
sb.append(c);
}
}
return sb.toString();
}
public static void main(String args[]) {
String s =
"The result : ,,,,,,,,,,,,,,,,,,,,,,";
System.out.println(AsciiUtils.convertNonAscii(s));
// output :
// The result : E,E,E,E,U,U,I,I,A,A,O,e,e,e,e,u,u,i,i,a,a,o,c
}
}
Thanks to MV Bastos for the "tilde" bug fix
Thanks to L.. Tama for the missing !
Thanks to T. Hague for the missing "double acute";

As a bonus, here a method to convert a given string to uppercase with no accent. This can be
useful in a database field to simplify name searching with accent or not.

public class StringUtils {


private StringUtils() {}
private static final String UPPERCASE_ASCII =
"AEIOU" // grave
+ "AEIOUY" // acute
+ "AEIOUY" // circumflex
+ "AON" // tilde
+ "AEIOUY" // umlaut
+ "A" // ring
+ "C" // cedilla
+ "OU" // double acute
;
private static final String UPPERCASE_UNICODE =
"\u00C0\u00C8\u00CC\u00D2\u00D9"
+ "\u00C1\u00C9\u00CD\u00D3\u00DA\u00DD"
+ "\u00C2\u00CA\u00CE\u00D4\u00DB\u0176"
+ "\u00C3\u00D5\u00D1"
+ "\u00C4\u00CB\u00CF\u00D6\u00DC\u0178"
+ "\u00C5"
+ "\u00C7"
+ "\u0150\u0170"
;

5.15.2 Using String.replaceAll()

public static String toUpperCaseSansAccent(String txt) {


if (txt == null) {
return null;
}
String txtUpper = txt.toUpperCase();
StringBuilder sb = new StringBuilder();
int n = txtUpper.length();
for (int i = 0; i < n; i++) {
char c = txtUpper.charAt(i);
int pos = UPPERCASE_UNICODE.indexOf(c);
if (pos > 1){
sb.append(UPPERCASE_ASCII.charAt(pos));
}
else {
sb.append(c);
}
}
return sb.toString();
}

public static void main(String args[]) throws Exception {


String s =
"The result : ,,,,,,,,,,,,,,,,,,,,,,";
System.out.println(
StringUtils.toUpperCaseSansAccent(s));
// output :
// THE RESULT : E,E,E,E,U,U,I,I,A,A,O,E,E,E,E,U,U,I,I,A,A,O,C
}
}

5.16 Output accentuated characters to the consoleTag(s):


IO Internationalization
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0046.html

5.17 Java 1.6 or more


In Java 1.6 you can use System.console() instead of System.out.println() to display accentuated
characters to console.
public class Test2 {
public static void main(String args[]){
String s = "caractres franais : \u00e9"; // Unicode for ""
System.out.println(s);
System.console().writer().println(s);
}
}

anf the output is


5.16 Output accentuated characters to the consoleTag(s): IO Internationalization

C:\temp>java Test
caractres franais :
caractres franais :

5.18 Java 1.5 or less


When starting the JVM and pass on the command line the default file encoding to be used. Then
you will be able to use regular System.out.println().
java Dfile.encoding=Cp850 MyApp

Another way is to specify in the code the encoding to be used.


import java.io.*;
public class Test {
public static void main(String[] args) {
PrintStream ps = null;
String javaString =
"caractres franais : \u00e9"; // Unicode for ""
try {
ps = new PrintStream(System.out, true, "Cp850");
}
catch (UnsupportedEncodingException error) {
System.err.println(error);
System.exit(0);
}
ps.println(javaString);
}
}
Note : List of supported encodings here

5.19 Get the default character set of the JVMTag(s):


IO Internationalization
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0505.html
public class Hello {
public static void main(String args[]) throws Exception{
// not crossplateform safe
System.out.println(System.getProperty("file.encoding"));
// jdk1.4
System.out.println(
new java.io.OutputStreamWriter(
new java.io.ByteArrayOutputStream()).getEncoding()
);
// jdk1.5
System.out.println(java.nio.charset.Charset.defaultCharset().name());

5.18 Java 1.5 or less

}
}

Output example (winXP)


>java Hello
Cp1252
Cp1252
windows1252

See also java encoding table for the encoding sets supported.

5.20 Convert OEM (DOS) file to Ansi (Windows)Tag(s):


IO Internationalization
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0524.html
We are using an InputStreamReader which convert the specified input encoding to Unicode and an
OutputStreamWriter which from Unicode to the specified output encoding.
This can be useful when migrating data from a legacy database (ex. Clipper, dBase) to newer
DBMS (ex. mySQL, Sybase).
import java.io.*;
public class OemToAnsi {
public static void main(String args[]) throws Exception{
if (args.length != 2) {
System.out.println(
"Usage : java OemToAnsi inputdosfile outputansifile"
);
System.out.println(
"
note : codepage input Cp850 codepage output Cp1252"
);
System.exit(1);
}
// input
FileInputStream fis = new FileInputStream(args[0]);
BufferedReader r =
new BufferedReader(new InputStreamReader(fis, "Cp850"));
// output
FileOutputStream fos = new FileOutputStream(args[1]);
Writer w =
new BufferedWriter(new OutputStreamWriter(fos, "Cp1252"));
String oemString = "";
while ( (oemString= r.readLine()) != null) {
w.write(oemString);
w.flush();
}
w.close();

5.20 Convert OEM (DOS) file to Ansi (Windows)Tag(s): IO Internationalization

r.close();
System.exit(0);
}
}

See also this related HowTo

5.21 Detect nonASCII character in a StringTag(s):


Internationalization String/Number
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0536.html
import
import
import
import
import

java.nio.ByteBuffer;
java.nio.CharBuffer;
java.nio.charset.Charset;
java.nio.charset.CharsetDecoder;
java.nio.charset.CharacterCodingException;

public class StringUtils {


public static boolean isPureAscii(String v) {
byte bytearray [] = v.getBytes();
CharsetDecoder d = Charset.forName("USASCII").newDecoder();
try {
CharBuffer r = d.decode(ByteBuffer.wrap(bytearray));
r.toString();
}
catch(CharacterCodingException e) {
return false;
}
return true;
}
public static void main (String args[])
throws Exception {
String test = "Ral";
System.out.println(test + " isPureAscii() : " + StringUtils.isPureAscii(test));
test = "Real";
System.out.println(test + " isPureAscii() : " + StringUtils.isPureAscii(test));
/*
* output :
*
Ral isPureAscii() : false
*
Real isPureAscii() : true
*/
}
}

A different (and simpler) approach is to take a given string and check if it's possible to encode it into
ASCII.
5.21 Detect nonASCII character in a StringTag(s): Internationalization String/Number

import java.nio.charset.Charset;
import java.nio.charset.CharsetEncoder;
public class StringUtils {
static CharsetEncoder asciiEncoder =
Charset.forName("USASCII").newEncoder(); // or "ISO88591" for ISO Latin 1
public static boolean isPureAscii(String v) {
return asciiEncoder.canEncode(v);
}
public static void main (String args[])
throws Exception {
String test = "Ral";
System.out.println(test + " isPureAscii() : " + StringUtils.isPureAscii(test));
test = "Real";
System.out.println(test + " isPureAscii() : " + StringUtils.isPureAscii(test));
/*
* output :
*
Ral isPureAscii() : false
*
Real isPureAscii() : true
*/
}
}

Another way is to use a regular expression, see this Javascript HowTo for a hint!
To simply strip any nonascii characters form a string
public class Test {
public static void main(String args[]){
String input = "ea";
String output = input.replaceAll("[^\\p{ASCII}]", "");
System.out.println(output);
/*
* output : ea
*/
}
}

See also Unaccent letters.

5.22 Get the month (or day) name (localized)Tag(s): Date and
Time Internationalization
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0650.html
import java.text.DateFormatSymbols;
import java.util.Locale;

5.22 Get the month (or day) name (localized)Tag(s): Date and Time Internationalization

public class DateUtils {


private DateUtils() { }
public static String getMonthName(int month) {
return getMonthName(month, Locale.getDefault());
}
public static String getMonthName(int month, Locale locale) {
DateFormatSymbols symbols = new DateFormatSymbols(locale);
String[] monthNames = symbols.getMonths();
return monthNames[month 1];
}

public static String getDayName(int day, Locale locale) {


DateFormatSymbols symbols = new DateFormatSymbols(locale);
String[] dayNames = symbols.getWeekdays();
return dayNames[day];
}

public static void main(String[] args) {


System.out.println(DateUtils.getMonthName(1));
System.out.println(DateUtils.getMonthName(1, new Locale("it")));
System.out.println(DateUtils.getDayName(java.util.Calendar.SUNDAY, Locale.getDefault()));
/*
* output :
*
january
*
gennaio
*
sunday
*/
}
}

Written and compiled Ral Gagnon 2007 [email protected]


http://www.rgagnon.com

5.22 Get the month (or day) name (localized)Tag(s): Date and Time Internationalization

6 IO
6.1 javaio

6.2 Redirect output(stdout/stderr) to a frameTag(s): IO


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0028.html
[JDK1.1]
import java.awt.*;
import java.awt.event.*;
import java.io.*;
public class RedirectedFrame extends Frame {
TextArea aTextArea = new TextArea();
PrintStream aPrintStream =
new PrintStream(
new FilteredStream(
new ByteArrayOutputStream()));
boolean logFile;
RedirectedFrame(boolean logFile) {
this.logFile = logFile;
System.setOut(aPrintStream);
System.setErr(aPrintStream);
setTitle("Error message");
setSize(500,300);
setLayout(new BorderLayout());
add("Center" , aTextArea);
displayLog();
addWindowListener
(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
dispose();
}
}
);
}
class FilteredStream extends FilterOutputStream {
public FilteredStream(OutputStream aStream) {
super(aStream);
}
public void write(byte b[]) throws IOException {
String aString = new String(b);
aTextArea.append(aString);
}
public void write(byte b[], int off, int len) throws IOException {
String aString = new String(b , off , len);
aTextArea.append(aString);
if (logFile) {

6 IO

FileWriter aWriter = new FileWriter("error.log", true);


aWriter.write(aString);
aWriter.close();
}
}
}
public void displayLog() {
Dimension dim = getToolkit().getScreenSize();
Rectangle abounds = getBounds();
Dimension dd = getSize();
setLocation((dim.width abounds.width) / 2,
(dim.height abounds.height) / 2);
setVisible(true);
requestFocus();
}
public static void main(String s[]){
try {
// force an exception for demonstration purpose
Class.forName("unknown").newInstance();
}
catch (Exception e) {
// for applet, always RedirectedFrame(false)
RedirectedFrame r = new RedirectedFrame(true);
e.printStackTrace();
}
}
}
Check also this simple Swing solution.

6.3 Redirect printStackTrace() to a StringTag(s): IO


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0029.html
import java.io.*;
public class TestStack2String {
public static void main(String s[]){
try {
// force an exception for demonstration purpose
Class.forName("unknown").newInstance();
// or this could be changed to:
//
throw new Exception();
}
catch (Exception e) {
System.out.println(stack2string(e));
}
}
public static String stack2string(Exception e) {

6.3 Redirect printStackTrace() to a StringTag(s): IO

try {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
e.printStackTrace(pw);
return "\r\n" + sw.toString() + "\r\n";
}
catch(Exception e2) {
return "bad stack2string";
}
}
}

6.4 Redirect to a NULL deviceTag(s): IO


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0453.html
This can be useful if you want to suppress all output.
// Unix style
PrintStream nps = new PrintStream(new FileOutputStream("/dev/null"));
System.setErr(nps);
System.setOut(nps);
//Windows style
PrintStream nps = new PrintStream(new FileOutputStream("NUL:"));
System.setErr(nps);
System.setOut(nps);

//Oneliner style : subclass OutputStream to override the write method ...


System.setOut(new java.io.PrintStream(
new java.io.OutputStream() {
public void write(int b){}
}
));

You may want to suppress output done with the regular System.out but maintain the ability to write
to the original streams directly when necessary.
// Keep a copy of the original out stream.
PrintStream original = new PrintStream(System.out);
// replace the System.out, here I redirect to NUL (for demonstration)
System.setOut(new PrintStream(new FileOutputStream("NUL:")));
System.out.println("bar"); // no output
// The original stream is still available
original.println("foo"); // output to stdout

See also Get faster console output (System.out.println() replacement).

6.4 Redirect to a NULL deviceTag(s): IO

6.5 Print a text file using the javax.print APITag(s): IO


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/javaprintatextfilewithjavax.printapi.html
This example will print a given text file using the javax.print API.
With cheap personal printer (at least with mine!), you cannot select many options... more than
one copy and page orientation (portrait or landscape) won't work.
You need to set the "flavor" as AUTOSENSE so the content is sent as "OCTETSTREAM" even
if it's possible, according to the Javadoc, to set the "flavor" as UTF8 or US_ASCII. I believe this is
a limitation of the Windows platform implementation.
You need to send a FORMFEED between each print job to eject the last page.
A special class, PrintJobWatcher, is used to wait for the completion of a print job.
import
import
import
import
import

java.io.ByteArrayInputStream;
java.io.IOException;
java.io.InputStream;
java.io.File;
java.io.FileInputStream;

import
import
import
import
import
import
import

javax.print.Doc;
javax.print.DocFlavor;
javax.print.DocPrintJob;
javax.print.PrintException;
javax.print.PrintService;
javax.print.PrintServiceLookup;
javax.print.SimpleDoc;

import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.standard.Copies;
import javax.print.event.PrintJobAdapter;
import javax.print.event.PrintJobEvent;
public class PrintTextFile {
public static void main(String[] args) throws PrintException, IOException {
String defaultPrinter =
PrintServiceLookup.lookupDefaultPrintService().getName();
System.out.println("Default printer: " + defaultPrinter);
PrintService service = PrintServiceLookup.lookupDefaultPrintService();
FileInputStream in = new FileInputStream(new File("c:/temp/foo.txt"));
PrintRequestAttributeSet
pras.add(new Copies(1));

pras = new HashPrintRequestAttributeSet();

DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;


Doc doc = new SimpleDoc(in, flavor, null);
DocPrintJob job = service.createPrintJob();

6.5 Print a text file using the javax.print APITag(s): IO

PrintJobWatcher pjw = new PrintJobWatcher(job);


job.print(doc, pras);
pjw.waitForDone();
in.close();
// send FF to eject the page
InputStream ff = new ByteArrayInputStream("\f".getBytes());
Doc docff = new SimpleDoc(ff, flavor, null);
DocPrintJob jobff = service.createPrintJob();
pjw = new PrintJobWatcher(jobff);
jobff.print(docff, null);
pjw.waitForDone();
}
}
class PrintJobWatcher {
boolean done = false;
PrintJobWatcher(DocPrintJob job) {
job.addPrintJobListener(new PrintJobAdapter() {
public void printJobCanceled(PrintJobEvent pje) {
allDone();
}
public void printJobCompleted(PrintJobEvent pje) {
allDone();
}
public void printJobFailed(PrintJobEvent pje) {
allDone();
}
public void printJobNoMoreEvents(PrintJobEvent pje) {
allDone();
}
void allDone() {
synchronized (PrintJobWatcher.this) {
done = true;
System.out.println("Printing done ...");
PrintJobWatcher.this.notify();
}
}
});
}
public synchronized void waitForDone() {
try {
while (!done) {
wait();
}
} catch (InterruptedException e) {
}
}
}

To print a String, see this HowTo

6.5 Print a text file using the javax.print APITag(s): IO

6.6 Print a String to a printer Tag(s): IO


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/javaprintastringusingjavaxprintapi.html
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import
import
import
import
import
import
import

javax.print.Doc;
javax.print.DocFlavor;
javax.print.DocPrintJob;
javax.print.PrintException;
javax.print.PrintService;
javax.print.PrintServiceLookup;
javax.print.SimpleDoc;

import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.standard.Copies;
import javax.print.event.PrintJobAdapter;
import javax.print.event.PrintJobEvent;
public class PrintText {
public static void main(String[] args) throws PrintException, IOException {
String defaultPrinter =
PrintServiceLookup.lookupDefaultPrintService().getName();
System.out.println("Default printer: " + defaultPrinter);
PrintService service = PrintServiceLookup.lookupDefaultPrintService();
// prints the famous hello world! plus a form feed
InputStream is = new ByteArrayInputStream("hello world!\f".getBytes("UTF8"));
PrintRequestAttributeSet
pras.add(new Copies(1));

pras = new HashPrintRequestAttributeSet();

DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;


Doc doc = new SimpleDoc(is, flavor, null);
DocPrintJob job = service.createPrintJob();
PrintJobWatcher pjw = new PrintJobWatcher(job);
job.print(doc, pras);
pjw.waitForDone();
is.close();
}
}
class PrintJobWatcher {
boolean done = false;
PrintJobWatcher(DocPrintJob job) {
job.addPrintJobListener(new PrintJobAdapter() {
public void printJobCanceled(PrintJobEvent pje) {
allDone();
}
public void printJobCompleted(PrintJobEvent pje) {
allDone();
}
public void printJobFailed(PrintJobEvent pje) {

6.6 Print a String to a printer Tag(s): IO

allDone();
}
public void printJobNoMoreEvents(PrintJobEvent pje) {
allDone();
}
void allDone() {
synchronized (PrintJobWatcher.this) {
done = true;
System.out.println("Printing done ...");
PrintJobWatcher.this.notify();
}
}
});
}
public synchronized void waitForDone() {
try {
while (!done) {
wait();
}
} catch (InterruptedException e) {
}
}
}

To print a text file, see this HowTo

6.7 Print text to a printer easilyTag(s): IO


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0051.html
A quick and simple way to output some text to a printer is to print to OS logical device attached a
printer. For example, on a Windows machine :
import java.io.*;
public class SimplePrinting {
public static void main(String[] args) {
try {
FileWriter out = new FileWriter("lpt1");
out.write("Hello world");
out.write(0x0D); // CR
out.close();
}
catch (IOException e) {
e.printStackTrace();
}
}
}

6.7 Print text to a printer easilyTag(s): IO

6.8 Print without a DialogTag(s): IO


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0350.html
JobAttributes theJobAttribs = new JobAttributes();
PageAttributes thePageAttribs = new PageAttributes();
theJobAttribs.setDialog(JobAttributes.DialogType.NONE);
theJobAttribs.setPrinter("HP DeskJet 610C"); // the printer to be used
PrintJob myJob = getToolkit().getPrintJob(this, "PrintJob",
theJobAttribs, thePageAttribs);
if (myJob != null) {
Graphics g = myJob.getGraphics();
if (g != null) {
String s = myArea.getText(); // what you like to print
printText(myJob, g, s);
g.dispose();
}
myJob.end();
}

6.9 Initialize and write to a serial portTag(s): IO


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0062.html
This is for JAVA application only (JDK1.1).
(Win)Initialization is done via the MODE.COM utility. Then to write, simply open a stream using
the OS logical name attached to the serial port. You can use the same technique to print to the
printer port (in this case the local name would be "LPTx:").
public class SerialTest {
public static void main( String args[]) {
Runtime rt = Runtime.getRuntime();
Process p = null;
String portname = "com1:";
// for Win95 : c:\\windows\\command.com
//
c:\\windows\\command\\mode.com
String cmd[] = {
"c:\\winnt\\system32\\cmd.exe", "/c",
"start", "/min",
"c:\\winnt\\system32\\mode.com", portname,
"baud=9600", "parity=n", "data=8",
"stop=1",
};

6.8 Print without a DialogTag(s): IO

try {
p = rt.exec( cmd );
if( p.waitFor() != 0 ) {
System.out.println("Error executing command: " + cmd );
System.exit( 1 );
}
byte data[] =
"Writing a byte stream out of a serial port.".getBytes();
FileOutputStream fos = new FileOutputStream( portname );
BufferedOutputStream bos = new BufferedOutputStream( fos );
fos.write( data, 0, data.length );
fos.close();
}
catch( Exception e ) {
e.printStackTrace();
}
}
}

6.10 Open or close a CD/DVD driveTag(s): IO


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0574.html
Java provides no way to interact with a cd drive.
One easy way on the Windows plateform is to call a VBS script.
In this HowTo, we are creating a temporary vbs file and execute it. This technique is useful to do
something that a regular Java can't do because it's too specific to OS where the Java is running.
The vbs file is created in the "temporary" folder and is deleted by the JVM at the end.
import java.io.File;
import java.io.FileWriter;
public class CDUtils {
private CDUtils() { }
public static void open(String drive) {
try {
File file = File.createTempFile("realhowto",".vbs");
file.deleteOnExit();
FileWriter fw = new java.io.FileWriter(file);
String vbs = "Set wmp = CreateObject(\"WMPlayer.OCX\") \n"
+ "Set cd = wmp.cdromCollection.getByDriveSpecifier(\""
+ drive + "\") \n"
+ "cd.Eject";
fw.write(vbs);
fw.close();
Runtime.getRuntime().exec("wscript " + file.getPath()).waitFor();
// thanks to TrueJavaProgammer for the waitFor() tip!
// Runtime.getRuntime().exec("wscript " + file.getPath()).waitFor();
// Thread.sleep(2000);

6.10 Open or close a CD/DVD driveTag(s): IO

}
catch(Exception e){
e.printStackTrace();
}
}
public static void close(String drive) {
try {
File file = File.createTempFile("realhowto",".vbs");
file.deleteOnExit();
FileWriter fw = new FileWriter(file);
// to close a CD, we need eject two times!
String vbs = "Set wmp = CreateObject(\"WMPlayer.OCX\") \n"
+ "Set cd = wmp.cdromCollection.getByDriveSpecifier(\""
+ drive + "\") \n"
+ "cd.Eject \n "
+ "cd.Eject ";
fw.write(vbs);
fw.close();
Runtime.getRuntime().exec("wscript " + file.getPath()).waitFor();
// thanks to TrueJavaProgammer for the waitFor() tip!
// Runtime.getRuntime().exec("wscript "+ file.getPath());
// Thread.sleep(2000);
}
catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[] args){
javax.swing.JOptionPane.showConfirmDialog((java.awt.Component)
null, "Press OK to open CD", "CDUtils",
javax.swing.JOptionPane.DEFAULT_OPTION);
CDUtils.open("D:\\");
javax.swing.JOptionPane.showConfirmDialog((java.awt.Component)
null, "Press OK to close CD", "CDUtils",
javax.swing.JOptionPane.DEFAULT_OPTION);
CDUtils.close("D:\\");
}
}
NOTE : Windows Media Player version 7 or later is required

6.11 Get the volume labelTag(s): IO


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0455.html
This will retrieve the hard disk volume label :
import java.io.*;
import javax.swing.filechooser.*;
public class VolumeLabel {

6.11 Get the volume labelTag(s): IO

private VolumeLabel() { }
public static void main(String[] args) {
System.out.println("\"" + get(args[0]) + "\"");
}
public static String get(String path) {
FileSystemView view = FileSystemView.getFileSystemView();
File dir = new File(path);
String name = view.getSystemDisplayName(dir);
if (name == null) { return null; }
name = name.trim();
if (name == null || name.length() < 1) {
return null;
}
int index = name.lastIndexOf(" (");
if (index > 0) {
name = name.substring(0, index);
}
return name;
}
}

The output
Running from c:\temp
>java VolumeLabel c:
"temp"
>java VolumeLabel c:\
"HARDDISK1"

6.12 Detect the storage device typeTag(s): IO


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0635.html
javax.swing.filechooser.FileSystemView provides a way to detect the type of a particular device.
import
import
import
import

java.io.File;
java.util.Arrays;
java.util.List;
javax.swing.filechooser.FileSystemView;

public class Test2 {


public static void main(String args[]){
List <File>files = Arrays.asList(File.listRoots());
for (File f : files) {
String s = FileSystemView.getFileSystemView().getSystemTypeDescription(f);
System.out.println("*" + s);
}

6.12 Detect the storage device typeTag(s): IO

/* output (French WinXP)


*Disquette 3 pouces
*Disque local
*Lecteur CD
*Disque local
*/
}
}

As you can see the output is localized (from the OS).


The following output the name or label of the storage device :
import
import
import
import

java.io.File;
java.util.Arrays;
java.util.List;
javax.swing.filechooser.FileSystemView;

public class Test2 {


public static void main(String args[]){
List <File>files = Arrays.asList(File.listRoots());
for (File f : files) {
String s = FileSystemView.getFileSystemView().getSystemDisplayName(f);
System.out.println("*" + s);
}
/* output (French WinXP)
*
*REGA1 (C:)
*
*My Book (F:)
*/
}
}

6.13 Turn on MQ Debug mode Tag(s): IO


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/javaturnonmqdebugmode.html
Websphere MQ exposes many properties to control debugging inforation output. See this
document.
When starting the JRE, set the properties on the command line. For example :
Dcom.ibm.msg.client.commonservices.trace.status=ON
Dcom.ibm.msg.client.commonservices.trace.outputName=C:\myapps\logs\mq.log

will make the MQ client to produce a log with a lot of information.


6.13 Turn on MQ Debug mode Tag(s): IO

Version information in main body of trace


TimeStamp
TID
ObjectId
Class
=============================================================================================
15:04:32.833.00 0001
static c.i.m.c.commonservices.trace.Trace
15:04:32.833.01 0001
static c.i.m.c.commonservices.componentmanager.ComponentManager
15:04:32.833.02 0001 @14a18d
c.i.m.c.commonservices.componentmanager.ComponentManager(Co
...

6.14 Get faster console output (System.out.println()


replacement)Tag(s): IO
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0603.html
If your program is doing a lot printing to the console using System.out.println() then it is possible
to get a good performance boost by using an alternative to do the console output.
By default, System.out.print() is only linebuffered and does a lot work related to Unicode
handling. Because of its small buffer size, System.out.println() is not well suited to handle many
repetitive outputs in a batch mode. Each line is flushed right away. If your output is mainly
ASCIIbased then by removing the Unicoderelated activities, the overall execution time will be
better.
Consider this program :
import
import
import
import

java.io.BufferedWriter;
java.io.FileDescriptor;
java.io.FileOutputStream;
java.io.OutputStreamWriter;

public class Test {


public static void main(String...args) throws Exception {
long start = System.currentTimeMillis();
for (int i = 0; i < 1000000; i++) {
System.out.print("abcdefghijk ");
System.out.print(String.valueOf(i));
System.out.print('\n');
}
System.err.println("Loop time: " +
(System.currentTimeMillis() start));
}
}

The result is
>java Test >NUL
Loop time: 7000

Now, rewrite this program to use a 512bytes buffer and specify the ASCII as
characterencoding to be used.
6.14 Get faster console output (System.out.println() replacement)Tag(s): IO

import
import
import
import

java.io.BufferedWriter;
java.io.FileDescriptor;
java.io.FileOutputStream;
java.io.OutputStreamWriter;

public class Test {


public static void main(String...args) throws Exception {
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new
FileOutputStream(java.io.FileDescriptor.out), "ASCII"), 512);
long start = System.currentTimeMillis();
for (int i = 0; i < 1000000; i++) {
out.write("abcdefghijk ");
out.write(String.valueOf(i));
out.write('\n');
}
out.flush();
System.err.println("Loop time: " +
(System.currentTimeMillis() start));
}
}

The result is
>java Test >NUL
Loop time: 672

Note that your result will vary depending on your machine/java version but the performance gain
should in the same magnitude.

6.15 Simple input from the keyboardTag(s): IO


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0053.html
First method
import java.io.*;
public class TestReadLine {
public static void main (String args[]) {
StreamTokenizer Input=new StreamTokenizer(System.in);
try {
System.out.print(" Your first name : ");
Input.nextToken();
System.out.println("Hi " + Input.sval + "!");
}
catch (Exception e) {
e.printStackTrace();
}
}
}

6.15 Simple input from the keyboardTag(s): IO

Second method JDK1.0.2


java.io.DataInputStream in =
new java.io.DataInputStream(System.in);
String aLine = in.readLine();

Third method JDK1.1


In you program, use EasyInput.inputStr("<prompt>") to input a String or
EasyInput.InputInt("<prompt>") for an integer.
public class EasyInput {
public static int inputInt(String s) {
BufferedReader input =
new BufferedReader(new InputStreamReader(System.in));
System.out.print(s);
int i =0;
try {
i = Integer.parseInt(input.readLine());
}
catch (Exception e) {
e.printStackTrace();
}
return i;
}
public static String inputStr(String s) {
String aLine = "";
BufferedReader input =
new BufferedReader(new InputStreamReader(System.in));
System.out.print(s);
try {
aLine = input.readLine();
}
catch (Exception e) {
e.printStackTrace();
}
return aLine;
}
public static void main(String s[]) {
while(true) {
int y = inputInt(" Year: ");
int m = inputInt("Month: ");
int d = inputInt(" Day: ");
String you = inputStr("Your name: ");
System.out.println(you + " " + y + m + d);
}
}
}

NOTE: JDK 1.5 provides the Scanner class to do this, see this HowTo.

6.15 Simple input from the keyboardTag(s): IO

6.16 Output accentuated characters to the consoleTag(s):


IO Internationalization
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0046.html

6.17 Java 1.6 or more


In Java 1.6 you can use System.console() instead of System.out.println() to display accentuated
characters to console.
public class Test2 {
public static void main(String args[]){
String s = "caractres franais : \u00e9"; // Unicode for ""
System.out.println(s);
System.console().writer().println(s);
}
}

anf the output is


C:\temp>java Test
caractres franais :
caractres franais :

6.18 Java 1.5 or less


When starting the JVM and pass on the command line the default file encoding to be used. Then
you will be able to use regular System.out.println().
java Dfile.encoding=Cp850 MyApp

Another way is to specify in the code the encoding to be used.


import java.io.*;
public class Test {
public static void main(String[] args) {
PrintStream ps = null;
String javaString =
"caractres franais : \u00e9"; // Unicode for ""
try {
ps = new PrintStream(System.out, true, "Cp850");
}
catch (UnsupportedEncodingException error) {
System.err.println(error);
System.exit(0);
}
ps.println(javaString);
}
}
Note : List of supported encodings here

6.16 Output accentuated characters to the consoleTag(s): IO Internationalization

6.19 Clear the console and control attributesTag(s): IO Open


Source
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0047.html
There is no builtin way to really control characterbased application in Java.
To clear the screen, you can use many System.out.println();, that's about it!
for (int i=0; i<25; i++)
System.out.println();

... Or use some JNI functions, see this HowTo.


While it is possible to use the DOS ANSI.SYS driver with Windows 9x and make old JVM use it ...
it won't work with modern Windows installations. Windows NT (or better) CMD.EXE does not
support ANSI escape sequences at all.
Fortunately many Open Source solutions are coming to the rescue and Jansi and JCurses are
two of them.

6.20 Jansi
Jansi is a small java library that allows you to use ANSI escape sequences to format your console
output which works even on Windows.
import org.fusesource.jansi.AnsiConsole;
public class Test {
public static final
public static final
public static final
public static final
public static final
public static final
public static final

String
String
String
String
String
String
String

ANSI_CLS = "\u001b[2J";
ANSI_HOME = "\u001b[H";
ANSI_BOLD = "\u001b[1m";
ANSI_AT55 = "\u001b[10;10H";
ANSI_REVERSEON = "\u001b[7m";
ANSI_NORMAL = "\u001b[0m";
ANSI_WHITEONBLUE = "\u001b[37;44m";

public static void main(String args[]){


AnsiConsole.systemInstall();
AnsiConsole.out.println(ANSI_CLS);
AnsiConsole.out.println
(ANSI_AT55 + ANSI_REVERSEON + "Hello world" + ANSI_NORMAL);
AnsiConsole.out.println
(ANSI_HOME + ANSI_WHITEONBLUE + "Hello world" + ANSI_NORMAL);
AnsiConsole.out.print
(ANSI_BOLD + "Press a key..." + ANSI_NORMAL);
try {System.in.read();}catch(Exception e){}
AnsiConsole.out.println(ANSI_CLS);
AnsiConsole.systemInstall();

6.19 Clear the console and control attributesTag(s): IO Open Source

}
}
NOTE: Check this "old" text file to have an overview of ANSI Escape Sequences.

The above example shows that it's possible to use ANSI codes directly but Jansi provides a neat
mechanism to help building the required ANSI sequence.
import static org.fusesource.jansi.Ansi.*;
import static org.fusesource.jansi.Ansi.Color.*;
...
System.out.println( ansi().eraseScreen().fg(RED).a("Hello").fg.(GREEN).a(" World").reset()

Jansi works on Linux32/64, Windows 32/64 and OS/X.

6.21 JCurses
The Java Curses Library (JCurses) is a library for developing text terminal based applications
using Java programming language. It is implemented as a Windowing toolkit similar to AWT, but
built upon the UNIX "curses" windowing system.
JCurses works on Unix and Windows (32 bit only, on a 64bit OS you need to use JCurses with a
32bit JVM).
This example will display a characterbased window with a label, a textfield and a button (don't
click with you mouse, use the keyboard!).
import
import
import
import

jcurses.system.*;
jcurses.widgets.*;
jcurses.util.*;
jcurses.event.*;

public class Test2 extends Window implements ItemListener, ActionListener,


ValueChangedListener, WindowListener, WidgetsConstants {
static Test2 window = null;
static TextField textfield = null;
static Button button = null;
public Test2(int width, int height) {
super(width, height, true, "JCurses Test");
}
public static void main(String[] args) throws Exception {
window = new Test2(30, 20);
window.init();
}
public void init() {
DefaultLayoutManager mgr = new DefaultLayoutManager();
mgr.bindToContainer(window.getRootPanel());
mgr.addWidget(
new Label("Hello World!",
new CharColor(CharColor.WHITE, CharColor.GREEN)),
0, 0, 20, 10,
WidgetsConstants.ALIGNMENT_CENTER,
WidgetsConstants.ALIGNMENT_CENTER);
textfield = new TextField(10);

6.21 JCurses

mgr.addWidget(textfield, 0, 0, 20, 20,


WidgetsConstants.ALIGNMENT_CENTER,
WidgetsConstants.ALIGNMENT_CENTER);
button = new Button("Quit");
mgr.addWidget(button, 0, 0, 20, 30,
WidgetsConstants.ALIGNMENT_CENTER,
WidgetsConstants.ALIGNMENT_CENTER);
button.setShortCut('q');
button.addListener(this);
window.addListener((WindowListener) this);
window.show();
}
public void actionPerformed(ActionEvent event) {
Widget w = event.getSource();
if (w == button) {
new Message("HowTo", "You are about to quit", "OK").show();
window.close();
}
}
public void stateChanged(ItemEvent e) {

public void valueChanged(ValueChangedEvent e) {

public void windowChanged(WindowEvent event) {


if (event.getType() == WindowEvent.CLOSING) {
event.getSourceWindow().close();
// Toolkit.clearScreen(new CharColor(CharColor.WHITE, CharColor.BLACK));
}
}
}

6.22 Easy keyboard input (JDK1.5)Tag(s): IO


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0491.html
import java.util.Scanner;
class TestScanner {
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
System.out.println(sc.nextLine());
System.out.println("Done");
}
}

A Scanner breaks its input into tokens using a delimiter pattern, which by default matches
whitespace. The resulting tokens may then be converted into values of different types using the
various next methods.
6.22 Easy keyboard input (JDK1.5)Tag(s): IO

import java.util.Scanner;
class TestScanner {
public static void main(String args[]) {
// if input is
//
10,12
// then the output is
// 10
// 12
//
// we use a regex as delimiter to combine "," and
// whitespace (in this case the ENTER key)
Scanner sc = new Scanner(System.in).useDelimiter("[,\\s]");
while (sc.hasNextInt()) {
int i = sc.nextInt();
System.out.println(i);
}
System.out.println("Done");
}
}

Scanner can be used with String or Stream. For exemple, the above HowTo can be written like
this :
import java.util.Scanner;
class TestScanner {
public static void main(String args[]) {
String input = "10,12"
Scanner sc = new Scanner(System.in).useDelimiter(",");
while (sc.hasNextInt()) {
int i = sc.nextInt();
System.out.println(i);
}
System.out.println("Done");
}
}

6.23 Force keyboard input in CAPS LOCK onTag(s): IO


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0643.html
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
import javax.swing.JTextField;
public class Test {
private JFrame myFrame;

6.23 Force keyboard input in CAPS LOCK onTag(s): IO

private JTextField myTextField;


public void doit() {
myFrame = new JFrame();
myFrame.setSize(400, 200);
myFrame.setLocation(100, 100);
myFrame.setLayout(new java.awt.FlowLayout());
myTextField = new JTextField(20);
// Keyboard is CAPSLOCK ON
java.awt.Toolkit.getDefaultToolkit()
.setLockingKeyState(KeyEvent.VK_CAPS_LOCK, true);
myFrame.add(myTextField);
myFrame.addWindowListener( new WindowAdapter() {
public void windowOpened( WindowEvent e ){
myTextField.requestFocus();
}
public void windowActivated( WindowEvent e ){
boolean focus = myTextField.requestFocusInWindow();
if(focus){
System.out.println("Focus successful");
}
else{
System.out.println("Focus unsuccessful");
}
}
}
);
myFrame.setVisible(true);
}
public static void main(String args[]) {
new Test().doit();
}
}

NOTE : This technique changes the keyboard state so the effect is also seen outside the Java
program.
See also this related Howto.

6.24 Automatic conversion of System.out output Tag(s): IO

Current version of this HowTo :


http://www.rgagnon.com/javadetails/../javadetails/javaautomaticconversionofSystem.outoutput.html
Convert System.out output to uppercase.
import java.io.PrintStream;
public class Test {
public static void main(String[] args) throws Exception {
System.setOut(new PrintStream(System.out) {
public void println(String s) {

6.24 Automatic conversion of System.out output Tag(s): IO

super.println(s.toUpperCase());
}
});
System.out.println("hello world"); // output :

HELLO WORLD

}
}

Replace the regular output stream of System.out to do useful thing like implementing a Tee
mechanism to output to the console and to file.
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
public class TeeOutputStream extends OutputStream {
private OutputStream os1;
private OutputStream os2;
public TeeOutputStream(OutputStream os1, OutputStream os2) {
this.os1 = os1;
this.os2 = os2;
}
public void write(int i) throws IOException {
os1.write(i);
os2.write(i);
}
public void flush() throws IOException {
os1.flush();
os2.flush();
}
public void close() throws IOException {
os1.close();
os2.close();
}
public static void main(String[] args) throws IOException {
System.out.println("Starting...");
// keep the original
PrintStream originalOutStream = System.out;
System.setOut(
new PrintStream(
new TeeOutputStream(
System.out,
new PrintStream("C:/temp/howto.out"))));
// restore the original
System.out.println("*");
for (int i = 1; i<= 10; i++) {
System.out.println(i);
}
System.out.println("*");
System.setOut(originalOutStream);
System.out.println("Done. Check the log");
}
}

6.24 Automatic conversion of System.out output Tag(s): IO

6.25 Execute an external programTag(s): IO


Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0014.html
Be sure to read this Javaworld article. It describes the various pitfalls related to the
Runtime.exec() method.

6.26 Using Runtime.exec()


This example will capture the output (from stdio) of an external program.
package com.rgagnon.howto;
import java.io.*;
public class Exec {
public static void main(String args[]) {
try {
String line;
Process p = Runtime.getRuntime().exec("cmd /c dir");
BufferedReader bri = new BufferedReader
(new InputStreamReader(p.getInputStream()));
BufferedReader bre = new BufferedReader
(new InputStreamReader(p.getErrorStream()));
while ((line = bri.readLine()) != null) {
System.out.println(line);
}
bri.close();
while ((line = bre.readLine()) != null) {
System.out.println(line);
}
bre.close();
p.waitFor();
System.out.println("Done.");
}
catch (Exception err) {
err.printStackTrace();
}
}
}

The next example, launch CMD.EXE, grab stdin/stdout and push to stdin command to be
interpreted by the shell.
String line;
OutputStream stdin = null;
InputStream stderr = null;
InputStream stdout = null;
// launch EXE and grab stdin/stdout and stderr
Process process = Runtime.getRuntime ().exec ("/folder/exec.exe");
stdin = process.getOutputStream ();
stderr = process.getErrorStream ();
stdout = process.getInputStream ();

6.25 Execute an external programTag(s): IO

// "write" the parms into stdin


line = "param1" + "\n";
stdin.write(line.getBytes() );
stdin.flush();
line = "param2" + "\n";
stdin.write(line.getBytes() );
stdin.flush();
line = "param3" + "\n";
stdin.write(line.getBytes() );
stdin.flush();
stdin.close();
// clean up if any output in stdout
BufferedReader brCleanUp =
new BufferedReader (new InputStreamReader (stdout));
while ((line = brCleanUp.readLine ()) != null) {
//System.out.println ("[Stdout] " + line);
}
brCleanUp.close();
// clean up if any output in stderr
brCleanUp =
new BufferedReader (new InputStreamReader (stderr));
while ((line = brCleanUp.readLine ()) != null) {
//System.out.println ("[Stderr] " + line);
}
brCleanUp.close();

6.27 Launch a Windows CMD (or BAT) file and retrieve the
errorlevel or exitcode
// win xp
import java.io.*;
public class CmdExec {
public static void main(String argv[]) {
try {
String line;
Process p = Runtime.getRuntime().exec("test.cmd");
p.waitFor();
System.out.println(p.exitValue());
}
catch (Exception err) {
err.printStackTrace();
}
}
}

test.cmd (set the errorlevel manually)


@echo hello world
@exit 42

test.cmd (set the errorlevel 1 (problem detected)


@java garbage

6.27 Launch a Windows CMD (or BAT) file and retrieve the errorlevel or exitcode

test.cmd (set the errorlevel 0 (execution Ok)


@java version

6.28 Launch a Unix script


String[] cmd = {"/bin/sh", "c", "ls > hello"};
Runtime.getRuntime().exec(cmd);

6.29 Using the ProcessBuilder


Since 1.5, the ProcessBuilder class provides more controls overs the process to be started. It's
possible to set a starting directory.
import java.io.*;
import java.util.*;
public class CmdProcessBuilder {
public static void main(String args[])
throws InterruptedException,IOException
{
List<String> command = new ArrayList<String>();
command.add(System.getenv("windir") +"\\system32\\"+"tree.com");
command.add("/A");
ProcessBuilder builder = new ProcessBuilder(command);
Map<String, String> environ = builder.environment();
builder.directory(new File(System.getenv("temp")));
System.out.println("Directory : " + System.getenv("temp") );
final Process process = builder.start();
InputStream is = process.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
System.out.println("Program terminated!");
}
}

6.30 Windows rundll32 utility


Windows File association
Any program using the Windows file association mechanism can be started with the rundll32
utility.
// "file" is the filename of the data file
// ex. myresume.doc
// to start Word if the doc extension is associated with it.
Runtime.getRuntime().exec
("rundll32 SHELL32.DLL,ShellExec_RunDLL " + file.getAbsolutePath());

See also this HowTo about the new Desktop API, the recommended solution (but you need
JDK1.6).
See also this one to open the default browser.
6.28 Launch a Unix script

The following example start a Dialup connection on the Win plateform :


[Dialup.java]
public class Dialup {
public static void main(String[] args) throws Exception {
Process p = Runtime.getRuntime()
.exec("rundll32.exe rnaui.dll,RnaDial MyConnection");
p.waitFor();
System.out.println("Done.");
}
}

The "MyConnection" is the DUN and it's case sensitive.


You still need to press ENTER to CONNECT, there is an option in the Connection properties to
connect automatically.
On NT and W2K, rnaui.dll is not available. Use rasdial.exe instead.
rasdial "connection name"
rasdial "connection name" /d to drop
rasdial /? for more options

6.31 PDF (Windows only)


public class ShowPDF {
public static void main(String[] args) throws Exception {
Process p =
Runtime.getRuntime()
.exec("rundll32 url.dll,FileProtocolHandler c:/pdf/mypdf.pdf");
p.waitFor();
System.out.println("Done.");
}
}

6.32 PDF (Mac only)


public class ShowPDF {
public static void main (String[] args) throws Exception{
Process p = Runtime.getRuntime().exec("open /Documents/mypdf.pdf");
}
}

More runddl32 examples

6.33 Path to executable with spaces in them


You can include a path for the program to be executed. On the Win plateform, you need to put the
path in quotes if the path contains spaces.
public class Test {
public static void main(String[] args) throws Exception {
Process p = Runtime.getRuntime().exec(
"\"c:/program files/windows/notepad.exe\"");
p.waitFor();
}
}

6.31 PDF (Windows only)

If you need to pass arguments, it's safer to a String array especially if they contain spaces.
String[] cmd = { "myProgram.exe", "o=This is an option" };
Runtime.getRuntime().exec(cmd);

If using the start command and the path of the file to be started contains a space then you must
specified a title to the start command.
String fileName = "c:\\Applications\\My Documents\\test.doc";
String[] commands = {"cmd", "/c", "start", "\"DummyTitle\"",fileName};
Runtime.getRuntime().exec(commands);

6.34 VBSCRIPT
// Win9x
Runtime.getRuntime().exec("start myscript.vbs");
// WinNT
Runtime.getRuntime().exec("cmd /c start myscript.vbs");
or
// with a visible console
Runtime.getRuntime().exec("cscript myscript.vbs");
// with no visible console
Runtime.getRuntime().exec("wscript myscript.vbs");

6.35 HTML Help (Windows only)


Runtime.getRuntime().exec("hh.exe myhelpfile.chm");

6.36 Start Excel


import java.io.IOException;
class StartExcel {
public static void main(String args[])
throws IOException
{
Runtime.getRuntime().exec("cmd /c start excel.exe");
}
}

To load a worksheet
import java.io.IOException;
class StartExcel {
public static void main(String args[])
throws IOException
{
String fileName = "c:\\temp\\xls\\test2.xls";
String[] commands = {"cmd", "/c", "start", "\"DummyTitle\"",fileName};
Runtime.getRuntime().exec(commands);
}
}

6.34 VBSCRIPT

It's important to pass a dummy title to the Windows start command where there is a possibility
that the filename contains a space. It's a feature.

6.37 Start a Windows application under another account


You use the RUNAS command from the command line to start an application under another
account (not available with XP Home edition). There are many switches that can enhance the
behaviour of RUNAS. Typing "runas /?" from the command prompt gets you all the options.
String commands [] = new String [] {
"CMD.EXE",
"/C",
"RUNAS /profile /savecred /user:"
+ "administrator"
+ " " + "regedit.exe"
};
Runtime.getRuntime().exec(commands);

/SaveCred option allows you to save a password for that account and then reuse it later. For
example, The command runas /savecred /user:administrator regedit.exe prompts
for the password, and then Regedit runs. Next time you use the same command, there is no
password prompt.
One potential problem is that when /SaveCred saves the credentials it saves it for whenever
RUNAS invokes that user account. This can be a huge security risk so be careful using it!
RUNAS capability can be disabled by editing the Registry or by disabling the RUNAS or
Secondary Logon Services. The appropriate registry key is
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\Explorer, create a
new DWORD value named HideRunAsVerb and assign it a value of 1 to disable Run as.
RUNAS doesn't work when used from a Windows service.

6.38 Windows : execute something in Program Files


We want to execute the textpad editor located in C:\Program Files\TextPad 4 but without hard
coding the path since it can be different for a localized version of Windows.
We simply extract to environnment variable called %programfiles% and build the complete path
from there.
[JDK1.5]
public class Exec {
static String WIN_PROGRAMFILES = System.getenv("programfiles");
static String FILE_SEPARATOR
= System.getProperty("file.separator");
public static void main(String[] args) throws Exception {
String[] commands =
{"cmd.exe",
"/c",
WIN_PROGRAMFILES
+ FILE_SEPARATOR
+ "textpad 4"

6.37 Start a Windows application under another account

+ FILE_SEPARATOR + "textpad.exe"};
Runtime.getRuntime().exec(commands);
}
}

NOTE : Prior Vista, System folders were localized on disk like C:\Program Files > C:\Archivos de
programa on the Windows with the Spanish localization. Since Vista, System Folders always
exists with the english name BUT when viewed through Explorer, the localized name is shown.
See
http://msmvps.com/blogs/carlosq/archive/2007/02/12/windowsvistajunctionspointsmuiandlocalized

6.39 Launch the application associated with a file


extensionTag(s): IO
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0579.html
JDK1.6
The java.awt.Desktop class uses your host operating system's file associations to launch
applications associated with specific file types.
First it's a good idea to check if the Desktop operations are supported on the running plateform.
import java.awt.*;
...
if (Desktop.isDesktopSupported()) {
Desktop desktop = Desktop.getDesktop();
for (Desktop.Action action : Desktop.Action.values()) {
System.out.println("action " + action + " supported? "
+ desktop.isSupported(action));
}
}

The possible actions are


BROWSE. launching the userdefault browser to show a specified URI
MAIL. launching the userdefault mail client with an optional mailto URI;
OPEN. launching a registered application to open a specified file.
EDIT. launching a registered application to edit a specified file.
PRINT. launching a registered application to print a specified file.
then
// application associated to a file extension
public static void open(File document) throws IOException {
Desktop dt = Desktop.getDesktop();
dt.open(document);
}

6.39 Launch the application associated with a file extensionTag(s): IO

public static void print(File document) throws IOException {


Desktop dt = Desktop.getDesktop();
dt.print(document);
}
// default browser
public static void browse(URI document) throws IOException {
Desktop dt = Desktop.getDesktop();
dt.browse(document);
}
// default mail client
//
use the mailto: protocol as the URI
//
ex : mailto:[email protected]?SUBJECT=Love me tender&BODY=love me sweet
public static void mail(URI document) throws IOException {
Desktop dt = Desktop.getDesktop();
dt.mail(document);
}

See the javadoc at http://java.sun.com/javase/6/docs/api/java/awt/Desktop.html


See also this HowTo and this one.

6.40 Launch an application from another applicationTag(s):


IO Language
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java0394.html
While you can exec("java myaotherapp"), it is more appropriate to instanciate and called the main
method of the other application.
For example, take this simple application :
public class Program2 {
public static void main(String arg[]) {
System.out.println("Hello from Program2");
}
}

To call the above application from another


public class Program1a {
public static void main(String arg[]) {
System.out.println("Hello from Program1a");
new Thread(){
public void run() {
Program2.main(new String[]{});}
}.start();
}

6.40 Launch an application from another applicationTag(s): IO Language

The above example is used when the class is hardcoded.


The dynamic version is little more tricky.
public class Program1b {
public static void main(String arg[]) {
System.out.println("Hello from Program1b");
new Program1b().execute("Program2");
}
public void execute(String name) {
Class params[] = {String[].class};
// if you need parameters
//
String[] args = new String[] { "Hello", "world" };
//
Class params[] = new Class[] { args.getClass() });
try {
Class.forName(name).
getDeclaredMethod("main", params).
invoke(null, new Object[] {new String[] {}});
}
catch(Exception e){ e.printStackTrace();}
}
}

Launch many programs using Thread and use join() to wait for the completion.
[Program2.java]
public class Program2 {
public static void main(String arg[]) {
System.out.println("Hello from Program2");
System.out.println("Hello from Program2");
System.out.println("Hello from Program2");
System.out.println("Hello from Program2");
}
}
[Program1a.java]
public class Program1a {
public static void main(String a