Real's HowTo PDF version.
This is the PDF version of the Real's HowTo Web site ( http://www.rgagnon.com/howto.html ).
For up−to−date 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 How−to'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)
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 java−applet........................................................................................................................1
1.2 Goto to a new URL from an Applet....................................................................................1
1.3 Determine the host from where the Applet is loaded.........................................................3
1.4 Have a scrolling status line................................................................................................3
1.5 Use a search engine..........................................................................................................5
1.6 Have an on−screen clock..................................................................................................6
1.7 Have Applets on the same page communicate with each other........................................8
1.8 Have Applets on different frames communicates with each other.....................................9
1.9 Send a message from an Applet to another Applet on a different page..........................10
1.10 Have an applet launch an other applet..........................................................................12
1.11 Get the user name.........................................................................................................14
1.12 Access parameters passed in the URL..........................................................................14
1.13 Convert an Applet to Application....................................................................................16
1.14 Change the mouse cursor in Applet...............................................................................17
1.15 Use an Image as the Applet background.......................................................................17
1.16 Handle the new Control Activation mechanism in IE.....................................................18
1.16.1 Solution #1............................................................................................................19
1.16.2 Solution #2............................................................................................................19
1.16.3 Solution #3............................................................................................................20
1.17 Pass parameters to the Applet JVM (WIN)....................................................................21
1.18 See the Java Console Window Log (Java plugin).........................................................22
1.19 Display debugging infos for an Applet...........................................................................23
1.20 Have an invisible Applet.................................................................................................23
2 Date and Time...............................................................................................................................24
2.1 java−date.........................................................................................................................24
2.2 Have year on 4 digits from a Date object.........................................................................24
2.3 Get the current Date and Time........................................................................................24
2.4 Compute days between 2 dates......................................................................................25
2.5 Get the number of days in a month..................................................................................26
2.6 Validate a date.................................................................................................................27
2.6.1 Using DateFormat...................................................................................................27
2.6.2 Using GregorianCalendar.......................................................................................28
2.7 Determine to day of the week..........................................................................................29
2.8 Add/Substract Day/Month/Year to a Date........................................................................29
2.9 Get the correct TimeZone on DateFormat.......................................................................30
2.10 Simply format a date as "YYYYMMDD".........................................................................30
2.11 Compare 2 dates...........................................................................................................31
2.12 Parse a String to obtain a Date/GregorianCalendar object............................................31
2.13 Use System time to generate unique ID........................................................................32
2.14 Get the day name..........................................................................................................33
2.15 Find the current date format...........................................................................................33
2.16 Get a julian date.............................................................................................................34
2.17 Calculate the age...........................................................................................................36
2.18 Format a duration in ms into a string as "Days,Hours,minutes and seconds"...............37
2.19 Get the atomic time........................................................................................................38
2.20 Get a date interval..........................................................................................................40
2.21 Determine if an hour is between an interval...................................................................42
2.22 Set the computer clock..................................................................................................43
2.23 Use System time to generate unique ID
Real's [email protected]
2 Date and Time
2.23 Use System time to generate unique ID........................................................................43
3 AWT................................................................................................................................................45
3.1 java−awt...........................................................................................................................45
3.2 Use The CardLayout manager.........................................................................................45
3.3 Detect which card is visible with a CardLayout................................................................47
3.4 Use Popups.....................................................................................................................47
3.5 Use a File Dialog..............................................................................................................49
3.6 Use TrueType font...........................................................................................................50
3.7 Display available fonts.....................................................................................................51
3.8 Font with 3D effect...........................................................................................................52
3.9 Use the System Clipboard...............................................................................................52
3.10 Maximize a Frame.........................................................................................................53
3.11 Center a Frame/Dialog...................................................................................................54
3.12 Close a Frame...............................................................................................................55
3.13 Call events on a Frame from a Panel............................................................................56
3.14 Set the small top−left icon on a Frame..........................................................................58
3.15 Prevent a Frame to be resized.......................................................................................59
3.16 Embed an image into a Frame.......................................................................................60
3.17 Display a message box..................................................................................................62
3.18 Display a Splash screen................................................................................................63
3.19 Vibrate a Window...........................................................................................................65
3.20 Limit TextField input to numeric value...........................................................................67
3.21 Limit TextField input to a maximum length....................................................................69
3.22 React to the ENTER key in a Textfield..........................................................................70
3.23 Make the ENTER key act like the TAB key....................................................................70
3.24 Reset all textfields in one shot.......................................................................................71
3.25 Limit a TextField to Uppercase......................................................................................72
3.26 Have an ImageButton....................................................................................................73
3.27 Reset a checkbox group................................................................................................76
3.28 Set the listbox width.......................................................................................................76
3.29 Align the column in a List...............................................................................................77
3.30 Have a srolling text display............................................................................................77
3.31 Label dynamic resizing..................................................................................................78
3.32 Make a TextArea "word−wrap"......................................................................................80
3.33 Synchronize a TextArea vs a Choice.............................................................................80
3.34 Display underlined text...................................................................................................80
3.35 Display vertical text........................................................................................................81
3.36 Have Label with many lines...........................................................................................82
3.37 Have a Label with underlined text..................................................................................86
3.38 Have a Label acting as HTML HREF (URLLabel).........................................................87
3.39 Display a GIF in a Canvas.............................................................................................88
3.40 Embed an image into a Frame.......................................................................................89
3.41 Load several images from a single GIF.........................................................................91
3.42 Load an Image from a JAR file......................................................................................92
3.43 Load an Icon from a jar (again)......................................................................................93
3.44 Scale an Image..............................................................................................................94
3.45 Fade an image...............................................................................................................95
3.46 Rotate an image.............................................................................................................97
Real's [email protected]
3 AWT
3.47 Create a scrollable canvas.............................................................................................99
3.48 Use an Image as the Applet background.....................................................................103
3.49 Have a simple Image browser.....................................................................................104
3.50 Simulate a "mouse over" event to toggle an image.....................................................107
3.51 Hide the mouse cursor.................................................................................................108
3.52 Make a color transparent.............................................................................................109
3.53 Save an Image as a GIF or JPEG file..........................................................................110
3.54 Use the same background color as the browser..........................................................111
3.55 Do simple animation using Images..............................................................................112
3.56 Do simple animation to show "work in progress".........................................................113
3.57 Get the color of a specific pixel....................................................................................114
3.58 Do "rubber−band" drawing...........................................................................................115
3.59 Convert RGB value to Hexadecimal (to be used in HTML for example)......................117
3.60 Draw a line or set a pixel in my own image..................................................................117
3.61 Draw a dashed line......................................................................................................118
3.62 Draw a line with a thickness.........................................................................................119
3.63 Draw a pie chart...........................................................................................................121
3.64 Draw faster rectangles.................................................................................................123
3.65 Get a screen capture and save it as a JPEG...............................................................124
3.66 Display a TIF................................................................................................................124
3.67 Convert a multi−page TIF into single−page TIF...........................................................126
3.68 Convert an Image to a BufferedImage.........................................................................127
3.69 Detect a double click vs simple click............................................................................128
3.70 Detect the mouse button used when clicking...............................................................129
3.71 Exit an application from a menu...................................................................................130
3.72 Trigger a click on a Button...........................................................................................131
4 Environment................................................................................................................................133
4.1 java−env........................................................................................................................133
4.2 Read environment variables from an application...........................................................133
4.3 Retrieve environment variables (JDK1.5)......................................................................137
4.4 Retrieve environment variable (JNI)..............................................................................137
4.5 Use a MAKE file.............................................................................................................138
4.6 Detect the browser/JVM type.........................................................................................139
4.7 Fix the "Wrong magic number" error message..............................................................141
4.8 Use a precompiler "à la C" with Java.............................................................................141
4.9 Open source packages..................................................................................................141
4.10 Ant................................................................................................................................141
4.11 Simple boolean flag.....................................................................................................142
4.12 Determine what are the classes actually used in a Java Applet or application............143
4.13 Set the memory available to the JVM..........................................................................143
4.14 Generate the Javadoc "en français"............................................................................143
4.15 Use JDK1.5 new features............................................................................................145
4.16 Check the class version...............................................................................................145
4.17 Get the system properties or the JVM uptime..............................................................147
4.18 Detect if running in a 64bit JVM...................................................................................147
4.19 Set the default JVM type..............................................................................................148
4.20 Capture the output of JAVAC.......................................................................................149
4.21 Freeze the JVIEW window in MS VJ++.......................................................................150
4.22 Wrap a Java beans in a COM object
Real's [email protected]
4 Environment
4.22 Wrap a Java beans in a COM object...........................................................................150
4.23 Know details about the JAVA at run−time...................................................................151
4.24 Detect the Microsoft JVM version installed..................................................................153
4.25 Run JAVA as a Windows service.................................................................................153
4.26 Execute a class from Windows Explorer......................................................................153
4.27 Create an icon to launch java apps for Windows?.......................................................155
4.28 Fix the "out of environment" error when setting a new CLASSPATH..........................155
4.29 Query Windows registry...............................................................................................156
4.30 Quickly retrieve available Java JVM on a workstation (Windows)...............................158
4.31 Get the Windows "My Documents" path......................................................................159
4.32 Get a return code from a VBS......................................................................................160
4.33 List currently running processes (Windows)................................................................161
4.33.1 Using TASKLIST.EXE.........................................................................................161
4.33.2 Using a VBS........................................................................................................162
4.34 Check if a program or process is running (Windows)..................................................163
4.35 Windows registry vs. Java JDK/JRE installation..........................................................164
4.36 Create a Taglet to document database access (Javadoc)...........................................165
4.36.1 newMethod.........................................................................................................165
4.37 Generate the Javadoc "en français"............................................................................169
4.38 Document a package using Javadoc...........................................................................170
4.39 Display a comment in a Javadoc.................................................................................171
4.40 Display XML in a javadoc.............................................................................................172
4.41 Add a copyright notice to a Javadoc............................................................................172
4.42 Use a Log file...............................................................................................................173
4.43 Trace the execution.....................................................................................................175
4.44 Time the execution.......................................................................................................177
4.45 Log information efficiently (with Log4J)........................................................................178
4.46 Change the logging level on−the−fly (Log4J)..............................................................179
4.47 Use a JAR/ZIP/CAB file with an Applet........................................................................180
4.48 Make ZIP/JAR file always accessible from applet.......................................................182
4.49 Make a JAR executable...............................................................................................182
4.50 Accessing jars from within a jar...................................................................................184
4.51 Access a JAR outside the CLASSPATH......................................................................184
4.52 Extract a file from a Jar................................................................................................185
4.53 Determine if running from JAR.....................................................................................186
4.54 Get list of classes in package (in a Jar).......................................................................187
4.55 Add version to Jar packaging.......................................................................................188
4.56 Use ANT to Build a JAR with version/build number.....................................................190
4.57 Include all jars in the classpath definition.....................................................................193
4.58 Windows batch file.......................................................................................................194
4.59 JDK6............................................................................................................................194
4.60 JAR (and ANT).............................................................................................................195
4.61 Detect the browser/JVM type.......................................................................................196
4.62 Detect if Java is enabled from HTML...........................................................................198
4.63 See the Java Console Window Log (Java plugin).......................................................198
5 Internationalization.....................................................................................................................200
5.1 java−inter.......................................................................................................................200
5.2 Load resources based upon client environment at startup............................................200
Real's [email protected]
5 Internationalization
5.3 Load resources dynamically..........................................................................................203
5.4 Load resources via a resources file...............................................................................206
5.5 Display "special character" using Unicode.....................................................................210
5.6 Display chinese/japanese characters............................................................................211
5.7 Localize a JOptionPane dialog......................................................................................211
5.8 Validate/Convert a number using the current Locale()..................................................213
5.9 Localize a JFileChooser.................................................................................................214
5.10 Disable localization......................................................................................................216
5.11 Generate the Javadoc "en français"............................................................................217
5.12 Sort a String array........................................................................................................218
5.13 Accentuated characters in Properties/ResourceBundle file.........................................220
5.14 Compare accentuated letters.......................................................................................220
5.15 Unaccent letters...........................................................................................................221
5.16 Output french characters to the console......................................................................224
5.17 Get the default character set of the JVM.....................................................................225
5.18 Convert OEM (DOS) file to Ansi (Windows)................................................................225
5.19 Detect non−ASCII character in a String.......................................................................226
6 IO..................................................................................................................................................228
6.1 java−io...........................................................................................................................228
6.2 Redirect output(stdout/stderr) to a frame.......................................................................228
6.3 Redirect printStackTrace() to a String............................................................................229
6.4 Output french characters to the console........................................................................230
6.5 Clear the console and control attributes........................................................................231
6.6 Print text to a printer easily............................................................................................232
6.7 Print without a Dialog.....................................................................................................232
6.8 Simple input from the keyboard.....................................................................................233
6.9 Initialize and write to a serial port...................................................................................234
6.10 Redirect to a NULL device...........................................................................................235
6.11 Get the volume label....................................................................................................235
6.12 Easy keyboard input (JDK1.5).....................................................................................236
6.13 Open or close a CD/DVD drive....................................................................................236
6.14 Get faster console output (System.out.println() replacement).....................................238
6.15 Execute an external program.......................................................................................239
6.16 Using Runtime.exec()..................................................................................................239
6.17 Launch a Windows CMD (or BAT) file and retrieve the errorlevel or exitcode.............240
6.18 Launch a Unix script....................................................................................................241
6.19 Using the ProcessBuilder.............................................................................................241
6.20 Windows rundll32 utility...............................................................................................242
6.21 PDF (Windows only)....................................................................................................242
6.22 PDF (Mac only)............................................................................................................242
6.23 Path to executable with spaces in them.......................................................................243
6.24 VBSCRIPT...................................................................................................................243
6.25 HTML Help (Windows only).........................................................................................243
6.26 Start Excel....................................................................................................................243
6.27 Start a Windows application under another account....................................................244
6.28 Windows : execute something in Program Files..........................................................245
6.29 Launch the application associated with a file extension..............................................245
6.30 Launch an application from another application..........................................................246
6.31 Start the default browser from an application
Real's [email protected]
6 IO
6.31 Start the default browser from an application..............................................................248
6.32 Execute a Windows Shortcut (.lnk)..............................................................................250
6.33 Create a file association with a Java program.............................................................250
6.34 Capture the output from a VBS....................................................................................252
6.35 Get a return code from a VBS......................................................................................253
6.36 Execute a CMD file stored in a JAR.............................................................................254
6.37 Read the content of a file.............................................................................................255
6.38 Read a text file from a jar.............................................................................................257
6.39 Extract a file from a Jar................................................................................................260
6.40 Read a data file with floats...........................................................................................261
6.41 Write to the end of a file...............................................................................................262
6.42 Write "real" ascii file.....................................................................................................263
6.43 Copy a file....................................................................................................................264
6.44 Use a "log file"..............................................................................................................266
6.45 Delete files with a certain extension.............................................................................267
6.46 Insert a line in a file......................................................................................................268
6.47 Read a file into a variable in one shot..........................................................................269
6.48 Serialize an object to a file...........................................................................................269
6.49 Redirect stdout to a file................................................................................................271
6.50 Get the "last modified" date from a file.........................................................................271
6.51 Check if a file exists.....................................................................................................271
6.52 Detect file modification.................................................................................................272
6.53 File/directory polling to detect change.........................................................................274
6.54 jpoller (directory poller)................................................................................................274
6.55 JNotify..........................................................................................................................274
6.56 Java Native Access (JNA)...........................................................................................275
6.57 Call native methods in a DLL from Java (NativeCall)..................................................275
6.58 Java 7..........................................................................................................................275
6.59 The simple (and naive!) approach...............................................................................275
6.60 Get the current directory..............................................................................................275
6.61 Get the "root" of an application....................................................................................276
6.62 Get the content of a directory with a Filter...................................................................276
6.63 Get the content of a directory with subdirectories........................................................278
6.64 Make a directory..........................................................................................................279
6.65 Create a fixed−length file.............................................................................................280
6.66 Delete a non−empty directory......................................................................................280
6.67 Create a temporary file................................................................................................281
6.68 Get the default character set of the JVM.....................................................................282
6.69 Parse a pathname........................................................................................................282
6.70 Handle Excel files........................................................................................................283
6.71 JDBC−ODBC Excel driver...........................................................................................283
6.72 JExcel..........................................................................................................................283
6.73 POI...............................................................................................................................284
6.74 JXLS............................................................................................................................285
6.75 xlSQL...........................................................................................................................285
6.76 JCOM...........................................................................................................................286
6.77 OpenXLS Java Spreadsheet SDK...............................................................................287
6.78 Handle CSV file............................................................................................................289
6.79 com.Ostermiller.util CSV Utils......................................................................................289
Real's [email protected]
6 IO
6.80 opencsv........................................................................................................................289
6.81 ServingXML.................................................................................................................289
6.82 Super CSV...................................................................................................................289
6.83 csvreader.....................................................................................................................289
6.84 CSVFile........................................................................................................................289
6.85 FlatPack.......................................................................................................................289
6.86 Create an Excel file......................................................................................................290
6.87 Create or process a PDF file........................................................................................290
6.88 Create a PDF...............................................................................................................292
6.89 iText.............................................................................................................................292
6.90 Convert OEM (DOS) file to Ansi (Windows)................................................................293
6.91 Close a stream in a try/catch block..............................................................................294
6.92 Rename a file extension..............................................................................................295
6.93 Remove HTML tags from a file to extract only the TEXT.............................................295
6.94 Using regular expression.............................................................................................296
6.95 Using javax.swing.text.html.HTMLEditorKit.................................................................296
6.96 Get the Mime Type from a File....................................................................................297
6.96.1 Using javax.activation.MimetypesFileTypeMap..................................................297
6.96.2 Using java.net.URL.............................................................................................298
6.96.3 Using JMimeMagic..............................................................................................298
6.96.4 Using mime−util..................................................................................................298
6.96.5 Using Droid.........................................................................................................299
6.96.6 Aperture framework.............................................................................................299
6.97 Sort a directory listing..................................................................................................299
6.98 Filter a directory listing by date....................................................................................300
6.99 Display a comment in a Javadoc.................................................................................301
6.100 Create a compressed (ZIP) file..................................................................................302
6.101 Display compressed (ZIP) file content.......................................................................303
6.102 Expand the compressed (ZIP) file..............................................................................304
6.103 Emit a beep................................................................................................................305
6.104 Emit a Tone................................................................................................................305
6.105 Play an audio file from an application........................................................................306
7 JDBC............................................................................................................................................308
7.1 java−jdbc........................................................................................................................308
7.2 Connect to a database via JDBC−ODBC......................................................................308
7.3 SELECT data from a table.............................................................................................309
7.4 INSERT data into a table...............................................................................................310
7.5 MODIFY data in a table.................................................................................................311
7.6 DELETE data in a table.................................................................................................312
7.7 Test for an empty ResultSet..........................................................................................312
7.8 Store and retrieve an object from a table.......................................................................313
7.9 Retrieve an Image..........................................................................................................315
7.10 Insert an Image............................................................................................................315
7.11 Connect to an Oracle database with JDBC.................................................................315
7.12 Connect to Oracle using a connection pool.................................................................316
7.13 Get JDBC driver for major database vendors..............................................................319
7.14 Handle dates................................................................................................................319
7.15 Call a stored procedure................................................................................................320
7.16 Stored procedure with Input/Output parms and a ResultSet
Real's [email protected]
7 JDBC
7.16 Stored procedure with Input/Output parms and a ResultSet.......................................321
7.17 Fix incomplete field returned by the ResultSet............................................................322
7.18 Get a record count with a SQL Statement...................................................................322
7.19 Transfer a ResultSet to a JTable.................................................................................323
7.20 List tables in a database..............................................................................................323
7.21 Display ResultSet data in an HTML Table in Servlet...................................................324
7.22 Detect SQL errors or warnings....................................................................................325
7.23 Using DSN−less connection........................................................................................326
7.24 Read data from Excel worksheet.................................................................................327
7.25 Handle Excel files........................................................................................................329
7.26 JDBC−ODBC Excel driver...........................................................................................329
7.27 JExcel..........................................................................................................................329
7.28 POI...............................................................................................................................330
7.29 JXLS............................................................................................................................330
7.30 xlSQL...........................................................................................................................331
7.31 JCOM...........................................................................................................................331
7.32 OpenXLS Java Spreadsheet SDK...............................................................................333
7.33 Specify a CharSet when connecting to a DBMS..........................................................334
7.34 Get current date using JDBC.......................................................................................335
7.35 Enable JDBC logging...................................................................................................335
7.36 Detect if a table exists..................................................................................................337
7.37 Convert a ResultSet to XML........................................................................................337
7.38 Escape special character in a LIKE clause..................................................................339
7.39 Insert the current date..................................................................................................340
7.40 Log the SQL Statements..............................................................................................340
7.41 Plain JDBC Logging.....................................................................................................340
7.42 P6Spy..........................................................................................................................340
7.43 Proxool.........................................................................................................................341
8 JNI................................................................................................................................................342
8.1 java−jni...........................................................................................................................342
8.2 Use native code through JNI..........................................................................................342
8.3 Pass a string to/from Java to/from C..............................................................................342
8.4 Set the computer clock..................................................................................................344
8.5 Determine the signature of a method.............................................................................344
8.6 Use arrays......................................................................................................................346
8.7 Load a DLL....................................................................................................................347
8.8 Use the MouseWheel.....................................................................................................347
8.9 Throw an Exception (from JNI code).............................................................................347
8.10 Throw my own Exception (from JNI code)...................................................................348
8.11 JNI from a package......................................................................................................349
8.12 Make a Window "stay on top"......................................................................................349
8.13 Start a JVM from C......................................................................................................350
8.14 Retrieve environment variable (JNI)............................................................................351
8.15 Get the PID..................................................................................................................351
8.16 Clear the console, set color and cursor position (JNI).................................................352
8.17 Call Windows API (Open source solution)...................................................................355
Real's [email protected]
9 Javascript interaction.................................................................................................................356
9.1 java−js............................................................................................................................356
9.2 * Read me *....................................................................................................................356
9.3 Wake−up a Java applet.................................................................................................356
9.4 Call a Java method from Javascript...............................................................................358
9.5 Calling Java applets methods using DOM and JavaScript............................................360
9.6 Access Java variables from Javascript..........................................................................360
9.7 Call Javascript from a Java applet.................................................................................361
9.8 Create dynamic HTML from a Java applet....................................................................364
9.9 Have Applets on different frames communicates with each other.................................365
9.10 Send a message from an Applet to another Applet on a different page......................366
9.11 Retrieve values from a Java applet for HTML form (CGI)............................................368
9.12 Detect if an Applet is ready..........................................................................................369
9.13 Read/Write HTML field values from JAVA...................................................................370
9.14 Detect if Java is enabled..............................................................................................372
9.15 Detect if Java 1.1 (with event delegation) is available.................................................372
9.16 Access Cookies from a Java Applet............................................................................372
9.17 Set Applet PARAM VALUE from javascript.................................................................375
9.18 Pass an Array between Java and Javascript...............................................................376
9.19 Interaction without LiveConnect...................................................................................378
9.20 Directory listing on the Web server in a Java Applet...................................................382
9.21 Have a Java button close the browser window............................................................384
9.22 Detect if cookies are enabled.......................................................................................385
9.23 Display a page after all applets are loaded..................................................................386
10 Servlet/JSP................................................................................................................................387
10.1 java−jsp........................................................................................................................387
10.2 Read me......................................................................................................................387
10.3 Get parameters passed to a servlet.............................................................................387
10.4 Detect no argument condition in a Servlet...................................................................388
10.5 Set a Cookie from a servlet..........................................................................................389
10.6 Read a Cookie from a servlet......................................................................................389
10.7 Delete (or expire) a Cookie from a servlet...................................................................390
10.8 Ask for a password from a Servlet...............................................................................390
10.9 Talk to a CGI/Servlet....................................................................................................390
10.10 Test for Cookies.........................................................................................................391
10.11 Display ResultSet data in an HTML Table in Servlet.................................................392
10.12 Specify the filename to be used for a file sent by a Servlet.......................................393
10.13 Pass information to another servlet/jsp......................................................................393
10.14 Handle PDF output....................................................................................................394
10.15 Detect if the connection is via a secure channel........................................................394
10.16 In a Servlet, check if Form Field is present................................................................394
10.17 Get the root dir of a web app.....................................................................................395
10.18 Get client IP address from JSP..................................................................................395
10.19 Output a binary stream from a JSP............................................................................395
10.20 Use a connection cache from JSP.............................................................................396
10.21 Read a Web Application property..............................................................................397
10.22 Use EJB from JSP.....................................................................................................398
10.23 Define a method in a JSP page.................................................................................398
10.24 Precompile JSP pages...............................................................................................399
10.25 Get a list of directories for JSP
Real's [email protected]
10 Servlet/JSP
10.25 Get a list of directories for JSP..................................................................................400
10.26 Use and share a class in JSP pages.........................................................................400
10.27 Get the root dir of a web app.....................................................................................402
10.28 Launch an applet from a JSP.....................................................................................402
10.29 Prevent caching of a JSP output................................................................................403
10.30 Call another EJB........................................................................................................403
10.31 Keep java files generated from JSP (BEA WLS).......................................................404
10.32 Get the server version (BEA WLS)............................................................................404
10.33 Quickly create a Web application with BEA WLS......................................................405
10.34 Nicely display WEB.XML informations.......................................................................405
10.35 Reverse the CLASSLOADER order (BEA)................................................................406
10.36 Detect change in JSP and recompile (BEA)..............................................................407
11 Language...................................................................................................................................408
11.1 java−language.............................................................................................................408
11.2 * Read me *..................................................................................................................408
11.3 Obtain from where a Class is loaded...........................................................................409
11.4 Get the class name in a static method.........................................................................410
11.5 Get the current method name......................................................................................410
11.6 Call a method dynamically (Reflection)........................................................................411
11.7 Detect if a package is available...................................................................................413
11.8 Create an object from a string......................................................................................414
11.9 Get a variable value from the variable name...............................................................415
11.10 Make methods that have unspecified number of parameters....................................416
11.11 Create a java source dynamically, compile and call..................................................417
11.12 Launch an application from another application........................................................418
11.13 Access the enclosing class from an inner class.........................................................419
11.14 Access inner class from outside................................................................................420
11.15 Use globally defined constants..................................................................................421
11.16 Serialize an Object.....................................................................................................422
11.17 Serialize an Object over a socket..............................................................................424
11.18 Easily remove my debugging code............................................................................424
11.19 Have a singleton........................................................................................................425
11.20 Multiple expressions in for loops................................................................................426
11.21 Handle the List conflict...............................................................................................426
11.22 Use a generic toString().............................................................................................426
11.23 Use Object.clone().....................................................................................................428
11.24 Static field, constructor and exception.......................................................................429
11.25 Use a Label break......................................................................................................430
11.26 Put printStackTrace() into a String.............................................................................431
11.27 Use a Hashtable........................................................................................................431
11.28 Scan the content of a hashtable................................................................................432
11.29 Sort an array..............................................................................................................432
11.30 Initialize multidimensional array.................................................................................434
11.31 Get array upperbound................................................................................................434
11.32 Convert a String to an array.......................................................................................435
11.33 Sort in reverse order..................................................................................................436
11.34 Resize an array..........................................................................................................436
11.35 Dump array content...................................................................................................437
Real's [email protected]
11 Language
11.36 Initialize a static array................................................................................................438
11.37 Sort an Hashtable......................................................................................................439
11.38 Eliminate "[unchecked] unchecked call ..." compiler warning....................................440
12 ANT............................................................................................................................................442
12.1 Sort on many fields......................................................................................................442
12.2 Optimize Collection usage...........................................................................................444
12.3 Sort an HashMap.........................................................................................................446
12.4 Get a key from value with an HashMap.......................................................................446
12.5 Iterate a Collection and remove an item......................................................................447
12.6 Count distinct elements in a Vector.............................................................................448
12.7 Dump the content of a Collection (JDK 1.5).................................................................450
12.8 Use an INI file (properties)...........................................................................................450
12.9 Load a properties file...................................................................................................452
12.10 Accentuated characters in Properties/ResourceBundle file.......................................452
12.11 Have a multi−line value in a properties file................................................................453
12.12 Use XML with Properties...........................................................................................453
12.13 Use the Registry to store informations (Preferences API).........................................454
12.14 Sort Properties when saving......................................................................................455
13 Networking................................................................................................................................457
13.1 java−net.......................................................................................................................457
13.2 Extract network card address......................................................................................457
13.3 Get the workstation name/ip........................................................................................459
13.4 Find port number not in use.........................................................................................461
13.5 Disable DNS caching...................................................................................................461
13.6 Encode/Decode to/from Base64..................................................................................462
13.7 Using javax.mail.internet.MimeUtility...........................................................................463
13.8 Using Apache Commons Codec..................................................................................463
13.9 MiGBase64..................................................................................................................464
13.10 Lookup using MX record to validate mail server........................................................464
13.11 Send an email using the SMTP protocol....................................................................472
13.12 Check if there is mail waiting.....................................................................................474
13.13 Receive email............................................................................................................475
13.14 Send email with an attachment..................................................................................477
13.15 Send email with JavaMail..........................................................................................483
13.16 Send email with authentication..................................................................................485
13.17 Send HTML mail with images (Javamail)...................................................................486
13.18 Debug a Javamail Program.......................................................................................488
13.19 Send email with SMTPS (eg. Google GMail) (Javamail)...........................................489
13.19.1 Settings for well known mail providers..............................................................490
13.20 Mix plain text and HTML content in a mail.................................................................490
13.21 Read an Outlook MSG file.........................................................................................491
13.22 msgparser..................................................................................................................491
13.23 Apache POI HSMF....................................................................................................492
13.24 jmbox.........................................................................................................................492
13.25 Handle EML file with JavaMail...................................................................................492
13.26 Check if a file was modified on the server.................................................................493
13.27 Check if a page exists................................................................................................494
13.28 Connect through a Proxy
Real's [email protected]
13 Networking
13.28 Connect through a Proxy...........................................................................................495
13.29 Identify yourself using HTTP Authentification............................................................498
13.30 Talk to a CGI/Servlet..................................................................................................500
13.31 Write/Read cookies using HTTP................................................................................501
13.32 Read a GIF or CLASS from an URL save it locally....................................................503
13.33 Resolve a relative URL..............................................................................................504
13.34 File size from URL.....................................................................................................505
13.35 Use the HTTPS protocol............................................................................................505
13.36 Fetch a page from Google.........................................................................................506
13.37 Upload a file to a server.............................................................................................507
13.38 Connect through a Proxy...........................................................................................507
13.39 Have timeout on socket connection...........................................................................510
13.40 Ping a server..............................................................................................................510
13.41 Get the Date from server...........................................................................................511
13.42 Get the client IP address............................................................................................512
13.43 Use the java.net.Socket.setSoLinger method............................................................512
13.44 Use the java.net.Socket.setTcpNoDelay method......................................................513
13.45 Find out who is accessing my ServerSocket.............................................................513
13.46 Transfer a file via Socket...........................................................................................513
14 Security......................................................................................................................................516
14.1 java−security................................................................................................................516
14.2 Encrypt a password.....................................................................................................516
14.3 Create a checksum......................................................................................................518
14.4 Get the user name.......................................................................................................521
14.5 Get username using NT Challenge (NTLM)................................................................521
14.6 Check if the current user belongs a specific Windows group/role...............................523
14.7 Prompt for password from the console........................................................................523
14.8 Prevent XSS exploit.....................................................................................................524
14.9 Sanitize the input by removing suspicious tags...........................................................525
14.10 Sanitize the output by removing suspicious characters.............................................525
14.11 Display a simple username/password Dialog from an Applet....................................526
15 Swing.........................................................................................................................................529
15.1 java−swing...................................................................................................................529
15.2 * Read me *..................................................................................................................529
15.3 Change component default font...................................................................................529
15.4 Repaint problem under the mouse cursor (JDK1.2)....................................................530
15.5 Set the LookAndFeel...................................................................................................530
15.6 Use any LookAndFeel on any plateform......................................................................530
15.7 Use a Timer.................................................................................................................531
15.8 Share ActionEvent handler..........................................................................................531
15.9 Get default values for Swing−based user interface.....................................................533
15.10 Have a systray icon (Windows)..................................................................................534
15.11 Close a JFrame under condition................................................................................536
15.12 Maximize a JFrame....................................................................................................537
15.13 Capture System.out into a JFrame............................................................................538
15.14 Remove the titlebar of JInternalFrame.......................................................................540
15.15 Have borders on a JWindow/JFrame.........................................................................540
Real's [email protected]
15 Swing
15.16 Display HTML in a JScrollPane.................................................................................541
15.17 Use a JOptionPane....................................................................................................542
15.18 Localize a JOptionPane dialog..................................................................................543
15.19 Customize JOptionPane buttons...............................................................................545
15.20 Localize a JFileChooser.............................................................................................545
15.21 Select a directory with a JFileChooser.......................................................................548
15.22 Disable the JFileChooser's "New folder" button.........................................................549
15.23 Validate a filename from a JFileChooser...................................................................550
15.24 Make a JFrame looks like a JDialog..........................................................................552
15.25 Based on JTextField content, enable or disable a JButton........................................553
15.26 Apply special filter to a JtextField...............................................................................553
15.27 Limit JTextField input to a maximum length...............................................................556
15.28 Validate a value on the lostFocus event....................................................................557
15.29 Make sure that my jTextfield has the focus when a JFrame is created.....................559
15.30 Stop the beep on JFormattedTextField......................................................................560
15.31 Right justified JTextfield content................................................................................560
15.32 Set the focus on a particuliar JTextField....................................................................561
15.33 Make JTextField unselectable...................................................................................561
15.34 Use a JTree to navigate in a site...............................................................................562
15.35 Expand or collapse a JTree.......................................................................................568
15.36 Have a popup attached to a JTree.............................................................................570
15.37 Traverse a JTree........................................................................................................572
15.38 Show dotted lines in a JTree......................................................................................574
15.39 Explore directories with a JTree.................................................................................574
15.40 Prevent JTree collapsing...........................................................................................575
15.41 Single selection in a JTree.........................................................................................576
15.42 Reduce JTree children indentation............................................................................576
15.43 Use + or − for JTree Icons.........................................................................................576
15.44 Change the JTable header color................................................................................578
15.45 Double click on a JTable............................................................................................578
15.46 Read a data file into a JTable....................................................................................580
15.47 Disable row selection in a JTable..............................................................................583
15.48 Read a data file into a JTable and reload if data file have changed..........................583
15.49 Hide a column in JTable............................................................................................585
15.50 Scroll a JTable to the last row....................................................................................586
15.51 Transfer a ResultSet to a JTable...............................................................................587
15.52 Have on a JScrollPane/JTable an horizontal JScrollbar............................................587
15.53 Make a JList select an item on doubleclick or the ENTER key..................................588
15.54 Make a JList like a scrolling text display....................................................................589
15.55 Have images in a JList...............................................................................................590
15.56 Add a row and clear a JList........................................................................................592
15.57 Sort a JList.................................................................................................................593
15.58 Double click on a JList...............................................................................................595
15.59 Have a PopUp on a JList...........................................................................................596
15.60 Make a JLabel selectable with the mouse.................................................................597
15.61 Change JLabel background color..............................................................................598
15.62 Bold / Unbold a JLabel...............................................................................................598
15.63 Multi−line JLabel........................................................................................................598
15.64 Underline a string.......................................................................................................598
15.65 Update a JLabel
Real's [email protected]
15 Swing
15.65 Update a JLabel.........................................................................................................599
15.66 Display a blinking JLabel...........................................................................................599
15.67 Set the cursor position in a JTextArea.......................................................................601
15.68 Have Multi−line string in a JToolTip...........................................................................601
15.69 Change Tooltip color..................................................................................................602
15.70 Change a JTooltip font...............................................................................................602
15.71 Keep a JTooltip visible...............................................................................................603
15.72 Display icon associated with an executable...............................................................603
15.73 Have items in JMenubar at rightmost position...........................................................605
15.74 Have an JButton with an Image.................................................................................606
15.75 Trigger a click on a Button.........................................................................................607
16 Thread........................................................................................................................................609
16.1 java−thread..................................................................................................................609
16.2 Pipe the output of a thread to the input of another one................................................609
16.3 Pipe the output of a thread to the input of other threads..............................................611
16.4 Wait the for the completion of a thread........................................................................613
16.5 Control a thread from outside......................................................................................614
16.6 Create a Timer object..................................................................................................615
16.7 Pause the execution....................................................................................................616
16.8 Execute a method at a specified time interval.............................................................616
16.9 Execute a process at regular interval...........................................................................618
16.10 Handle concurrent read/write.....................................................................................619
16.11 Communicate between threads using a Queue.........................................................620
16.12 Get a unique identifier................................................................................................625
16.13 Using java.rmi.dgc.VMID...........................................................................................625
16.14 Using java.util.UUID...................................................................................................625
16.15 Using Apache commons............................................................................................626
16.16 Using java.util.concurrent.AtomicLong.......................................................................626
17 Varia...........................................................................................................................................627
17.1 java−varia....................................................................................................................627
17.2 Use System time to generate unique ID......................................................................627
17.3 Get a unique identifier..................................................................................................627
17.4 Using java.rmi.dgc.VMID.............................................................................................627
17.5 Using java.util.UUID.....................................................................................................628
17.6 Using Apache commons..............................................................................................628
17.7 Using java.util.concurrent.AtomicLong.........................................................................628
17.8 Get the hard disk serial number or Motherboard serial number..................................629
17.9 Motherboard serial number..........................................................................................629
17.10 Hard disk serial number.............................................................................................630
17.11 Sort an array..............................................................................................................631
17.12 Sort a String array......................................................................................................632
17.13 Do a selection sort.....................................................................................................634
17.14 Validate a Social Security Number (canadian)..........................................................635
17.15 Validate a Credit Card Number..................................................................................636
17.16 Obtain from where a Class is loaded.........................................................................639
17.17 Get the class name with or without the package.......................................................640
17.18 See the generated bytecode......................................................................................641
Real's [email protected]
17 Varia
17.19 Self replicating programs...........................................................................................644
17.20 A curiosity (strange Java code)..................................................................................645
17.21 Classic bugs...............................................................................................................646
17.22 Number of the beast!.................................................................................................647
17.23 Preventing multiple instances of an application.........................................................648
17.24 Trap JVM shutdown...................................................................................................651
17.25 Use Java scripting engine (JDK 1.6)..........................................................................651
18 XML............................................................................................................................................653
18.1 java−xml.......................................................................................................................653
18.2 Read me......................................................................................................................653
18.3 Display XML using plain HTML....................................................................................654
18.4 Transform XML into HTML using XSLT.......................................................................655
18.5 Parse using SAX or DOM............................................................................................656
18.6 Parse an XML string....................................................................................................658
18.7 Create an XML document with DOM...........................................................................659
18.8 Attach a stylesheet to an XML file................................................................................661
18.9 Create an XML file and attach an XSL.........................................................................662
18.10 Nicely display WEB.XML informations.......................................................................665
18.11 Serialize an object using XML....................................................................................666
18.12 Convert a flat file to XML (SAX).................................................................................667
18.13 Convert a flat file to XML (DOM)................................................................................669
18.14 Convert a ResultSet to XML......................................................................................672
18.15 Parse with XPath.......................................................................................................674
18.16 Strip extra spaces in a XML string.............................................................................675
18.17 Create an XML file and attach an XSL.......................................................................676
18.18 Use XML with Properties...........................................................................................679
18.19 Change a particular node in XML..............................................................................680
18.20 Create a RSS feed (part 1)........................................................................................681
18.20.1 RSS 2.0.............................................................................................................681
18.20.2 Atom..................................................................................................................682
18.20.3 Creating a feed..................................................................................................683
18.20.4 Creating a feed with Apache Commons Digester.............................................683
18.20.5 Creating a feed with Rome................................................................................685
18.21 Creating an RSS Feed (part 2)..................................................................................686
18.22 Parse a RSS XML file................................................................................................692
18.22.1 Parsing a feed with Apache Commons Digester...............................................692
18.22.2 Parsing a feed with ROME................................................................................693
18.22.3 RSS−UTIL.TLD.................................................................................................694
18.23 Add a Live bookmark.................................................................................................694
18.24 Validate a RSS feed...................................................................................................694
18.25 Attach a CSS to RSS feed.........................................................................................694
19 DEPRECATED...........................................................................................................................697
19.1 java−deprecated..........................................................................................................697
19.2 * Read me * (this howto is deprecated)......................................................................697
19.3 Keep the console open after execution (this howto is deprecated).............................697
19.4 Read the Registry (this howto is deprecated)..............................................................698
19.5 Call a Win API (this howto is deprecated)....................................................................698
19.6 Display a BMP image (this howto is deprecated)
Real's [email protected]
19 DEPRECATED
19.6 Display a BMP image (this howto is deprecated)........................................................700
19.7 Play a WAV audio file (this howto is deprecated)........................................................700
19.8 Detect if the MS JVM is used (this howto is deprecated).............................................701
19.9 Get the latest MS JVM (this howto is deprecated).......................................................701
19.10 Uninstalling the MS JVM (this howto is deprecated)..................................................701
19.11 Wrap a Java class in a COM object (this howto is deprecated).................................702
19.12 Sign an applet (this howto is deprecated)..................................................................704
19.13 Bypass the need for a certificate (this howto is deprecated).....................................704
19.14 Start an executable on the client (this howto is deprecated).....................................705
19.15 Get rid of the message "Warning − unsigned applet window" (this howto is
deprecated).........................................................................................................................706
19.16 Read/write a local file from an Applet (this howto is deprecated)..............................706
19.17 Write "other−browser−friendly" code when using the Netscape Capabilities
package (this howto is deprecated)....................................................................................707
19.18 Disable the JIT compiler in Netscape or IE (this howto is deprecated)......................708
19.19 Start automatically JAVA when opening Netscape (this howto is deprecated)..........709
19.20 Use Netscape Java Console hidden commands (this howto is deprecated).............709
19.21 Avoid the Netscape "Couldn't connect to '' with origin from
'local−classpath−classes'" message. (this howto is deprecated)........................................709
19.22 Post a message on a newsserver using NNTP protocol (this howto is
deprecated).........................................................................................................................710
19.23 Read messages from a newsserver (this howto is deprecated)................................710
19.24 Get a list of headers from a newsgroup (this howto is deprecated)...........................711
19.25 Get a list of all available newsgroup from a newsserver (this howto is
deprecated).........................................................................................................................712
19.26 Detect if Swing is installed (this howto is deprecated)...............................................713
19.27 Make Swing always available from Netscape (this howto is deprecated)..................713
20 String/Number...........................................................................................................................714
20.1 java−stringnumber.......................................................................................................714
20.2 * Read me *..................................................................................................................714
20.3 Convert from type X to type Y......................................................................................715
20.4 Strip certain characters from a String..........................................................................717
20.5 Replace/remove character in a String..........................................................................718
20.6 Replace every occurences of a string within a string...................................................719
20.7 "Tokenize" a string.......................................................................................................720
20.8 Split a string using String.split()...................................................................................725
20.9 Optimize String operations...........................................................................................729
20.10 Remove spaces from a string....................................................................................730
20.11 Test if a String starts with a digit or uppercase letter.................................................731
20.12 Get InputStream from a String...................................................................................731
20.13 Easy String padding...................................................................................................732
20.14 Replace \r\n with the <br> tag....................................................................................732
20.15 Unaccent letters.........................................................................................................733
20.16 Apply a mask to String...............................................................................................735
20.17 Format a String (JDK1.5)...........................................................................................736
20.18 Replace a "\" by "\\"....................................................................................................737
20.19 Substitute tokens in a String......................................................................................738
20.20 Compare accentuated letters.....................................................................................738
Real's [email protected]
20 String/Number
20.21 Create a String with fixed length and filled with a specific character.........................739
20.22 Unquote a String........................................................................................................740
20.23 Escape HTML special characters from a String.........................................................740
20.24 Unescape HTML special characters from a String....................................................742
20.25 Using HashMap.........................................................................................................743
20.26 Using Array................................................................................................................744
20.27 Detect non−ASCII character in a String.....................................................................745
20.28 Remove HTML tags from a file to extract only the TEXT...........................................746
20.29 Using regular expression...........................................................................................746
20.30 Using javax.swing.text.html.HTMLEditorKit...............................................................746
20.31 Convert a byte array to a Hex string..........................................................................747
20.32 Apply proper uppercase and lowercase on a String..................................................748
20.33 Encode/Decode to/from Base64................................................................................749
20.34 Using javax.mail.internet.MimeUtility.........................................................................749
20.35 Using Apache Commons Codec................................................................................750
20.36 MiGBase64................................................................................................................750
20.37 Justify a string with wordwrap....................................................................................750
20.38 Convert from type X to type Y....................................................................................751
20.39 Type conversion (JDK1.5).........................................................................................754
20.40 Round a double..........................................................................................................755
20.41 Display numbers with commas..................................................................................755
20.42 Display numbers in scientific notation........................................................................756
20.43 Display numbers with leading zeroes........................................................................757
20.44 Get a random number................................................................................................758
20.45 Convert an UNSIGNED byte to a JAVA type.............................................................758
20.46 Deal with big−endian and little−endian order.............................................................759
20.47 Pass an integer by reference.....................................................................................760
20.48 Pass floats as string literals to a method...................................................................760
20.49 Get random numbers.................................................................................................760
20.50 Convert number into words........................................................................................761
20.51 Arithmetic with double................................................................................................769
20.52 Detect even/odd number............................................................................................770
20.53 Convert bytes to megabytes......................................................................................770
20.54 Validate a number......................................................................................................771
20.55 Get a unique identifier................................................................................................772
20.56 Using java.rmi.dgc.VMID...........................................................................................772
20.57 Using java.util.UUID...................................................................................................772
20.58 Using Apache commons............................................................................................773
20.59 Using java.util.concurrent.AtomicLong.......................................................................773
20.60 Validate/Convert a number using the current Locale()..............................................773
21 Open Source.............................................................................................................................775
21.1 java−os........................................................................................................................775
21.2 Call Windows API (Open source solution)...................................................................775
21.3 Call COM object...........................................................................................................775
21.4 com4j...........................................................................................................................775
21.5 j−interop.......................................................................................................................776
21.6 j−xchange....................................................................................................................776
21.7 Run JAVA as a Windows service.................................................................................776
21.8 Create entity−relation diagram
Real's [email protected]
21 Open Source
21.8 Create entity−relation diagram.....................................................................................777
21.9 Java Remote desktop tool...........................................................................................777
21.10 Create entity−relation diagram...................................................................................777
21.11 Launch a java program as a Windows EXE file.........................................................778
21.12 WinRun4J..................................................................................................................778
21.13 JSmooth.....................................................................................................................778
21.14 Launch4J...................................................................................................................778
21.15 Handle CSV file..........................................................................................................779
21.16 com.Ostermiller.util CSV Utils....................................................................................779
21.17 opencsv......................................................................................................................779
21.18 ServingXML...............................................................................................................779
21.19 Super CSV.................................................................................................................779
21.20 csvreader...................................................................................................................779
21.21 CSVFile......................................................................................................................779
21.22 FlatPack.....................................................................................................................780
21.23 Handle Excel files......................................................................................................780
21.24 JDBC−ODBC Excel driver.........................................................................................780
21.25 JExcel........................................................................................................................780
21.26 POI.............................................................................................................................781
21.27 JXLS..........................................................................................................................781
21.28 xlSQL.........................................................................................................................782
21.29 JCOM.........................................................................................................................782
21.30 OpenXLS Java Spreadsheet SDK.............................................................................784
21.31 Browse a Queue (JMS/MQ).......................................................................................785
21.32 Convert a .class to .java file (decompiler)..................................................................786
21.33 Jad.............................................................................................................................786
21.34 JadClipse...................................................................................................................786
21.35 JarPlug.......................................................................................................................786
21.36 Deploy an application as only 1 jar............................................................................787
21.37 One−Jar.....................................................................................................................787
21.38 Fat Jar........................................................................................................................787
21.39 Read an Outlook MSG file.........................................................................................787
21.40 msgparser..................................................................................................................787
21.41 Apache POI HSMF....................................................................................................788
21.42 jmbox.........................................................................................................................788
21.43 File/directory polling to detect change.......................................................................789
21.44 jpoller (directory poller)..............................................................................................789
21.45 JNotify........................................................................................................................789
21.46 Java Native Access (JNA).........................................................................................789
21.47 Call native methods in a DLL from Java (NativeCall)................................................789
21.48 Java 7........................................................................................................................789
21.49 The simple (and naive!) approach.............................................................................790
21.50 Create a PDF.............................................................................................................790
21.51 iText...........................................................................................................................790
1 Applet
1.1 java−applet
1.2 Goto to a new URL from an Applet
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0002.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" current frame
"_parent" parent frame
"_top" base frame
"_blank" 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 java.applet.*;
import java.awt.*;
import java.awt.event.*;
import 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 loaded
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0003.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 line
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0010.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;
int width;
public void init(){
message = getParameter("message");
if(message == null)
message = " Isn't scrolling text in the status line annoying? ";
1.3 Determine the host from where the Applet is loaded
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
}
catch(InterruptedException e){
break;
}
}
}
}
1.3 Determine the host from where the Applet is loaded
Try it here.
1.5 Use a search engine
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0011.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;
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;
1.5 Use a search engine
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 on−screen clock
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0012.html
import java.applet.*;
import java.awt.*;
import java.util.*;
import 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;
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
1.6 Have an on−screen clock
(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="yyyy−MM−dd hh:mm:ss">
</APPLET><P>
<APPLET CODE="MyClock.class"
HEIGHT=25 WIDTH=200>
<PARAM NAME="format" VALUE="h:mm a">
</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.6 Have an on−screen clock
1.7 Have Applets on the same page communicate with each
other
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0022.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;
}
}
[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" );
}
}
1.7 Have Applets on the same page communicate with each other
[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
other
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0023.html
It is possible to share data between different applets via static variables
[HTML (java−0023.html)]
<HTML><HEAD></HEAD>
<FRAMESET COLS="50%,*">
<FRAME SRC="java−0023−f1.html" NAME="f1">
<FRAME SRC="java−0023−f2.html" NAME="f2">
</FRAMESET>
</HEAD>
[HTML (java−0023−f1.html AND java−0023−f2.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);
1.8 Have Applets on different frames communicates with each other
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 How−to.
1.9 Send a message from an Applet to another Applet on a
different page
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0041.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 java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
1.9 Send a message from an Applet to another Applet on a different page
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
SecondApplet.java
import java.applet.*;
import java.awt.*;
import java.net.*;
public class SecondAppletJ extends Applet {
public void init() {
Label l = new Label("Message from 1st Applet");
add (l);
TextField tf = new TextField( 50 );
add(tf);
// 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).
1.9 Send a message from an Applet to another Applet on a different page
you to convert from a MIME format called "x−www−form−urlencoded"
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 3−character
strings which begin with the percent sign,
"%xy", where xy is the two−digit hexadecimal
representation of the lower 8−bits 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
How−to.
1.10 Have an applet launch an other applet
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0025.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;
1.10 Have an applet launch an other applet
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) {
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);
}
}
1.10 Have an applet launch an other applet
try it here.
1.11 Get the user name
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0048.html
In application :
String username;
username = System.getProperty("user.name");
or in 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());
}
}
In Applet there is no way unless you ask for it or use a signed applet. If you have access to a
server−side, something like an ASP page can be used to detect the current NT user name if the
client is configured correcty.
See this related HowTo for a JSP hack!
1.12 Access parameters passed in the URL
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0049.html
import java.applet.*;
import java.util.*;
public class AppletUrlParams extends Applet {
Hashtable searchparms;
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 Hashtable for easy reference.
// ex. String name = searchparms.get("value2")
doit();
}
public void doit() {
int i;
String completeURL = getDocumentBase().toString();
1.11 Get the user name
System.out.println("Complete URL: " + completeURL);
i = completeURL.indexOf("?");
if (i > −1) {
String searchURL = completeURL.substring(completeURL.indexOf("?") + 1);
System.out.println("Search URL: " + searchURL);
StringTokenizer st =
new StringTokenizer(searchURL, "
while(st.hasMoreTokens()){
String searchValue=st.nextToken();
System.out.println("value :" + searchValue);
}
initHashtable(searchURL);
dumpHashtable();
}
}
public void initHashtable(String search) {
searchparms = new Hashtable();
StringTokenizer st1 =
new StringTokenizer(search, "
while(st1.hasMoreTokens()){
StringTokenizer st2 =
new StringTokenizer(st1.nextToken(), "=");
searchparms.put(st2.nextToken(),
java.net.URLDecoder.decode(st2.nextToken()));
}
}
public void dumpHashtable() {
Enumeration keys = searchparms.keys();
System.out.println("−−−−−−−−");
while( keys.hasMoreElements() ) {
String s = (String) keys.nextElement();
System.out.println("key : " + s + " value : " + searchparms.get(s));
}
System.out.println("−−−−−−−−");
}
}
Test it here.
The resultat 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: NS won't return the whole URL, but only domain name and directory but without .html and
parameters. In IE (5.5) it's ok. So: if we have www.domain.com/applets/win.html?winner=Maurice
getDocumentBase () will return:
NS: www.domain.com/applets/
IE: www.domain.com/applets/win.html?winner=Maurice
1.11 Get the user name
1.13 Convert an Applet to Application
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0305.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);
f.pack();
ut.init();
f.setSize(100,100 + 20); // add 20, seems enough for the Frame title,
f.show();
}
1.13 Convert an Applet to Application
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 Applet
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0228.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.15 Use an Image as the Applet background
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0233.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 {
1.14 Change the mouse cursor in 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
Try it here.
1.16 Handle the new Control Activation mechanism in IE
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0526.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 pre−release versions of Windows
Vista SP1 and Windows XP SP3. More at IEBlog
1.16 Handle the new Control Activation mechanism in IE
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.
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>
1.16.1 Solution #1
<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/internet−explorer−flash−applet−activation−fix−xidc19237.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
fact that the Java plugin is an ActiveX. Pre−XP 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 server−side.
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
1.16.3 Solution #3
(' <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 %>">
<%
}
%>
<script>
writeFooter();
/script
If you find this article useful, consider making a small donation
to show your support for this Web site and its content.
Written and compiled by Réal Gagnon ©1998−2007
[ home ]
1.17 Pass parameters to the Applet JVM (WIN)
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0531.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
1.17 Pass parameters to the Applet JVM (WIN)
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.18 See the Java Console Window Log (Java plugin)
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0533.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
If you find this article useful, consider making a small donation
to show your support for this Web site and its content.
Written and compiled by Réal Gagnon ©1998−2006
[ home ]
1.18 See the Java Console Window Log (Java plugin)
1.19 Display debugging infos for an Applet
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0597.html
Make sure that all browsers and JRE are closed. Start the Java Configuration Panel via
Start−Parameters 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.20 Have an invisible Applet
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0620.html
See this interesting article :
http://windyroad.org/2006/08/14/reintroducing−javascript−and−hidden−applets−jaha/
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.
Written and compiled Réal Gagnon ©2007 [email protected]
http://www.rgagnon.com
1.19 Display debugging infos for an Applet
2 Date and Time
2.1 java−date
2.2 Have year on 4 digits from a Date object
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0096.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 Time
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0106.html
import java.util.Calendar;
import java.text.SimpleDateFormat;
public class DateUtils {
public static final String DATE_FORMAT_NOW = "yyyy−MM−dd 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;
public class DateUtils {
public static String now(String dateFormat) {
Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
return sdf.format(cal.getTime());
2 Date and Time
}
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 dates
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0097.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");
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
*/
}
2.4 Compute days between 2 dates
}
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 first = Calendar.getInstance();
first.set(2008, Calendar.AUGUST, 1);
Calendar second = Calendar.getInstance();
System.out.println
(getDifference(first,second,TimeUnit.DAYS)
+ " day(s) between "
+ sdf.format(first.getTime()) + " and "
+ sdf.format(second.getTime()));
/*
* output :
* 21 day(s) between 20080801 and 20080822
*/
}
}
2.5 Get the number of days in a month
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0098.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 :
2.5 Get the number of days in a month
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 date
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0099.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); // YYYY−MM−DD
df.setLenient(false); // this is important!
df.parse(date);
}
catch (ParseException e) {
return false;
}
catch (IllegalArgumentException e) {
return false;
}
return true;
}
public static void main(String[] args) {
System.out.println(" 1900−12−13 valid ? "
+ DateUtils.isValidDateStr("1900−12−13"));
// "1990−12/13" throws a ParseException
System.out.println(" 1900−12/13 valid ? "
+ DateUtils.isValidDateStr("1900−12/13"));
// "1990−13−12" throws a IllegalArgumentException
System.out.println(" 1900−13−12 valid ? "
+ DateUtils.isValidDateStr("1900−13−12"));
/*
* output :
* 1900−12−13 valid ? true
* 1900−12/13 valid ? false
* 1900−13−12 valid ? false
*/
}
}
2.6 Validate a date
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(" 1900−12−13 valid ? "
+ DateUtils.isValidDateStr("1900−12−13","yyyy−MM−dd"));
// "1990−12/13" throws a ParseException
System.out.println(" 1900−12/13 valid ? "
+ DateUtils.isValidDateStr("1900−12/13","yyyy−MM−dd"));
// "1990−13−12" throws a IllegalArgumentException
System.out.println(" 1900−13−12 valid ? "
+ DateUtils.isValidDateStr("1900−13−12","yyyy−MM−dd"));
/*
* output :
* 1900−12−13 valid ? true
* 1900−12/13 valid ? false
* 1900−13−12 valid ? false
*/
}
}
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.6.2 Using GregorianCalendar
2.7 Determine to day of the week
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0100.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.8 Add/Substract Day/Month/Year to a Date
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0101.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".
String DATE_FORMAT = "yyyy−MM−dd";
java.text.SimpleDateFormat sdf =
new java.text.SimpleDateFormat(DATE_FORMAT);
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);
System.out.println("Date + 20 days is : " + sdf.format(c1.getTime()));
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
2.7 Determine to day of the week
year while add() substract the YEAR field for the correct result.
String DATE_FORMAT = "yyyy−MM−dd";
java.text.SimpleDateFormat sdf =
new java.text.SimpleDateFormat(DATE_FORMAT);
Calendar c1 = Calendar.getInstance();
// roll down the month
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 : "
+ sdf.format(c1.getTime())); // 1999 jan 20
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())); // 1998 dec 20
Thanks to P. Rehley for the bug fix.
2.9 Get the correct TimeZone on DateFormat
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0102.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"
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0103.html
The format "YYYYMMDD" can be useful when sorting records or comparing 2 dates.
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);
}
2.9 Get the correct TimeZone on DateFormat
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 dates
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0104.html
import java.util.*;
import java.util.*;
import java.text.*;
public class TestDate {
public static void main(String args[]){
String DATE_FORMAT = "yyyy−MM−dd";
java.text.SimpleDateFormat sdf =
new java.text.SimpleDateFormat(DATE_FORMAT);
Calendar c1 = Calendar.getInstance();
Calendar c2 = Calendar.getInstance();
// remember months are zero−based : 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 ");
}
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 object
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0105.html
2.11 Compare 2 dates
import java.util.Date;
import java.util.Locale;
import java.util.Calendar;
import 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
("dd−MMM−yyyy 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 = "24−Feb−1998 17:39:35";
System.out.println("Timestamp : " + timestampToParse);
SimpleDateFormat sdf =
new java.text.SimpleDateFormat("yyyy−MM−dd HH:mm:ss");
System.out.println("Calendar : "
+ sdf.format(parseTimestamp(timestampToParse).getTime()));
/*
output :
Timestamp : 24−Feb−1998 17:39:35
Calendar : 1998−02−24 17:39:35
*/
}
2.13 Use System time to generate unique ID
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0385.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.13 Use System time to generate unique ID
2.14 Get the day name
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0403.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
("1989−10−17 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) {
e.printStackTrace();
return "";
}
}
}
An alternate way :
import java.util.Calendar;
import java.text.SimpleDateFormat;
import java.text.DateFormat;
import 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 format
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0413.html
import java.text.*;
2.14 Get the day name
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());
}
}
If you find this article useful, consider making a small donation
to show your support for this Web site and its content.
Written and compiled by Réal Gagnon ©1998−2005
[ home ]
2.16 Get a julian date
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0506.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. nd will end on January 22,
3268 (3268−01−22 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;
2.16 Get a julian date
}
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;
ja = (int) injulian;
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});
2.16 Get a julian date
double date2 = toJulian(new int[]{2005,1,31});
System.out.println("Between 2005−01−01 and 2005−01−31 : "
+ (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 2005−01−01 and 2005−01−31 : 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.
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
day−of−year number. For example, 17−July−1998 is stored as 98221, since 17−July is the 221th
day of the year. This format is not really useful since Y2K! The main reason for using the 5−digits
Julian date was to save disk space and still have a format easy to use to handle dates.
If you find this article useful, consider making a small donation
to show your support for this Web site and its content.
Written and compiled by Réal Gagnon ©1998−2005
[ home ]
2.17 Calculate the age
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0547.html
import java.util.GregorianCalendar;
import java.util.Calendar;
public class CalcAge {
public static void main(String [] args) {
// remember ... months are 0−based : jan=0 feb=1 ...
System.out.println
("1962−11−11 : " + age(1962,10,11));
System.out.println
("1999−12−03 : " + 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.17 Calculate the age
}
}
2.18 Format a duration in ms into a string as
"Days,Hours,minutes and seconds"
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0585.html
public class TimeUtils {
public final static long ONE_SECOND = 1000;
public final static long ONE_MINUTE = ONE_SECOND * 60;
public final static long ONE_HOUR = ONE_MINUTE * 60;
public final static long ONE_DAY = ONE_HOUR * 24;
private TimeUtils() { }
/**
* converts time (in milliseconds) to
* "<w> days, <x> hours, <y> minutes and (z) seconds"
*/
public static String millisecondToDHMS(long duration) {
String res = "";
long temp = 0;
if (duration >= ONE_SECOND) {
temp = duration / ONE_DAY;
if (temp > 0) {
res = temp + " day";
if (temp > 1) {
res += "s";
}
duration −= temp * ONE_DAY;
if (duration >= ONE_MINUTE) {
res += ", ";
}
}
temp = duration / ONE_HOUR;
if (temp > 0) {
res += temp + " hour";
if (temp > 1) {
res += "s";
}
duration −= temp * ONE_HOUR;
if (duration >= ONE_MINUTE) {
res += ", ";
}
}
temp = duration / ONE_MINUTE;
if (temp > 0) {
res += temp + " minute";
if (temp > 1) {
res += "s";
}
duration −= temp * ONE_MINUTE;
2.18 Format a duration in ms into a string as "Days,Hours,minutes and seconds"
if(duration >= ONE_SECOND) {
res += " and ";
}
}
temp = duration / ONE_SECOND;
if (temp > 0) {
res += temp + " second";
if (temp > 1) {
res += "s";
}
}
return res;
}
else {
return "0 second";
}
}
public static void main (String args []) {
System.out.println(millisecondToDHMS(123));
System.out.println(millisecondToDHMS((5* ONE_SECOND) + 123));
System.out.println(millisecondToDHMS(ONE_DAY + ONE_HOUR));
System.out.println(millisecondToDHMS
(ONE_DAY + ONE_HOUR + (2 * ONE_MINUTE)));
System.out.println(millisecondToDHMS
((4*ONE_DAY) + (3*ONE_HOUR) + (2 * ONE_MINUTE) + ONE_SECOND));
System.out.println(millisecondToDHMS
((5*ONE_DAY) + (4*ONE_HOUR) + ONE_MINUTE + (2 * ONE_SECOND) + 123));
/*
output :
0 second
5 seconds
1 day, 1 hour
1 day, 1 hour, 2 minutes
4 days, 3 hours, 2 minutes and 1 second
5 days, 4 hours, 1 minute and 2 seconds
*/
}
}
2.19 Get the atomic time
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0589.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/time−servers.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 denial−of−service attack.
import java.io.*;
import java.text.*;
import java.util.*;
import java.net.*;
2.19 Get the atomic time
public final class DateUtils {
// NIST, Boulder, Colorado (time−a.timefreq.bldrdoc.gov)
public static final String ATOMICTIME_SERVER="http://132.163.4.101:13";
// NIST, Gaithersburg, Maryland (time−a.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;
}
}
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 daylight−saving−time
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("yyyy−MM−dd HH:mm:ss");
System.out.println("Atomic time : " +
sdf.format(DateUtils.getAtomicTime().getTime()));
}
/*
ref : http://www.bldrdoc.gov/doc−tour/atomic_clock.html
49825 95−04−18 22:24:11 50 0 0 50.0 UTC(NIST) *
| | | | | | | | |
2.19 Get the atomic time
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.20 Get a date interval
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0611.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 { Month, Week }
private DateUtils() { }
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);
2.20 Get a date interval
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);
}
}
return new Calendar[] { startDate, endDate };
}
public static void main(String[] args) {
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy−MM−dd");
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 month (relative today)
2008−06−01
2008−06−30
** previous week (relative today)
2008−06−30
2008−07−06
** previous month (relative jan 1, 2007)
2006−12−01
2006−12−31
** previous week (relative jan 1, 2007)
2006−12−25
2006−12−31
*/
2.20 Get a date interval
}
2.21 Determine if an hour is between an interval
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0624.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 static SimpleDateFormat sdfHour;
static {
sdfHour = new SimpleDateFormat(HOUR_FORMAT);
}
private DateUtils() { }
public static String getCurrentHour() {
Calendar cal = Calendar.getInstance();
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));
}
2.21 Determine if an hour is between an interval
2.22 Set the computer clock
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0285.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.23 Use System time to generate unique ID
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0385.html
2.22 Set the computer clock
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
Written and compiled Réal Gagnon ©2007 [email protected]
http://www.rgagnon.com
2.22 Set the computer clock
3 AWT
3.1 java−awt
3.2 Use The CardLayout manager
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0237.html
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
public class CardLayoutDemo extends Applet
implements ActionListener{
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(new Color(0).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(new Color(0).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(new Color(0).black,
new FlowLayout(),
100, 100);
t1 = new TextField(8);
t1.setBackground(new Color(0).white);
p3.add(t1);
// Main card (receive the other)
p0 = new myPanel(new Color(0).white,
new CardLayout(0,0),
100,100);
setLayout(new FlowLayout());
add(p0);
// Add cards
3 AWT
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);
b3.addActionListener(this);
b4.addActionListener(this);
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() == b1) {
//Show the first list
((CardLayout)p0.getLayout()).show(p0, "First card");
}
else if (e.getSource() == b2) {
//Show the second list
((CardLayout)p0.getLayout()).show(p0, "2nd card");
}
else if (e.getSource() == b3) {
//Show the third list
((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 ++;
}
}
}
}
class myPanel extends Panel{
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() {
3 AWT
return new Dimension(w,h);
}
}
<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 CardLayout
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0423.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];
}
If you find this article useful, consider making a small donation
to show your support for this Web site and its content.
Written and compiled by Réal Gagnon ©1998−2005
[ home ]
3.4 Use Popups
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0238.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("file−1");
item.addActionListener(this);
m.add(item);
item = new MenuItem("file−2");
3.3 Detect which card is visible with a CardLayout
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");
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);
}
3.3 Detect which card is visible with a CardLayout
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);
}
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 Dialog
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0247.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 {
3.5 Use a File Dialog
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();
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 font
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0270.html
[JDK1.4]
The names of the most common fonts supported by Java are TimesRoman, Courier, and Helvetica.
3.6 Use TrueType font
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 cross−plateform compatibles.
[JDK1.5]
@todo
3.7 Display available fonts
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0278.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.7 Display available fonts
3.8 Font with 3D effect
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0312.html
import java.awt.*;
import java.applet.*;
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 Clipboard
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0382.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();
}
3.8 Font with 3D effect
public void toClipboard() {
SecurityManager sm = System.getSecurityManager();
if (sm != null) {
try {
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 Frame
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0222.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 "full−screen" Frame is in exclusive mode. In this mode you can change the resolution
import java.awt.*;
3.10 Maximize a Frame
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/Dialog
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0223.html
// centers the dialog within the screen [1.1]
// (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);
3.11 Center a Frame/Dialog
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 Frame
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0225.html
[JDK1.0.2]
public boolean handleEvent(Event evt) {
if (evt.id == Event.WINDOW_DESTROY) {
System.exit(0);
return true;
}
return super.handleEvent(evt);
}
[JDK1.1 Method 1]
public aFrame extends Frame implements WindowListener {
public aFrame(){
addWindowListener( this );
}
3.12 Close a Frame
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.13 Call events on a Frame from a Panel
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0268.html
3.13 Call events on a Frame from a Panel
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);
// 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);
}
3.13 Call events on a Frame from a Panel
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() {
myTestEventFrame =
new TestEventFrame("TestEvent Frame");
}
}
Try it here.
3.14 Set the small top−left icon on a Frame
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0246.html
There is a bug in JDK1.0.2 for Windows, so you are stuck with the JAVA coffee cup.
3.14 Set the small top−left icon on a Frame
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 resized
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0252.html
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) {
3.15 Prevent a Frame to be resized
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);
}
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 How−to may not work with the Microsoft JVM. It's a feature...
3.16 Embed an image into a Frame
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0302.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;
3.16 Embed an image into a Frame
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);
}
}
);
}
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);
}
}
3.16 Embed an image into a Frame
The result :
3.17 Display a message box
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0242.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){
3.17 Display a message box
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);
}
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 screen
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0267.html
3.18 Display a Splash screen
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);
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();
}
}
}
3.18 Display a Splash screen
The following example use this image (jht.gif) as the splash 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");
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 Window
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0622.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() { }
3.19 Vibrate a Window
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);
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 Swing−oriented, 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);
}
}
);
3.19 Vibrate a Window
}
public void setInfo(String text) {
info.setText(text);
}
public void setFolder(String dir) {
folder.setText("Watching folder : " + dir);
}
}
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 value
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0226.html
3.20 Limit TextField input to numeric value
[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.*;
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() ;
}
}
});
3.20 Limit TextField input to numeric value
}
public NumericTextField (int _col)
{
this ("", _col) ;
}
}
If you find this article useful, consider making a small donation
to show your support for this Web site and its content.
Written and compiled by Réal Gagnon ©1998−2005
[ home ]
3.21 Limit TextField input to a maximum length
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0227.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 length
3.22 React to the ENTER key in a Textfield
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0253.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.23 Make the ENTER key act like the TAB key
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0254.html
3.22 React to the ENTER key in a Textfield
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 shot
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0274.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;
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"));
3.24 Reset all textfields in one shot
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 Uppercase
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0279.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);
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);
}
}
);
}
3.25 Limit a TextField to Uppercase
public Dimension getPreferredSize() {
return new Dimension(200,200);
}
}
3.26 Have an ImageButton
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0245.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;
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);
3.26 Have an ImageButton
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)) {
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) {
3.26 Have an ImageButton
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.*;
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();
}
3.26 Have an ImageButton
}
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 group
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0221.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"));
}
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 width
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0231.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));
3.27 Reset a checkbox group
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.29 Align the column in a List
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0244.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,20−col1.length()) +
spaces2 +
col2 +
spaces10.substring(0,10−col2.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 display
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0271.html
3.29 Align the column in a List
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;
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 resizing
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0232.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();
3.31 Label dynamic resizing
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 non−valid
this.validate();
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);
}
3.31 Label dynamic resizing
public Dimension getPreferredSize() {
return new Dimension (100,100);
}
}
3.32 Make a TextArea "word−wrap"
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0241.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 Choice
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0281.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.34 Display underlined text
Current version of this HowTo :
3.32 Make a TextArea "word−wrap"
http://www.rgagnon.com/javadetails/../javadetails/java−0258.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 How−to for underlined text with a Label component.
Check this How−to for underlined text in Swing.
3.35 Display vertical text
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0259.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
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){
3.35 Display vertical text
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 lines
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0269.html
The Label component included in the AWT do not support "\n" in its definition. The following class
implements a multi−line 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;
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);
}
3.36 Have Label with many lines
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();
}
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;
3.36 Have Label with many lines
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
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);
3.36 Have Label with many lines
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);
}
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);
3.36 Have Label with many lines
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
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0272.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(),
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 How−to");
add(ul1);
}
}
[testapplet.html]
<HTML><HEAD></HEAD><BODY>
<APPLET CODE="TestUnderlinedLabel.class"
3.37 Have a Label with underlined text
NAME="myApplet"
HEIGHT=200 WIDTH=200>
/APPLET/BODY/HTML
Check this How−to for underlined text in Swing.
3.38 Have a Label acting as HTML HREF (URLLabel)
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0273.html
[URLLabel.java]
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import 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");
}
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) {
3.38 Have a Label acting as HTML HREF (URLLabel)
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 How−to");
add(ull1);
URLLabel ull2 = new URLLabel(this,
"http://www.rgagnon.com/bigindex.html",
"Java How−to BigIndex");
add(ull2);
URLLabel ull3 = new URLLabel(this,
"http://www.rgagnon.com/javadetails/java−0001.html",
"Java How−to 0001");
add(ull3);
URLLabel ull4 = new URLLabel(this,
"http://www.rgagnon.com/javadetails/java−0002.html",
"Java How−to 0002");
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 Canvas
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0229.html
import java.awt.*;
import java.awt.image.*;
public class ImageCanvas extends Canvas {
Image image;
3.39 Display a GIF in a Canvas
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]));
frame.resize(400,400);
frame.show();
}
}
3.40 Embed an image into a Frame
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0302.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);
}
3.40 Embed an image into a Frame
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);
}
}
);
}
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 Frame
3.41 Load several images from a single GIF
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0239.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 java.applet.*;
import java.awt.*;
import java.io.*;
import 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, this);
g.drawImage(icon[0], 0, 20, this);
g.drawImage(icon[1], 0, 40, this);
}
public void loadImages(String s) {
MediaTracker t=new MediaTracker(this);
3.41 Load several images from a single GIF
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.42 Load an Image from a JAR file
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0240.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
3.42 Load an Image from a JAR file
//
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]
URL url = this.getClass().getResource("myIcon.gif");
button.setIcon(new ImageIcon(url));
If you find this article useful, consider making a small donation
to show your support for this Web site and its content.
Written and compiled by Réal Gagnon ©1998−2005
[ home ]
3.43 Load an Icon from a jar (again)
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0436.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 built−in 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;
}
3.43 Load an Icon from a jar (again)
A list of what icons are available can be found here
If you find this article useful, consider making a small donation
to show your support for this Web site and its content.
Written and compiled by Réal Gagnon ©1998−2005
[ home ]
3.44 Scale an Image
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0243.html
import java.awt.image.*;
import java.awt.*;
import java.net.*;
public class app extends java.applet.Applet {
Image source;
Image resizedImage;
public void init() {
MediaTracker media = new MediaTracker(this);
// java how−to 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 java.awt.*;
import java.awt.geom.*;
import java.awt.image.*;
import java.io.*;
import javax.imageio.*;
3.44 Scale an Image
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]);
}
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 image
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0249.html
This example display a GIF with a fade−in, fade−out effect.
import java.applet.*;
import java.awt.*;
import java.awt.image.*;
import java.net.*;
3.45 Fade an image
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) {
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 {
3.45 Fade an image
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();
}
}
}
}
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 image
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0248.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 java.applet.Applet;
import 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];
3.46 Rotate an image
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);
try {
grabber.grabPixels();
}
catch(InterruptedException e) {
e.printStackTrace();
}
for(int y = 0; y < 32; y++) {
for(int x = 0; x < 32; x++) {
rotate[((32−x−1)*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 java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import 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() {
3.46 Rotate an image
//rotate 5 degrees at a time
currentAngle+=5.0;
if (currentAngle >= 360.0) {
currentAngle = 0;
}
repaint();
}
protected void paintComponent(Graphics g) {
super.paintComponent(g);
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 canvas
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0230.html
JDK1.1 using a ScrollPane
import java.applet.*;
import java.awt.*;
public class apptest extends Applet {
3.47 Create a scrollable canvas
Canvas c;
ScrollPane s;
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);
}
3.47 Create a scrollable canvas
public boolean handleEvent(Event e) {
if (e.target instanceof Scrollbar) {
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;
3.47 Create a scrollable canvas
int rw, rh;
Color b, f;
int x, y;
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 canvas
3.48 Use an Image as the Applet background
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0233.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 background
Try it here.
3.49 Have a simple Image browser
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0277.html
[imagelist.txt]
jht.gif|JAVA How−to
jsht.gif|Javascript How−to
pht.gif|Powerbuilder How−to
[application version]
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import 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) {
String theUrl = url[lbx.getSelectedIndex()];
MediaTracker media = new MediaTracker(this);
Image image =
Toolkit.getDefaultToolkit().getImage(theUrl);
media.addImage(image, 0);
try {
3.49 Have a simple Image browser
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 java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
public class ImageBrowserApplet extends Applet {
public void init() {
APanel p = new APanel(this);
setLayout(new BorderLayout());
add(p, "Center");
}
}
class APanel extends Panel implements ActionListener {
private List lbx;
private MyCanvas can;
3.49 Have a simple Image browser
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) {
image = i;
repaint();
}
public void paint(Graphics g) {
if (image != null)
3.49 Have a simple Image browser
g.drawImage(image, 0,0, this);
}
}
NOTE : You can try this example here
3.50 Simulate a "mouse over" event to toggle an image
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0264.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++;
}
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) {}
3.50 Simulate a "mouse over" event to toggle an image
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 ( and
).
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.51 Hide the mouse cursor
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0440.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.51 Hide the mouse cursor
3.52 Make a color transparent
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0265.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);
}
}
[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 =
3.52 Make a color transparent
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 file
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0266.html
Take a look at the following package :
http://www.obrador.com/essentialjpeg/jpeg.htm for JPEG
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;
3.53 Save an Image as a GIF or JPEG file
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
{
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 browser
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0234.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.54 Use the same background color as the browser
3.55 Do simple animation using Images
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0262.html
By using a Thread, we switch between 2 GIFs ( and )
import java.applet.*;
import java.awt.*;
import java.awt.image.*;
import java.net.*;
public class AnimationGifApplet extends Applet {
Image [] img;
int index = 0;
int maxImg;
MediaTracker tracker;
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;
}
3.55 Do simple animation using Images
public void run() {
while (true) {
try {
sleep(delay);
animationApplet.animate();
}
catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
Try it here.
3.56 Do simple animation to show "work in progress"
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0263.html
Like the previous How−to, using a Thread, we switch between 2 GIFs, for example ( and
).
Click the button to simulate some work, click again to terminate the "work in progress"
[JDK1.1]
import java.applet.*;
import java.awt.*;
import java.awt.image.*;
import java.awt.event.*;
import 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);
3.56 Do simple animation to show "work in progress"
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) {
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 pixel
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0257.html
We assume that we have an Image called picture
pixels = new int[width*height];
3.57 Get the color of a specific pixel
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.
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 c = 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 c = new Color(red,green,blue);
3.58 Do "rubber−band" drawing
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0251.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);
3.58 Do "rubber−band" drawing
setForeground(new Color(0).white);
}
public void Dragupdate(Graphics g) {
/*
** rubber−band 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;
3.58 Do "rubber−band" drawing
Dragupdate(getGraphics());
return true;
}
return super.handleEvent(e);
}
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(np−1);
np−−;
repaint();
}
}
public void resetDrawing() {
lines.removeAllElements();
np=0;
repaint();
}
}
3.59 Convert RGB value to Hexadecimal (to be used in HTML for
example)
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0255.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.60 Draw a line or set a pixel in my own image
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0250.html
3.59 Convert RGB value to Hexadecimal (to be used in HTML for example)
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 line
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0224.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((x2−x1)*(x2−x1)+(y2−y1)*(y2−y1));
double yincrement=(y2−y1)/(linelength/(dashlength+spacelength));
double xincdashspace=(x2−x1)/(linelength/(dashlength+spacelength));
double yincdashspace=(y2−y1)/(linelength/(dashlength+spacelength));
double xincdash=(x2−x1)/(linelength/(dashlength));
double yincdash=(y2−y1)/(linelength/(dashlength));
int counter=0;
for (double i=0;i<linelength−dashlength;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),
3.61 Draw a dashed line
(int) (y1+yincdashspace*counter),
x2,y2);
}
3.62 Draw a line with a thickness
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0260.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...
double ddx = −scale * (double)dY;
double ddy = scale * (double)dX;
ddx += (ddx > 0) ? 0.5 : −0.5;
ddy += (ddy > 0) ? 0.5 : −0.5;
int dx = (int)ddx;
int dy = (int)ddy;
// Now we can compute the corner points...
int xPoints[] = new int[4];
int yPoints[] = new int[4];
xPoints[0] = x1 + dx; yPoints[0] = y1 + dy;
xPoints[1] = x1 − dx; yPoints[1] = y1 − dy;
xPoints[2] = x2 − dx; yPoints[2] = y2 − dy;
xPoints[3] = x2 + dx; yPoints[3] = y2 + dy;
g.fillPolygon(xPoints, yPoints, 4);
}
3.62 Draw a line with a thickness
}
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);
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.62 Draw a line with a thickness
3.63 Draw a pie chart
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0261.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);
// "value−color,value−color,..."
StringTokenizer t = new StringTokenizer(at, ",");
String s;
int i;
while (t.hasMoreTokens()) {
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;
3.63 Draw a pie chart
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);
}
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>
3.63 Draw a pie chart
<PARAM NAME="depth" VALUE="30">
<PARAM NAME="width" VALUE="120">
<PARAM NAME="values" VALUE="1−red,5−green,7−blue">
</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 rectangles
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0364.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);
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.64 Draw faster rectangles
3.65 Get a screen capture and save it as a JPEG
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0489.html
The screen capture is done with java.awt.Robot.
import java.awt.AWTException;
import java.awt.Robot;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.*;
import 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);
// 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() ) );
If you find this article useful, consider making a small donation
to show your support for this Web site and its content.
Written and compiled by Réal Gagnon ©1998−2005
[ home ]
3.66 Display a TIF
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0605.html
3.65 Get a screen capture and save it as a JPEG
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 javax.media.jai.PlanarImage;
import com.sun.media.jai.codec.ByteArraySeekableStream;
import com.sun.media.jai.codec.ImageCodec;
import com.sun.media.jai.codec.ImageDecoder;
import com.sun.media.jai.codec.SeekableStream;
import java.io.FileInputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.awt.Image;
import 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.65 Get a screen capture and save it as a JPEG
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.67 Convert a multi−page TIF into single−page TIF
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0535.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 mid−1980's to agree on a common scanned image file format, rather than have each
company promulgate its own proprietary format.
This HowTo takes a multi−page TIF (from a FAX) and convert it into many single−pages TIF.
This is done with the JAI (Java Advance Image) package.
http://java.sun.com/products/java−media/jai/index.jsp
>
import java.io.*;
import com.sun.media.jai.codec.FileSeekableStream;
import com.sun.media.jai.codec.ImageDecoder;
import com.sun.media.jai.codec.ImageCodec;
import com.sun.media.jai.codec.TIFFEncodeParam;
import java.awt.image.RenderedImage;
import javax.media.jai.RenderedOp;
import javax.media.jai.JAI;
import 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
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());
3.67 Convert a multi−page TIF into single−page TIF
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) multi−purpose 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.
If you find this article useful, consider making a small donation
to show your support for this Web site and its content.
Written and compiled by Réal Gagnon ©1998−2006
[ home ]
3.68 Convert an Image to a BufferedImage
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0601.html
import java.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);
}
3.68 Convert an Image to a BufferedImage
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 back−conversion, it's not needed.
3.69 Detect a double click vs simple click
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0235.html
[JDK1.02]
import java.applet.*;
import java.awt.*;
public class d extends Applet {
int dClkRes = 300; // double−click 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.when−timeMouseDown) < 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;
}
}
[JDK11]
3.69 Detect a double click vs simple click
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.70 Detect the mouse button used when clicking
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0236.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);
}
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;
3.70 Detect the mouse button used when clicking
}
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.71 Exit an application from a menu
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0276.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);
}
}
);
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 'ctrl−x'"),"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));
3.71 Exit an application from a menu
}
static public void main(String[] args) {
new ExitFromMenu();
}
}
3.72 Trigger a click on a Button
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0468.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);
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 {
3.72 Trigger a click on a Button
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();
}
}
}
Written and compiled Réal Gagnon ©2007 [email protected]
http://www.rgagnon.com
3.72 Trigger a click on a Button
4 Environment
4.1 java−env
4.2 Read environment variables from an application
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0150.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 low−tech 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" );
}
else {
4 Environment
// 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, pre−JDK 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
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);
Java's System properties contains some useful informations about the environment, for example,
the TEMP and PATH environment variables (on Windows).
public class ShowSome {
4 Environment
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 different−−−the 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/linux−bin:/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
\cygwin−b20\H−i586−cygwin32\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;
d:\OrbixWeb3.2\bin;D:\Program Files\IBM\GSK\lib;
H:\pvcs65\VM\win32\bin;c:\cygnus\cygwin−b20\H−i586−cygwin32\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;
4 Environment
C:\Program Files\Executive Software\DiskeeperServer\;}
Java is prepending itself! That confused me−−− and broke my exec from ant.
4.3 Retrieve environment variables (JDK1.5)
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0466.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
If you find this article useful, consider making a small donation
to show your support for this Web site and its content.
Written and compiled by Réal Gagnon ©1998−2005
[ home ]
4.4 Retrieve environment variable (JNI)
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0460.html
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) ;
4.3 Retrieve environment variables (JDK1.5)
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 7−bit ASCII characters.
See also this HowTo.
If you find this article useful, consider making a small donation
to show your support for this Web site and its content.
Written and compiled by Réal Gagnon ©1998−2005
[ home ]
4.5 Use a MAKE file
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0158.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
# begin −−−− JAR support −−−−−−−−−−
JARFILE= theJAR.jar
$(JARFILE): $(CLASSFILES) $(SOURCEFILES)
jar cfm0 $(JARFILE) <<manifest.tmp $(CLASSFILES)
$(DATAFILES)
Name: GetImage.class
Java−Bean: False
Name: myCanvas.class
Java−Bean: True
<<
4.5 Use a MAKE file
# 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
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0160.html
One way is to instanciate a known browser−specific 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;
}
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";
4.6 Detect the browser/JVM type
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 Microsoft−specific classes,
the other is a JDK1.1 applet and finally a version for JDK102−only 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;
}
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>
4.6 Detect the browser/JVM type
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 message
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0163.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.8 Use a precompiler "à la C" with Java
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0164.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);
4.7 Fix the "Wrong magic number" error message
}
}
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>
<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.11 Simple boolean flag
4.12 Determine what are the classes actually used in a Java
Applet or application
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0165.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
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 JVM
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0131.html
By default, the JVM will use up to 16Mb of RAM. 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 :
−mx n Sets the maximum size of the memory allocation pool where n is in bytes, appending "m" to
n will specified the number in megabytes, for example to set the maximum at 20Mb :
java −mx 20m myApp
−ms n Sets the startup size of the memory allocation pool, where n is in bytes, appending "m" to n
will specified the number in megabytes. The default is 1Mb.
With JDK1.2, that syntax have changed, no space between ms/mx and the value :
java −mx20m myApp
4.14 Generate the Javadoc "en français"
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0437.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
4.12 Determine what are the classes actually used in a Java Applet or application
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=Sous−interfaces 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 © 2003 Real's Howto.</i>]]></bottom>
</javadoc>
If you find this article useful, consider making a small donation
to show your support for this Web site and its content.
Written and compiled by Réal Gagnon ©1998−2005
[ home ]
4.12 Determine what are the classes actually used in a Java Applet or application
4.15 Use JDK1.5 new features
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0462.html
• Download the JDK1.5 and install it.
• From a shell, type
java −version
The response should be something like
java version "1.5.0−beta"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0−beta−b32c)
JAVA HOTSPOT(TM) CLIENT VM (BUILD 1.5.0−BETA−B32C, 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
If you find this article useful, consider making a small donation
to show your support for this Web site and its content.
Written and compiled by Réal Gagnon ©1998−2005
[ home ]
4.16 Check the class version
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0544.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 :
4.15 Use JDK1.5 new features
major minor Java platform version
45 3 1.0
45 3 1.1
46 0 1.2
47 0 1.3
48 0 1.4
49 0 1.5
50 0 1.6
import java.io.*;
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.15 Use JDK1.5 new features
4.17 Get the system properties or the JVM uptime
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0549.html
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 JVM
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0565.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
4.17 Get the system properties or the JVM uptime
return
System.getProperty("java.vm.name")
.toLowerCase().indexOf("64") >= 0;
}
// probably 32bit
return false;
}
}
4.19 Set the default JVM type
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0566.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.0−b64)
Java HotSpot(TM) Client VM (build 1.5.0−b64, mixed mode, sharing)
The default JVM with a JIT (Just−In−Time 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 32−bit Solaris and Linux downloads. For
32−bit Windows, if you download the JRE, you get only the client, you'll need to download the SDK
to get both systems.
For 64−bit, only the server system is included. On Solaris, the 64−bit JRE is an overlay on top of the
32−bit 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/java−1.5.0−sun.
On Windows, it's in C:\Program Files\Java\jre1.5.0\lib\i386.
A content like
4.19 Set the default JVM type
−client KNOWN
−server KNOWN
defines the client as the default.
−server KNOWN
−client KNOWN
sets the server as the default.
4.20 Capture the output of JAVAC
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0147.html
method 1a : redirect to a file
// Win95 (?)
javac −J−Djavac.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
( 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.20 Capture the output of JAVAC
4.21 Freeze the JVIEW window in MS VJ++
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0148.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 How−to for a better way...
4.22 Wrap a Java beans in a COM object
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0045.html
The previous How−to was using a Microsoft utility to enable access to Java objects from a
COM−aware 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 Plug−in 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 :
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
Java−Bean: 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
4.21 Freeze the JVIEW window in MS VJ++
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 hard−coded 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 command−line 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")
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 PLUG−IN SCRIPTING documentation (jdk1.2) or (jsdk1.4). document for more infos.
4.23 Know details about the JAVA at run−time
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0149.html
Applets can read certain system properties by invoking System.getProperty(String key)
4.23 Know details about the JAVA at run−time
java.version Java version number
java.vendor Java vendor−specific string
java.vendor.url Java vendor URL
os.name Operating system name
os.arch Operating system architecture
file.separator File separator (eg, "/")
path.separator Path separator (eg, ":")
line.separator Line separator
java.class.version Java class version number
But applets are prevented from reading these system properties (for security reason):
java.home Java installation directory
java.class.path Java classpath
user.name User account name
user.home User home directory
user.dir 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();
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.23 Know details about the JAVA at run−time
4.24 Detect the Microsoft JVM version installed
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0327.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.25 Run JAVA as a Windows service
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0151.html
A solution adapted to Java, is the Java Service Wrapper (
http://wrapper.tanukisoftware.org/doc/english/introduction.html ) (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 Xtended−switch) 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.26 Execute a class from Windows Explorer
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0328.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.
4.24 Detect the Microsoft JVM version installed
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.
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
text−only Java program). Called it CRunJava.vbs . Then you will have two choices from the
SendTo menu, one for console−based program and one for GUI−based (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
4.24 Detect the Microsoft JVM version installed
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
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.27 Create an icon to launch java apps for Windows?
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0157.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.28 Fix the "out of environment" error when setting a new
CLASSPATH
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0159.html
4.27 Create an icon to launch java apps for Windows?
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.29 Query Windows registry
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0480.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";
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();
4.29 Query Windows registry
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();
}
catch (Exception e) {
return null;
}
}
static class StreamReader extends Thread {
private InputStream is;
private StringWriter sw;
4.29 Query Windows registry
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.
If you find this article useful, consider making a small donation
to show your support for this Web site and its content.
Written and compiled by Réal Gagnon ©1998−2007
[ home ]
4.30 Quickly retrieve available Java JVM on a workstation
(Windows)
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0525.html
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"
4.30 Quickly retrieve available Java JVM on a workstation (Windows)
[HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment\1.4.1_02]
"JavaHome"="C:\\Program Files\\Java\\j2re1.4.1_02"
"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"
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
The above script returns the default JVM if the PATH variable does not override it!
If you find this article useful, consider making a small donation
to show your support for this Web site and its content.
Written and compiled by Réal Gagnon ©1998−2006
[ home ]
4.31 Get the Windows "My Documents" path
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0572.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.
4.31 Get the Windows "My Documents" path
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());
}
}
4.32 Get a return code from a VBS
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0575.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)");
4.32 Get a return code from a VBS
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 ");
}
public static void msgBox(String msg) {
javax.swing.JOptionPane.showConfirmDialog((java.awt.Component)
null, msg, "VBSUtils", javax.swing.JOptionPane.DEFAULT_OPTION);
}
}
4.33 List currently running processes (Windows)
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0593.html
4.33.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.33 List currently running processes (Windows)
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.33.2 Using a VBS
Another technique to build the required VBScript on−the−fly, execute it and capture its output.
import java.io.BufferedReader;
import java.io.File;
import java.io.FileWriter;
import java.io.InputStreamReader;
import 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.33.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.34 Check if a program or process is running (Windows)
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0610.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 java.io.BufferedReader;
import java.io.File;
import java.io.FileWriter;
import java.io.InputStreamReader;
public class VBSUtils {
private VBSUtils() { }
public static boolean isRunning(String process) {
boolean found = false;
try {
4.34 Check if a program or process is running (Windows)
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 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);
}
}
4.35 Windows registry vs. Java JDK/JRE installation
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0604.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.
4.35 Windows registry vs. Java JDK/JRE installation
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 WebStart−based programs, the registry is always used to determine the
current JRE.
4.36 Create a Taglet to document database access (Javadoc)
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0473.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.36.1 newMethod
public java.lang.String newMethod()
4.36 Create a Taglet to document database access (Javadoc)
Returns:
value
Table(s):
firstname city
lastname 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 Réal 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;
}
/**
* 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
4.36 Create a Taglet to document database access (Javadoc)
* 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) {
tagletMap.remove(tag.getName());
}
tagletMap.put(tag.getName(), tag);
}
4.36 Create a Taglet to document database access (Javadoc)
/**
* 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=\"border−style:solid;"
+ " border−width:thin\">";
output +=
"<TH ALIGN=\"center\" STYLE=\"border−style:solid;"
+ " border−width: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 :
javac −classpath "C:\Program Files\j2sdk1.4.1\lib\tools.jar"
com\rgagnon\taglet\Table.java
4.36 Create a Taglet to document database access (Javadoc)
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.
If you find this article useful, consider making a small donation
to show your support for this Web site and its content.
Written and compiled by Réal Gagnon ©1998−2005
[ home ]
4.37 Generate the Javadoc "en français"
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0437.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=Sous−interfaces 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
4.37 Generate the Javadoc "en français"
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 © 2003 Real's Howto.</i>]]></bottom>
</javadoc>
If you find this article useful, consider making a small donation
to show your support for this Web site and its content.
Written and compiled by Réal Gagnon ©1998−2005
[ home ]
4.38 Document a package using Javadoc
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0502.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.
\progra~1\Java\jdk1.5.0\bin\javadoc −d javadoc0 −linksource com.rgagnon
4.38 Document a package using Javadoc
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:
• package−info.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
If you find this article useful, consider making a small donation
to show your support for this Web site and its content.
Written and compiled by Réal Gagnon ©1998−2005
[ home ]
4.39 Display a comment in a Javadoc
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0615.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>
* /* create a frame */
* 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.39 Display a comment in a Javadoc
4.40 Display XML in a javadoc
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0623.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.41 Add a copyright notice to a Javadoc
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0626.html
Use the −bottom parameter to the javadoc command line.
−bottom '<font size="−1"><a href="http://www.rgagnon.com">Reals HowTo</a>
<br>© 2008 rgagnon.com</font>'
4.40 Display XML in a javadoc
The result looks like this :
4.42 Use a Log file
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0501.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
2005−02−28 21:19:28 TestLog main
GRAVE: my severe message
2005−02−28 21:19:28 TestLog main
ATTENTION: my warning message
2005−02−28 21:19:28 TestLog main
INFO: my info message
if the XMLFormatter is in use then the output is
<?xml version="1.0" encoding="windows−1252" standalone="no"?>
<!DOCTYPE log SYSTEM "logger.dtd">
<log>
<record>
<date>2005−02−28T21:21:09</date>
<millis>1109643669250</millis>
<sequence>0</sequence>
<logger>TestLog</logger>
4.42 Use a Log file
<level>SEVERE</level>
<class>TestLog</class>
<method>main</method>
<thread>10</thread>
<message>my severe message</message>
</record>
<record>
<date>2005−02−28T21: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>2005−02−28T21: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);
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();
}
}
4.42 Use a Log file
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
If you find this article useful, consider making a small donation
to show your support for this Web site and its content.
Written and compiled by Réal Gagnon ©1998−2005
[ home ]
4.43 Trace the execution
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0301.html
This class generate a stackTrace and then parse it according to the parameters received.
[StackTrace.java]
4.43 Trace the execution
public class StackTrace {
public static void displayStack() {
displayStack("", 0);
}
public static void displayStack(int deep) {
displayStack("", deep);
}
public static void displayStack(String msg) {
displayStack(msg, 0);
}
public static void displayStack(String msg, int deep) {
//
// msg a message to appear in the Trace
// deep = 0 complete stack
// n from "n" levels
//
String output = "" ;
StringWriter sw = new StringWriter();
new Throwable("").printStackTrace(new PrintWriter(sw));
String stackTrace = sw.toString();
// to clean up the stacktrace
StringTokenizer st =
new StringTokenizer(stackTrace, "\n");
// get ride of the first line
String s=st.nextToken();
// get ride of line(s) for the Trace class
if (!msg.equals("")) output = msg + "\n" ;
s=st.nextToken();
s=st.nextToken();
if ( s.indexOf("StackTrace.displayStack") < 0 )
output += s + "\n";
// process the stack
if (deep == 0) {
while (st.hasMoreTokens()) {
output += st.nextToken() + "\n";
}
}
else {
while (deep > 1) {
if (st.hasMoreTokens()){
output += st.nextToken() + "\n";
deep−−;
System.out.println("**" + deep);
}
else
deep = 0;
}
}
System.out.println("Trace: " + output);
}
}
[SimpleTrace.java]
import java.io.*;
import java.util.*;
4.43 Trace the execution
public class SimpleTrace {
public static void main(String args[]){
SimpleTrace s = new SimpleTrace();
s.doit();
}
public void doit() {
MyClass s = new MyClass();
s.aMethod();
}
}
class MyClass {
MyClass() { }
public void aMethod() {
StackTrace.displayStack("Howto Trace only 1 level", 1);
StackTrace.displayStack("Howto Trace all levels");
}
}
And the output should be
Trace: Howto Trace only 1 level
at MyClass.aMethod(SimpleTrace.java:20)
Trace: Howto Trace all levels
at MyClass.aMethod(SimpleTrace.java:21)
at SimpleTrace.doit(SimpleTrace.java:12)
at SimpleTrace.main(SimpleTrace.java:7)
NOTES:
The stackTrace() formatting may be different with the JVM used, in this example, it's the Sun's JDK 1.2.1.
See also this HowTo.
You may want to look at this How−to to disable the Trace mechanism in the "release" version of
your classes to achieve the best performance.
Remember that line numbers are not available when a JIT is in function. To disable it, check this
How−to
4.44 Time the execution
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0132.html
public class ExecutionTimer {
private long start;
private long end;
public ExecutionTimer() {
reset();
}
public void start() {
start = System.currentTimeMillis();
}
4.44 Time the execution
public void end() {
end = System.currentTimeMillis();
}
public long duration(){
return (end−start);
}
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.45 Log information efficiently (with Log4J)
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0527.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
4.45 Log information efficiently (with Log4J)
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());
}
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
If you find this article useful, consider making a small donation
to show your support for this Web site and its content.
Written and compiled by Réal Gagnon ©1998−2006
[ home ]
4.46 Change the logging level on−the−fly (Log4J)
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0621.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
4.46 Change the logging level on−the−fly (Log4J)
It may be useful to change it on−the−fly 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.47 Use a JAR/ZIP/CAB file with an Applet
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0153.html
[JAR format]
JAR (Java ARchive) is a platform−independent 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 "real−world" 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 How−to.
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.47 Use a JAR/ZIP/CAB file with an Applet
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 "un−compressed" 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 un−compressed). 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, non−MS 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.47 Use a JAR/ZIP/CAB file with an Applet
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.
Written and compiled by Réal Gagnon ©1998−2000 mailto:[email protected]
[ home ]
4.48 Make ZIP/JAR file always accessible from applet
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0154.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.49 Make a JAR executable
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0166.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.*;
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);
}
4.48 Make ZIP/JAR file always accessible from applet
}
);
f.add(new Label("Hello world"));
f.setSize(200,200);
f.setVisible(true);
}
}
Then create this manifest file (manifest.mft) with any text editor.
Manifest−Version: 1.0
Main−Class: MyClass
Class−path: .
Main−Class specifies the entry point with the main(String args[]) method.
The Class−path 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 double−clicking 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.
On Windows (NT or better), you can also make JARs run from the command−line 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.48 Make ZIP/JAR file always accessible from applet
4.50 Accessing jars from within a jar
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0319.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 Class−Path setting :
Manifest−Version: 1.0
Main−Class: MyClass
Class−Path: Second.jar Third.jar
The value of the Class−Path 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 META−INF directory which will enable the application
class loader to download the right jar files when it is searching for classes or resources.
4.51 Access a JAR outside the CLASSPATH
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0409.html
import java.net.*;
import java.io.*;
public class ExtraLoader {
public static void main(String[] args) {
try {
URL urlA =
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.50 Accessing jars from within a jar
4.52 Extract a file from a Jar
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0429.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();
}
catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String args []){
new ExtractFromJAR().extractMyMDBFromJAR(".");
}
Grab this auto−run Jar if you want to try it.
To create an auto−run JAR, first create a manifest.mft
Manifest−Version: 1.0
Classpath: .\mydb.jar
Main−Class: ExtractFromJAR
Create the JAR
C:\jdk141\bin\jar cvfm mydb.jar manifest.mft ExtractFromJAR.class mydb.mdb
4.52 Extract a file from a Jar
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", " ");
If you find this article useful, consider making a small donation
to show your support for this Web site and its content.
Written and compiled by Réal Gagnon ©1998−2005
[ home ]
4.53 Determine if running from JAR
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0391.html
package com.rgagnon;
public class HelloClass {
public static void main(String[] args) {
new HelloClass().say();
}
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
4.53 Determine if running from JAR
See these related HowTo's : 1 2
4.54 Get list of classes in package (in a Jar)
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0513.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;
}
/**
*
*/
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
4.54 Get list of classes in package (in a Jar)
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]
*/
}
}
If you find this article useful, consider making a small donation
to show your support for this Web site and its content.
Written and compiled by Réal Gagnon ©1998−2005
[ home ]
4.55 Add version to Jar packaging
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0388.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 :
Manifest−Version: 1.0
Main−Class: com.rgagnon.Hello
Then build the executable Jar and run it.
>jar cvfm hello.jar MANIFEST.MF com\rgagnon\Hello.class
>java −jar hello.jar
Hello World!
Now modify the manifest to include versioning information.
Manifest−Version: 1.0
Main−Class: com.rgagnon.Hello
Specification−Version: 2.1
Implementation−Version: 1.1
Modify the class to display the version.
4.55 Add version to Jar packaging
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("Implementation−Version");
}
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("Specification−Version");
}
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("Specification−Version: "
+ JarUtils.getJarSpecificationVersion(javaMailJar));
System.out.println("Implementation−Version: "
+ JarUtils.getJarImplementationVersion(javaMailJar));
4.55 Add version to Jar packaging
/*
* output :
* Specification−Version: 1.3
* Implementation−Version: 1.3.1
*/
}
}
4.56 Use ANT to Build a JAR with version/build number
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0532.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 ...
• ... 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="." />
4.56 Use ANT to Build a JAR with version/build number
</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 EST 2006 META−INF/
55 Wed May 03 17:06:32 EST 2006 META−INF/MANIFEST.MF
55 Wed May 03 17:06:32 EST 2006 howto/
335 Wed May 03 16:36:16 EST 2006 howto/Hello.class
• Try your new Jar file
> java −cp Hello.jar howto.Hello
Hello World
• Make your Jar auto−executable 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"/>
<delete file="MANIFEST.MF"/>
<manifest file="MANIFEST.MF">
<attribute name="Built−By" value="${user.name}"/>
<attribute name="Main−Class" 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
4.56 Use ANT to Build a JAR with version/build number
available in your Ant script. The version number is also a property. Here it is hard−coded 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="Built−By" value="${user.name}"/>
<attribute name="Main−Class" value="howto.Hello"/>
<attribute name="Implementation−Version"
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
Implementation−Version: 1.00−b1
• and after the next build operation, the entry will be
Implementation−Version: 1.00−b2
• Modify the Hello class to read the Implementation−Version information and display it.
package howto;
public class Hello {
public static void main( String[] args ){
System.out.println( "Hello World ");
System.out.println("version : " +
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="Built−By" value="${user.name}"/>
<attribute name="Main−Class" value="howto.Hello"/>
<attribute name="Implementation−Version"
value="${version.num}−b${build.number}"/>
</manifest>
<jar destfile="hello.jar"
4.56 Use ANT to Build a JAR with version/build number
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.00−b3
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="yyyy−MM−dd HH:mm:ss" />
</tstamp>
<manifest file="MANIFEST.MF">
<attribute name="Built−By" value="${user.name}"/>
<attribute name="Main−Class" value="howto.Hello"/>
<attribute name="Implementation−Version"
value="${version.num}−b${build.number}"/>
<attribute name="Built−Date" value="${TODAY}"/>
</manifest>
<jar destfile="hello.jar"
basedir="."
includes="**/*.class"
manifest="MANIFEST.MF"
/>
</target>
See also this Howto .
4.57 Include all jars in the classpath definition
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0587.html
4.57 Include all jars in the classpath definition
Specifying all the required jar in the classpath can be a pain. Here some techniques to set the
classpath definition automatically.
4.58 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
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.59 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
4.58 Windows batch file
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.60 JAR (and ANT)
The best solution when you have a jar is to try to include the required jars into the manifest
declaration.
Manifest−Version: 1.0
Class−Path:
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 Class−Path: 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
java −jar myjar.jar
the CLASSPATH definition (as defined by the environment variable) is overriden by the
"class−path" 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 class−path definition.
<target name="MyJar" depends="dist, compile" description="generate jar" >
<jar destfile="${dist}/${jar}">
<manifest>
<attribute name="Main−Class" value="${Main_Class}"/>
<attribute name="Class−Path" 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>
4.60 JAR (and ANT)
<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="Main−Class" value="com.mycompany.TestMain"/>
<attribute name="Class−Path" value="${manifest.classpath}"/>
</manifest>
</jar>
</target>
Latest Ant version (1.7) includes a task called ManifestClassPath which converts a classpath into
a space−separated list of items used to set the Manifest Class−Path attribute. See
http://ant.apache.org/manual/CoreTasks/manifestclasspath.html
<path id="build−classpath">
<fileset dir="${build.dir}">
<include name="*.jar"/>
</fileset>
</path>
<manifestclasspath property="lib.list" jarfile="${build.dir}/${jar.file}">
<classpath refid="build−classpath" />
</manifestclasspath>
<jar>
...
<manifest>
<attribute name="Main−Class" value="com.mycompany.TestMain"/>
<attribute name="Class−Path" value=". ${lib.list}"/>
</manifest>
...
</jar>
4.61 Detect the browser/JVM type
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0160.html
One way is to instanciate a known browser−specific 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() )
4.61 Detect the browser/JVM type
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;
}
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 Microsoft−specific classes,
the other is a JDK1.1 applet and finally a version for JDK102−only browser. The idea is to put all
4.61 Detect the browser/JVM type
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;
}
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.62 Detect if Java is enabled from HTML
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0161.html
For a Javascript solution, check this How−to
<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.63 See the Java Console Window Log (Java plugin)
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0533.html
4.62 Detect if Java is enabled from 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
If you find this article useful, consider making a small donation
to show your support for this Web site and its content.
Written and compiled by Réal Gagnon ©1998−2006
[ home ]
Written and compiled Réal Gagnon ©2007 [email protected]
http://www.rgagnon.com
4.62 Detect if Java is enabled from HTML
5 Internationalization
5.1 java−inter
5.2 Load resources based upon client environment at startup
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0133.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 javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import 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 }));
add(aButton);
5 Internationalization
// 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");
public Object [][] getContents() {
return contents;
5 Internationalization
}
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 How−to.
5.3 Load resources dynamically
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0134.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 java.util.*;
import java.text.*;
import java.awt.*;
import java.awt.event.*;
import 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);
}
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"));
5.3 Load resources dynamically
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);
setSize(400,100);
setVisible(true);
}
public void actionPerformed(ActionEvent ae){
if (ae.getSource() == btnQuit) {
System.exit(0);
}
5.3 Load resources dynamically
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" },
{ "r0" , "United States" } ,
{ "r1", "France" } ,
{ "r2" , "Germany"},
{ "rDefault" , "r0" },
{ "btnQuit" , "Quit"},
{ "today" , " (en) {0,date,long}"},
};
}
5.3 Load resources dynamically
[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" , "Etats−Unis" } ,
{ "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}"},
};
}
If you find this article useful, consider making a small donation
to show your support for this Web site and its content.
Written and compiled by Réal Gagnon ©1998−2007
[ home ]
5.4 Load resources via a resources file
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0135.html
With the previous JAVA How−to, 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
5.4 Load resources via a resources file
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 java.util.*;
import java.text.*;
import java.awt.*;
import java.awt.event.*;
import 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();
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();
5.4 Load resources via a resources file
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);
}
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());
5.4 Load resources via a resources file
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=Etats−Unis
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
today=(de) {0,date,dd.MM.yyyy}
If you find this article useful, consider making a small donation
to show your support for this Web site and its content.
Written and compiled by Réal Gagnon ©1998−2007
[ home ]
5.4 Load resources via a resources file
5.5 Display "special character" using Unicode
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0136.html
The copyright symbol © :
String COPYRIGHT = "\u00a9"";
The registered symbol ® :
String REGISTERED = "\u00ae";
The euro−currency 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
â \u00e2 Â \u00c2
é \u00e9 É \u00c9
è \u00e8 È \u00c8
ê \u00ea Ê \u00ca
î \u00ee Î \u00ce
ç \u00e7 Ç \u00c7
5.5 Display "special character" using Unicode
5.6 Display chinese/japanese characters
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0137.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 dialog
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0138.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
SaveMsg=Voulez−vous sauvegarder vos donnees
Then
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import 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);
5.6 Display chinese/japanese characters
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);
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.6 Display chinese/japanese characters
5.8 Validate/Convert a number using the current Locale()
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0139.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
{
// 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.8 Validate/Convert a number using the current Locale()
5.9 Localize a JFileChooser
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0299.html
Modern Swing release have now built−in ready−to−use 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
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 javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.util.*;
public class LocalizeJFileChooser extends JPanel
implements ActionListener {
JButton go;
AbstractButton button;
ButtonGroup group;
Locale locale;
5.9 Localize a JFileChooser
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);
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
5.9 Localize a JFileChooser
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;
}
}
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 localization
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0418.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.10 Disable localization
If you find this article useful, consider making a small donation
to show your support for this Web site and its content.
Written and compiled by Réal Gagnon ©1998−2005
[ home ]
5.11 Generate the Javadoc "en français"
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0437.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=Sous−interfaces 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
5.11 Generate the Javadoc "en français"
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 © 2003 Real's Howto.</i>]]></bottom>
</javadoc>
If you find this article useful, consider making a small donation
to show your support for this Web site and its content.
Written and compiled by Réal Gagnon ©1998−2005
[ home ]
5.12 Sort a String array
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0343.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 {
String [] words = { "Réal", "Real", "Raoul", "Rico" };
public static void main(String args[]) {
new TestSort1().doit();
}
public void doit() {
try {
// to be able output french character at the console
Writer w =
new BufferedWriter
(new OutputStreamWriter(System.out, "Cp850"));
//
w.write("Before :\n");
for(int i=0; i < 4 ; i++) {
w.write(words[i] + " ");
5.12 Sort a String array
}
java.util.Arrays.sort(words);
w.write("\nAfter :\n");
for(int i=0; i < 4 ; i++) {
w.write(words[i] + " ");
}
w.write("\n");
w.flush();
w.close();
}
catch(Exception e){}
}
}
The output is :
Before :
Réal Real Raoul Rico
After :
Raoul Real Rico Réal
which is wrong since we expect to find "Réal" after "Real". To solve the problem , replace
java.util.arrays.sort(words);
by
java.util.arrays.sort(words, java.text.collator.getInstance(Locale.FRENCH));
and the output will be :
Before :
Réal Real Raoul Rico
After :
Raoul Real Réal Rico
Or you can do it the long way :
...
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;
}
}
}
}
5.12 Sort a String array
5.13 Accentuated characters in Properties/ResourceBundle file
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0492.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).
If you find this article useful, consider making a small donation
to show your support for this Web site and its content.
Written and compiled by Réal Gagnon ©1998−2005
[ home ]
5.14 Compare accentuated letters
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0496.html
class Test {
public static void main(String args[]) {
String s1 = "état";
String s2 = "famille";
// (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.
// here we are expecting "é" < "f"
if (s1.compareTo(s2) > 0) {
// s1 lexicographically follows s2 which is not true!
System.out.println("not ok s1 > s2 ");
}
// (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.
java.text.Collator frCollator =
java.text.Collator.getInstance(java.util.Locale.FRANCE);
frCollator.setStrength(java.text.Collator.CANONICAL_DECOMPOSITION);
// or frCollator.setStrength(java.text.Collator.SECONDARY);
// to be non case sensitive
5.13 Accentuated characters in Properties/ResourceBundle file
if (frCollator.compare(s1, s2) < 0) {
// s2 lexicographically follows s1
System.out.println("ok s1 < s2 ");
}
}
}
Equality
class Test {
public static void main(String args[]) {
String s1 = "état";
String s2 = "État";
// here we are expecting "état" == "État"
if (s1.compareTo(s2) != 0) {
System.out.println("not ok s1 != s2 ");
}
java.text.Collator frCollator =
java.text.Collator.getInstance(java.util.Locale.FRANCE);
frCollator.setStrength(java.text.Collator.SECONDARY);
if (frCollator.compare(s1, s2) == 0) {
// s2 lexicographically follows s1
System.out.println("ok s1 == s2 ");
}
}
}
NOTE: Also, another possibility is to convert to uppercase/lowercase both items to be compared.
If you find this article useful, consider making a small donation
to show your support for this Web site and its content.
Written and compiled by Réal Gagnon ©1998−2005
[ home ]
5.15 Unaccent letters
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0456.html
The following snippet removes from a String accented letters and replace them by their regular
ASCII equivalent.
This can be useful before inserting data into a database to made sorting easier.
Technique 1
It's a simple using the sun.text.Normalizer class. However, since the class is in sun.* package, it is
considered outside of the Java platform, can be different across OS platforms (Solaris, Windows,
Linux, Macintosh, etc.) and can change at any time without notice with SDK versions (1.2, 1.2.1,
1.2.3, etc). In general, writing java programs that rely on sun.* is risky: they are not portable, and
are not supported.
For an alternative to the sun.text.Normalizer class, you may to take a look at IBM's ICU4J project on SourceForge.
5.15 Unaccent letters
We are calling the normalize() with the option DECOMP (for decomposition, see Unicode
Normalization). So if we pass à, the method returns a + ` . Then using a regular expression, we
clean up the string to keep only valid US−ASCII characters.
JDK1.4
import sun.text.Normalizer;
public class Accent {
public static String value = "é à î _ @";
public static void main(String args[]) throws Exception{
System.out.println(formatString(value));
// output : e a i _ @
}
public static String formatString(String s) {
String temp = Normalizer.normalize(s, Normalizer.DECOMP, 0);
return temp.replaceAll("[^\\p{ASCII}]","");
}
A note from ajmacher:
The Normalizer API changed in JDK6... it can now be found in java.text.Normalizer and its usage is
slightly different (but enough to break it), so Technique 1 will cause compiler errors in JDK6. Try :
java.text.Normalizer.normalize(s, java.text.Normalizer.Form.NFD);
Technique 2
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.replaceAll("[èéêë]","e");
s = s.replaceAll("[ûù]","u");
s = s.replaceAll("[ïî]","i");
s = s.replaceAll("[àâ]","a");
s = s.replaceAll("Ô","o");
s = s.replaceAll("[ÈÉÊË]","E");
s = s.replaceAll("[ÛÙ]","U");
s = s.replaceAll("[ÏÎ]","I");
s = s.replaceAll("[ÀÂ]","A");
s = 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
}
}
Technique 3
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
5.15 Unaccent letters
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"
;
// 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;
StringBuffer sb = new StringBuffer();
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";
5.15 Unaccent letters
5.16 Output french characters to the console
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0046.html
Since Java string are Unicode encoded, you must specified a different encoding when printing to a
DOS console. This is done via the OutputStreamWriter class.
import java.io.*;
public class DosString {
public static void main(String args[]){
String javaString =
"caractères français : à é \u00e9"; // Unicode for "é"
try {
// output to the console
Writer w =
new BufferedWriter
(new OutputStreamWriter(System.out, "Cp850"));
w.write(javaString);
w.flush();
w.close();
}
catch (Exception e) {
e.printStackTrace();
}
}
}
An alternative is to start 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
Alternate technique
import java.io.*;
public class test {
public static void main(String[] args) {
PrintStream ps = null;
String javaString =
"caractères français : à é \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.16 Output french characters to the console
5.17 Get the default character set of the JVM
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0505.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());
}
}
Output example (winXP)
>java Hello
Cp1252
Cp1252
windows−1252
See also java encoding table for the encoding sets supported.
If you find this article useful, consider making a small donation
to show your support for this Web site and its content.
Written and compiled by Réal Gagnon ©1998−2005
[ home ]
5.18 Convert OEM (DOS) file to Ansi (Windows)
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0524.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"
);
5.17 Get the default character set of the JVM
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();
r.close();
System.exit(0);
}
}
See also this related HowTo
If you find this article useful, consider making a small donation
to show your support for this Web site and its content.
Written and compiled by Réal Gagnon ©1998−2006
[ home ]
5.19 Detect non−ASCII character in a String
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0536.html
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.nio.charset.CharacterCodingException;
public class TestAscii {
public static void main (String args[])
throws Exception {
// this String throws an Exception, it contains an accented letter
String test = "Réal";
// this String is OK
//String test = "Real";
byte bytearray [] = test.getBytes();
System.out.println("Test string : " + test);
CharsetDecoder d = Charset.forName("US−ASCII").newDecoder();
try {
CharBuffer r = d.decode(ByteBuffer.wrap(bytearray));
r.toString();
}
catch(CharacterCodingException e) {
System.out.println("only regular ASCII characters please!");
// interrupt the processing
5.19 Detect non−ASCII character in a String
throw new Exception(e);
}
System.out.println("Ok, it's ASCII only!");
}
}
Another way is to use a regular expression, see this Javascript HowTo for a hint!
Written and compiled Réal Gagnon ©2007 [email protected]
http://www.rgagnon.com
5.19 Detect non−ASCII character in a String
6 IO
6.1 java−io
6.2 Redirect output(stdout/stderr) to a frame
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0028.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 String
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0029.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) {
try {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
e.printStackTrace(pw);
return "−−−−−−\r\n" + sw.toString() + "−−−−−−\r\n";
}
6.3 Redirect printStackTrace() to a String
catch(Exception e2) {
return "bad stack2string";
}
}
}
6.4 Output french characters to the console
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0046.html
Since Java string are Unicode encoded, you must specified a different encoding when printing to a
DOS console. This is done via the OutputStreamWriter class.
import java.io.*;
public class DosString {
public static void main(String args[]){
String javaString =
"caractères français : à é \u00e9"; // Unicode for "é"
try {
// output to the console
Writer w =
new BufferedWriter
(new OutputStreamWriter(System.out, "Cp850"));
w.write(javaString);
w.flush();
w.close();
}
catch (Exception e) {
e.printStackTrace();
}
}
}
An alternative is to start 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
Alternate technique
import java.io.*;
public class test {
public static void main(String[] args) {
PrintStream ps = null;
String javaString =
"caractères français : à é \u00e9"; // Unicode for "é"
try {
ps = new PrintStream(System.out, true, "Cp850");
}
catch (UnsupportedEncodingException error) {
System.err.println(error);
System.exit(0);
}
ps.println(javaString);
6.4 Output french characters to the console
}
}
Note : List of supported encodings here
6.5 Clear the console and control attributes
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0047.html
On Win9x, this can be done with the driver ANSI.SYS is loaded via the CONFIG.SYS file.
For example, on Win9x installation, you need something like this in the CONFIG.SYS :
device=c:\windows\command\ansi.sys
Then you send the appropriate escape codes to the console
public class AnsiConsole {
public static void main(String args[]) {
String ANSI_CLS = "\u001b[2J";
String ANSI_HOME = "\u001b[H";
String ANSI_BOLD = "\u001b[1m";
String ANSI_AT55 = "\u001b[10;10H";
String ANSI_REVERSEON = "\u001b[7m";
String ANSI_NORMAL = "\u001b[0m";
String ANSI_WHITEONBLUE = "\u001b[37;44m";
System.out.println(ANSI_CLS);
System.out.println
(ANSI_AT55 + ANSI_REVERSEON + "Hello world" + ANSI_NORMAL);
System.out.println
(ANSI_HOME + ANSI_WHITEONBLUE + "Hello world" + ANSI_NORMAL);
System.out.print
(ANSI_BOLD + "Press a key..." + ANSI_NORMAL);
try {System.in.read();}catch(Exception e){}
System.out.println(ANSI_CLS);
}
}
NOTE: Check this "old" text file to have an overview of ANSI.SYS's Escape Sequences.
NT's CMD.EXE does not support ANSI escape sequences. The Good news is that you can use
COMMAND.COM instead. To use ANSI.SYS, add the following lines in the CONFIG.NT file:
dosonly
device=c:\winnt\system32\ansi.sys
But the bad news is that you are restricted this way to run only DOS−based application so it won't
work for Java stuff!!!
So the only solution left for NT (unless you write some JNI functions, see this HowTo) is to use
brute force.
for (int i=0; i<25; i++)
System.out.println();
6.5 Clear the console and control attributes
If you find this article useful, consider making a small donation
to show your support for this Web site and its content.
Written and compiled by Réal Gagnon ©1998−2005
[ home ]
6.6 Print text to a printer easily
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0051.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 without a Dialog
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0350.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.6 Print text to a printer easily
6.8 Simple input from the keyboard
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0053.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();
}
}
}
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;
}
6.8 Simple input from the keyboard
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.9 Initialize and write to a serial port
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0062.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",
};
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.9 Initialize and write to a serial port
6.10 Redirect to a NULL device
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0453.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);
//One−liner style : subclass OutputStream to override the write method ...
System.setOut(new java.io.PrintStream(new java.io.OutputStream() {
public void write(int b){}}));
If you find this article useful, consider making a small donation
to show your support for this Web site and its content.
Written and compiled by Réal Gagnon ©1998−2005
[ home ]
6.11 Get the volume label
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0455.html
This will retrieve the hard disk volume label :
import java.io.*;
import javax.swing.filechooser.*;
public class VolumeLabel {
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);
}
6.10 Redirect to a NULL device
return name;
}
}
The output
Running from c:\temp
>java VolumeLabel c:
"temp"
>java VolumeLabel c:\
"HARDDISK1"
If you find this article useful, consider making a small donation
to show your support for this Web site and its content.
Written and compiled by Réal Gagnon ©1998−2005
[ home ]
6.12 Easy keyboard input (JDK1.5)
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0491.html
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.
import java.util.*;
class TestScanner {
public static void main(String args[]) {
String input = "10:11:12";
Scanner sc = new Scanner(input).useDelimiter(":");
while (sc.hasNextInt()) {
int i = sc.nextInt();
System.out.println(i);
}
}
}
If you find this article useful, consider making a small donation
to show your support for this Web site and its content.
Written and compiled by Réal Gagnon ©1998−2005
[ home ]
6.13 Open or close a CD/DVD drive
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0574.html
Java provides no way to interact with a cd drive.
One easy way on the Windows plateform is to call a VBS script.
6.12 Easy keyboard input (JDK1.5)
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);
}
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);
6.12 Easy keyboard input (JDK1.5)
CDUtils.close("D:\\");
}
}
NOTE : Windows Media Player version 7 or later is required
6.14 Get faster console output (System.out.println()
replacement)
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0603.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 line−buffered 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 ASCII−based then
by removing the Unicode−related activities, the overall execution time will be better.
Consider this program :
import java.io.BufferedWriter;
import java.io.FileDescriptor;
import java.io.FileOutputStream;
import 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 512−bytes buffer and specify the ASCII as character−encoding
to be used.
import java.io.BufferedWriter;
import java.io.FileDescriptor;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
public class Test {
public static void main(String...args) throws Exception {
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new
6.14 Get faster console output (System.out.println() replacement)
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 Execute an external program
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0014.html
Be sure to read this Javaworld article. It describes the various pitfalls related to the Runtime.exec()
method.
6.16 Using Runtime.exec()
This example will capture the output (from stdio) of an external program.
import java.io.*;
public class CmdExec {
public static void main(String argv[]) {
try {
String line;
Process p = Runtime.getRuntime().exec
(System.getenv("windir") +"\\system32\\"+"tree.com /A");
BufferedReader input =
new BufferedReader
(new InputStreamReader(p.getInputStream()));
while ((line = input.readLine()) != null) {
System.out.println(line);
}
input.close();
}
catch (Exception err) {
err.printStackTrace();
}
}
}
6.15 Execute an external program
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 ();
// "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.17 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();
}
6.17 Launch a Windows CMD (or BAT) file and retrieve the errorlevel or exitcode
}
}
test.cmd (set the errorlevel manually)
@echo hello world
@exit 42
test.cmd (set the errorlevel 1 (problem detected)
@java −garbage
test.cmd (set the errorlevel 0 (execution Ok)
@java −version
6.18 Launch a Unix script
String[] cmd = {"/bin/sh", "−c", "ls > hello"};
Runtime.getRuntime().exec(cmd);
6.19 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.18 Launch a Unix script
6.20 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.
The following example start a Dial−up 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.21 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.22 PDF (Mac only)
public class ShowPDF {
public static void main (String[] args) throws Exception{
Process p = Runtime.getRuntime().exec("open /Documents/mypdf.pdf");
}
6.20 Windows rundll32 utility
}
More runddl32 examples
6.23 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();
}
}
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.24 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.25 HTML Help (Windows only)
Runtime.getRuntime().exec("hh.exe myhelpfile.chm");
6.26 Start Excel
import java.io.IOException;
class StartExcel {
public static void main(String args[])
throws IOException
6.23 Path to executable with spaces in them
{
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);
}
}
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.27 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.27 Start a Windows application under another account
6.28 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"
+ 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/windows−vista−junctions−points−mui−and−localized−f
6.29 Launch the application associated with a file extension
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0579.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));
}
}
6.28 Windows : execute something in Program Files
The possible actions are
• BROWSE. launching the user−default browser to show a specified URI
• MAIL. launching the user−default 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);
}
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.30 Launch an application from another application
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0394.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
6.30 Launch an application from another application
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();
}
The above example is used when the class is hard−coded.
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 arg[]) throws Exception{
System.out.println("Hello from Program1a");
Thread t1 = new Thread(){
public void run() {
Program2.main(new String[]{});}
};
t1.start();
t1.join();
System.out.println("Hello from Program1a");
}
}
6.30 Launch an application from another application
The output :
C:\>java Program1a
Hello from Program1a
Hello from Program2
Hello from Program2
Hello from Program2
Hello from Program2
Hello from Program1a
6.31 Start the default browser from an application
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0071.html
In this snippet, we initialize a Listbox from a file containing some URLs. When we double click an
item, the default browser is started with the selected HTML page as parameter. This example is
Windows oriented since I have used the start command which supports the file association.
[urlList.txt]
http://www.rgagnon.com/javadetails/java−0001.html|JAVA How−to 1
http://www.rgagnon.com/javadetails/java−0002.html|JAVA How−to 2
http://www.rgagnon.com/javadetails/java−0003.html|JAVA How−to 3
http://www.rgagnon.com/javadetails/java−0004.html|JAVA How−to 4
http://www.rgagnon.com/javadetails/java−0005.htmL|JAVA How−to 5
[StartBrowser.java]
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
public class StartBrowser {
public static void main(String s[]) {
AFrame f = new AFrame();
}
}
class AFrame extends Frame implements ActionListener {
List lbx;
String url[] = new String[50];
public AFrame() {
// dispaly setup
setTitle("URL selection");
setSize(400,400);
lbx = new List();
add(lbx);
initLbx();
// action on listbox double click
lbx.addActionListener(this);
// to close the Frame
addWindowListener
(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
6.31 Start the default browser from an application
System.exit(0);
}
}
);
setVisible(true);
}
public void actionPerformed (ActionEvent ae) {
String theUrl = url[lbx.getSelectedIndex()];
// start the default browser (Win95 platform)
// on listbox double click
String cmdLine = "start " + theUrl;
// on NT, you need to start cmd.exe because start is not
// an external command but internal, you need to start the
// command interpreter
// String cmdLine = "cmd.exe /c " + cmdLine;
try {
Process p = Runtime.getRuntime().exec(cmdLine);
}
catch (Exception e) {
e.printStackTrace();
}
}
public void initLbx() {
int i = 0;
try {
String aLine = "";
BufferedReader in
= new BufferedReader(new FileReader("urlList.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()); in JDK1.2
}
}
catch(Exception e) {
e.printStackTrace();
}
}
}
Another way on Windows platform to start the default browser is ;
Runtime.getRuntime().exec
("rundll32 url.dll,FileProtocolHandler " + theUrl);
You may have difficulty to open a URL ending with .htm. All you need is to replace the last m with
%6D, like
rundll32 url.dll,FileProtocolHandler http://www.rgagnon.com/howto.htm
for
rundll32 url.dll,FileProtocolHandler http://www.rgagnon.com/howto.ht%6D
JDK1.6 has java.awt.Desktop.open(File)
6.31 Start the default browser from an application
See http://java.sun.com/javase/6/docs/api/java/awt/Desktop.html
JDIC provides the equivalent API for 1.4 and later.
See https://jdic.dev.java.net
try {
Desktop.browse(new URL("http://www.rgagnon.com");
}
catch (MalformedURLException e1) {
e1.printStackTrace();
}
catch (DesktopException e2) {
e2.printStackTrace();
}
See also this HowTo.
6.32 Execute a Windows Shortcut (.lnk)
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0571.html
A Shortcut is stored in a file with the extension lnk.
// we assume that the .lnk is in the current directory
String currentDir = new File(".").getCanonicalPath();
try {
Runtime.getRuntime().exec
("cmd /c start " + currentDir + "/viewLog.lnk");
}
catch (Exception e){
JOptionPane.showMessageDialog
(null, e.getMessage(),"Oups", JOptionPane.ERROR_MESSAGE);
}
6.33 Create a file association with a Java program
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0592.html
In this example, a file with the extension .xox will be defined and associated with a java program
(display the first 10 lines of selected .xox file).
First the java program to be associated with the .xox file type.
import java.io.*;
public class Head {
static final int MAX_LINES = 10;
public static void main(String args[]) throws Exception{
6.32 Execute a Windows Shortcut (.lnk)
String line = null;
int i = 0 ;
FileInputStream fin = new FileInputStream(args[0]);
BufferedReader myInput = new BufferedReader
(new InputStreamReader(fin));
while ( (line = myInput.readLine()) != null) {
System.out.println(line);
i++;
if (i == MAX_LINES) break;
}
BufferedReader input =
new BufferedReader(new InputStreamReader(System.in));
System.out.print("*** Press any key...");
input.readLine();
}
}
With Windows, two commands are used to define a file association, assoc and ftype. You need
to execute these commands from an account with Administrator privilege.
To know more about these commands, type assoc /? or ftype /? .
First we define the .xox file type.
The assoc command sets up an association between a file name extension and a file type.
>assoc .xox=Xoxfile
.xox=Xoxfile
Then we specify which program is used to handle the Xoxfile type of file.
The ftype command sets up an association between a file type name, and a string to be used to
execute it.
In this example, we specify the Java JVM to be used, the classpath to load the Head.class plus
the parameter (the selected .xox file).
>ftype Xoxfile=C:\Program Files\Java\jre1.5.0\bin\java −cp c:\dev\work Head %1
Xoxfile=C:\Program Files\Java\jre1.5.0\bin\java −cp c:\dev\work Head %1
Now, if you double−click on a file with .xox extension, a Dos shell is opened, the Head class is
launched with the clicked filename as a parameter and the first 10 line are displayed.
To make the file association works from a command line, you define the environment variable
PATHEXT to include the .xox extension.
>set pathext=.xox;%pathext%
PATHEXT=.XOX;.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH
then you will be able, from a Dos shell, to type only the name of .xox file and the associated
program will be launched with that file as a parameter.
See also this HowTo.
6.32 Execute a Windows Shortcut (.lnk)
6.34 Capture the output from a VBS
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0576.html
This HowTo query the Windows Registry for a specific key. The VBS prints the result and from
Java, we capture this output.
Since we need the output, we must use the VBS interpreter for the console mode
(CSCRIPT.EXE).
import java.io.BufferedReader;
import java.io.File;
import java.io.FileWriter;
import java.io.InputStreamReader;
public class VBSUtils {
private VBSUtils() { }
public static String readWindowRegistry(String key) {
String result = "";
try {
File file = File.createTempFile("realhowto",".vbs");
file.deleteOnExit();
FileWriter fw = new java.io.FileWriter(file);
String vbs = "Dim WSHShell \n"
+ "Set WSHShell = WScript.CreateObject(\"WScript.Shell\") \n"
+ "WScript.Echo _ \n"
+ "WSHShell.RegRead(\"" + key + "\") \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;
while ((line = input.readLine()) != null) {
result += line;
}
input.close();
}
catch(Exception e){
e.printStackTrace();
}
return result.trim();
}
public static void main(String[] args){
//
// DEMO
//
String result = "";
msgBox("Get the path of Acrobat reader from the registry");
result = readWindowRegistry
("HKLM\\Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\AcroRd32.exe\\");
6.34 Capture the output from a VBS
msgBox("Acrobat Reader is located in " + result);
}
public static void msgBox(String msg) {
javax.swing.JOptionPane.showConfirmDialog((java.awt.Component)
null, msg, "VBSUtils", javax.swing.JOptionPane.DEFAULT_OPTION);
}
}
6.35 Get a return code from a VBS
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0575.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 ");
6.35 Get a return code from a VBS
msgBox("Check if service 'foo' is running (should be no)");
result = isServiceRunning("foo") ? "" : " NOT ";
msgBox("service 'foo' is " + result + " running ");
}
public static void msgBox(String msg) {
javax.swing.JOptionPane.showConfirmDialog((java.awt.Component)
null, msg, "VBSUtils", javax.swing.JOptionPane.DEFAULT_OPTION);
}
}
6.36 Execute a CMD file stored in a JAR
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0600.html
In this example, a CMD file is stored a JAR file. The Java code extracts the file as a ressource,
launch a Windows CMD Shell and write the content to the stdin without any temporary file.
In this How−to, the CMD included is used to trigger the default Windows screen saver.
scrnsave.scr /s
import java.io.*;
public class StartScreenSaver {
public static void main(String args[]) throws IOException {
new StartScreenSaver().doit();
}
public void doit() throws IOException{
String line;
OutputStream stdin = null;
InputStream stderr = null;
InputStream stdout = null;
try {
// that our CMD file in our JAR
InputStream is =
getClass().getResource("/screensaver.cmd").openStream();
BufferedReader brCmdLine =
new BufferedReader(new InputStreamReader(is));
// launch CMD and grab stdin/stdout and stderr
Process process = Runtime.getRuntime ().exec ("cmd");
stdin = process.getOutputStream ();
stderr = process.getErrorStream ();
stdout = process.getInputStream ();
// "write" the CMD file into stdin
while ((line = brCmdLine.readLine()) != null) {
line += "\n";
stdin.write(line.getBytes() );
}
stdin.flush();
stdin.close();
// clean up if any output in stdout
6.36 Execute a CMD file stored in a JAR
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();
}
catch (IOException e) {
e.printStackTrace();
}
finally {
stdout.close();
stderr.close();
}
}
}
Get the JAR here.
6.37 Read the content of a file
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0052.html
This following example is for an application.
On the command line, give the filename to be displayed.
import java.io.*;
public class Cat {
public static void main (String args[]) {
String thisLine;
for (int i=0; i < args.length; i++) {
try {
FileInputStream fin = new FileInputStream(args[i]);
// JDK1.1+
BufferedReader myInput = new BufferedReader
(new InputStreamReader(fin));
while ((thisLine = myInput.readLine()) != null) {
System.out.println(thisLine);
}
}
catch (Exception e) {
e.printStackTrace();
}
}
}
}
6.37 Read the content of a file
With an Applet, we can only open file on the same server that the Applet is coming from.
import java.applet.*;
import java.net.*;
import java.io.*;
public class MyApplet extends Applet {
public void init() {
readFile("mydatafile.txt");
}
public void readFile(String f) {
try {
String aLine = "";
URL source = new URL(getCodeBase(), f);
BufferedReader br =
new BufferedReader
(new InputStreamReader(source.openStream()));
while(null != (aLine = br.readLine())) {
System.out.println(aLine);
}
br.close();
}
catch(Exception e) {
e.printStackTrace();
}
}
}
The next Applet reads a data file and inserts the data in a Choice component.
import java.applet.*;
import java.awt.*;
import java.net.*;
import java.io.*;
public class ReadDataInChoice extends Applet {
Choice myChoice;
public void init() {
myChoice = new java.awt.Choice();
add(myChoice);
readFile("dataforchoice.txt");
}
public void readFile(String f) {
try {
String anItem = "";
URL source = new URL(getCodeBase(), f);
BufferedReader in =
new BufferedReader(new InputStreamReader(source.openStream()));
while(null != (anItem = in.readLine())) {
myChoice.add(anItem);
}
in.close();
}
catch(Exception e) {
e.printStackTrace();
}
}
}
6.37 Read the content of a file
[dataforchoice.txt]
item 1
item 2
item 3
item 4
item 5
ITEM 6
Try it here.
The following method read a data file and return the content as a String. We use a StringBuffer to
optimize string concatenation operations.
private static String readFile(String filename) throws IOException {
String lineSep = System.getProperty("line.separator");
BufferedReader br = new BufferedReader(new FileReader(filename));
String nextLine = "";
StringBuffer sb = new StringBuffer();
while ((nextLine = br.readLine()) != null) {
sb.append(nextLine);
//
// note:
// BufferedReader strips the EOL character
// so we add a new one!
//
sb.append(lineSep);
}
return sb.toString();
}
See this HowTo to read a File which is inside a JAR.
6.38 Read a text file from a jar
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0077.html
import java.io.*;
import java.util.*;
public class FileUtils{
public static List<String> readTextFromJar(String s) {
InputStream is = null;
BufferedReader br = null;
String line;
ArrayList<String> list = new ArrayList<String>();
try {
is = FileUtils.class.getResourceAsStream(s);
br = new BufferedReader(new InputStreamReader(is));
while (null != (line = br.readLine())) {
list.add(line);
}
}
catch (Exception e) {
e.printStackTrace();
6.38 Read a text file from a jar
}
finally {
try {
if (br != null) br.close();
if (is != null) is.close();
}
catch (IOException e) {
e.printStackTrace();
}
}
return list;
}
public static void main(String args[]) throws IOException{
List<String> list = FileUtils.readTextFromJar("/datafile1.txt");
Iterator<String> it = list.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
list = FileUtils.readTextFromJar("/test/datafile2.txt");
it = list.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
}
}
Create 2 datafiles.
datafile1.txt in the same directory as FileUtils.class (in the root) and datafile2.txt in a subdirectory
called test
[datafile1.txt]
datafile1 line 1
datafile1 line 2
datafile1 line 3
datafile1 line 4
datafile1 line 5
[/test/datafile2.txt]
datafile2 line 1
datafile2 line 2
datafile2 line 3
datafile2 line 4
datafile2 line 5
Create the jar with
>"C:\Program Files\Java\jdk1.5.0\bin\jar" −cf MyJar.jar
FileUtils.class datafile.txt test/datafile.txt
Try it :
C> java −cp MyJar.jar FileUtils
The output should be like :
6.38 Read a text file from a jar
datafile1 line 1
datafile1 line 2
datafile1 line 3
datafile1 line 4
datafile1 line 5
datafile2 line 1
datafile2 line 2
datafile2 line 3
datafile2 line 4
datafile2 line 5
Get the JAR here
With an Applet, it's the same technique
import java.applet.*;
import java.io.*;
public class ReadFromJar extends Applet{
public void init(){
readTextFromJar("datafile1.txt");
readTextFromJar("test/datafile2.txt");
}
public void readTextFromJar(String s) {
String thisLine;
try {
InputStream is = getClass().getResourceAsStream(s);
BufferedReader br = new BufferedReader
(new InputStreamReader(is));
while ((thisLine = br.readLine()) != null) {
System.out.println(thisLine);
}
}
catch (Exception e) {
e.printStackTrace();
}
}
}
Create the JAR
>"C:\Program Files\Java\jdk1.5.0\bin\jar" −cf
MyJarApplet.jar ReadFromJar.class datafile1.txt test/datafile2.txt
The html
<HTML><HEAD></HEAD><BODY>
<APPLET CODE=ReadFromJar.class width=1 height=1 archive=MyJarApplet.jar>
</APPLET>
See java console for output</BODY></HTML>
Try it here
6.38 Read a text file from a jar
6.39 Extract a file from a Jar
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0429.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();
}
catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String args []){
new ExtractFromJAR().extractMyMDBFromJAR(".");
}
Grab this auto−run Jar if you want to try it.
To create an auto−run JAR, first create a manifest.mft
Manifest−Version: 1.0
Classpath: .\mydb.jar
Main−Class: ExtractFromJAR
Create the JAR
C:\jdk141\bin\jar cvfm mydb.jar manifest.mft ExtractFromJAR.class mydb.mdb
6.39 Extract a file from a Jar
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", " ");
If you find this article useful, consider making a small donation
to show your support for this Web site and its content.
Written and compiled by Réal Gagnon ©1998−2005
[ home ]
6.40 Read a data file with floats
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0078.html
[ReadingFloat.java]
public class ReadingFloat {
public static float[] readFile(String file, String delimiter)
throws Exception {
return(readValues(new java.io.FileInputStream(file), delimiter));
}
public static float[] readURL(String url, String delimiter)
throws Exception {
java.net.URL addr = new java.net.URL(url);
return(readValues(addr.openStream(), delimiter));
}
public static float[] readValues(java.io.InputStream in, String delimiter)
throws java.io.FileNotFoundException,
java.io.IOException,
java.lang.NumberFormatException {
String thisLine;
java.io.BufferedInputStream s = new java.io.BufferedInputStream(in);
java.io.BufferedReader myInput = new java.io.BufferedReader
(new java.io.InputStreamReader(s));
int j = 0;
float[] values = new float[10];
while ((thisLine = myInput.readLine()) != null) {
// scan it line by line
java.util.StringTokenizer st =
new java.util.StringTokenizer(thisLine, delimiter);
while(st.hasMoreElements())
values[j++] = Float.valueOf(st.nextToken()).floatValue();
6.40 Read a data file with floats
}
return(values);
}
public static void main(String arg[]) {
new ReadingFloat().demo();
}
public void demo() {
try {
// we assume 10 floats (max)to be read
float results [] = readFile("floatwithdelimitercolon.dat", ",");
for(int i = 0; i < results.length; i++ ) {
System.out.println(results[i]);
}
System.out.println();
results = readFile("floatwithdelimiterspace.dat", " ");
for(int i = 0; i lt; results.length; i++ ) {
System.out.println(results[i]);
}
}
catch (Exception e) {
e.printStackTrace();
}
}
}
[floatwithdelimitercolon.dat]
1.2,1.3,1.6,1.78,1.2345
2.2,2.3,2.6,2.78,2.2345
[floatwithdelimiterspace.dat]
1.2 1.3 1.6 1.78 1.2345
2.2 2.3 2.6 2.78 2.2345
6.41 Write to the end of a file
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0054.html
[JDK1.0.2]
import java.io.*;
public class appendtext {
public static void main(String args[]){
try {
PrintStream out =
new PrintStream(new AppendFileStream("myfile"));
out.print("A new line of text");
out.close();
}
catch(Exception e) {
System.out.println(e.toString());
}
}
}
6.41 Write to the end of a file
class AppendFileStream extends OutputStream {
RandomAccessFile fd;
public AppendFileStream(String file) throws IOException {
fd = new RandomAccessFile(file,"rw");
fd.seek(fd.length());
}
public void close() throws IOException {
fd.close();
}
public void write(byte[] b) throws IOException {
fd.write(b);
}
public void write(byte[] b,int off,int len) throws IOException {
fd.write(b,off,len);
}
public void write(int b) throws IOException {
fd.write(b);
}
}
[JDK1.1]
FileOutputStream fos = new FileOutputStream("myfile", true);
to open in Append mode
6.42 Write "real" ascii file
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0058.html
Java uses Unicode character encoding internally. To pass information to outside world, it may be
necessary to use different encoding.
For example, DOS application may use MS ISO−Latin 1(or Codepage 850) to represent french
characters like é or à.
Before writting to a file or in a database record it is necessary to change the default String encoding.
This done via the InputStreamReader class for input and OutputStreamWriter for output.
InputStreamReader converts from the specified input encoding to Unicode while the
OutputStreamWriter converts from Unicode to the specified output encoding.
import java.io.*;
import java.awt.*;
public class DosString {
public static void main(String args[]){
String javaString = "é \u00e9"; // Unicode for "é"
try {
// output : Unicode to Cp850 (MS−DOS Latin−1)
FileOutputStream fos = new FileOutputStream("out.dat");
Writer w =
new BufferedWriter(new OutputStreamWriter(fos, "Cp850"));
w.write(JavaString);
6.42 Write "real" ascii file
w.flush();
w.close();
// input`: Cp850 to Unicode
FileInputStream fis = new FileInputStream("out.dat");
BufferedReader r =
new BufferedReader(new InputStreamReader(fis, "Cp850"));
String dosString = r.readLine();
r.close();
Frame f = new Frame();
f.setSize(100,100);
f.add(new Label(dosString));
f.setVisible(true);
}
catch (Exception e) {
e.printStackTrace();
}
}
}
NOTE: When the character encoding is not specified, the default encoding is used. You can find out the current default encoding by looking at
file.encoding property with System.getProperty("file.encoding"); .
6.43 Copy a file
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0064.html
[Old technique (pre JDK1.4)]
import java.io.*;
public class FileUtils{
public static void copyFile(File in, File out) throws Exception {
FileInputStream fis = new FileInputStream(in);
FileOutputStream fos = new FileOutputStream(out);
try {
byte[] buf = new byte[1024];
int i = 0;
while ((i = fis.read(buf)) != −1) {
fos.write(buf, 0, i);
}
}
catch (Exception e) {
throw e;
}
finally {
if (fis != null) fis.close();
if (fos != null) fos.close();
}
}
public static void main(String args[]) throws Exception{
FileUtils.copyFile(new File(args[0]),new File(args[1]));
}
}
[JDK1.4 using the java.nio package (faster)]
6.43 Copy a file
import java.io.*;
import java.nio.channels.*;
public class FileUtils{
public static void copyFile(File in, File out)
throws IOException
{
FileChannel inChannel = new
FileInputStream(in).getChannel();
FileChannel outChannel = new
FileOutputStream(out).getChannel();
try {
inChannel.transferTo(0, inChannel.size(),
outChannel);
}
catch (IOException e) {
throw e;
}
finally {
if (inChannel != null) inChannel.close();
if (outChannel != null) outChannel.close();
}
}
public static void main(String args[]) throws IOException{
FileUtils.copyFile(new File(args[0]),new File(args[1]));
}
}
NOTE:
In win2000 , the transferTo() does not transfer files > than 2^31−1 bytes. it throws an exception of "java.io.IOException: The parameter is
incorrect"
In solaris8 , Bytes transfered to Target channel are 2^31−1 even if the source channel file is greater than 2^31−1
In LinuxRH7.1 , it gives an error of java.io.IOException: Input/output error
ref : http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4643189
On the Windows plateform, you can't copy a file bigger than 64Mb, an Exception in thread "main"
java.io.IOException: Insufficient system resources exist to complete the requested service is thrown.
For a discussion about this see : http://forum.java.sun.com/thread.jspa?threadID=4396950
The workaround is to copy in a loop 64Mb each time until there is no more data.
Replace
...
try {
inChannel.transferTo(0, inChannel.size(),
outChannel);
}
...
by
...
try {
// magic number for Windows, 64Mb − 32Kb)
int maxCount = (64 * 1024 * 1024) − (32 * 1024);
long size = inChannel.size();
long position = 0;
6.43 Copy a file
while (position < size) {
position +=
inChannel.transferTo(position, maxCount, outChannel);
}
...
6.44 Use a "log file"
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0063.html
/**
* Utilities log
*/
import java.io.*;
import java.text.*;
import java.util.*;
public class SimpleLog {
private static String logFile = "/msglog.txt";
private final static DateFormat df = new SimpleDateFormat ("yyyy.mm.dd hh:mm:ss ");
private SimpleLog() { }
public static void setLogFilename(String filename) {
logFile = filename;
new File(filename).delete();
try {
write("LOG file : " + filename);
}
catch (Exception e) {
System.out.println(stack2string(e));
}
public static void write(String msg) {
write(logFile, msg);
}
public static void write(Exception e) {
write(logFile, stack2string(e));
}
public static void write(String file, String msg) {
try {
Date now = new Date();
String currentTime = SimpleLog.df.format(now);
FileWriter aWriter = new FileWriter(file, true);
aWriter.write(currentTime + " " + msg
+ System.getProperty("line.separator"));
System.out.println(currentTime + " " + msg);
aWriter.flush();
aWriter.close();
}
catch (Exception e) {
System.out.println(stack2string(e));
}
6.44 Use a "log file"
}
private static String stack2string(Exception e) {
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";
}
}
}
and then to use it
SimpleLog.write("i am here");
See also this HowTo and this one
6.45 Delete files with a certain extension
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0072.html
Define a special FilenameFilter :
import java.io.*;
public class ExtensionFilter implements FilenameFilter {
private String extension;
public ExtensionFilter( String extension ) {
this.extension = extension;
}
public boolean accept(File dir, String name) {
return (name.endsWith(extension));
}
}
and then
import java.io.*;
public class FileUtils{
public static void main(String args[]) throws Exception {
FileUtils.deleteFiles("c:/test/", ".gif");
}
public static void deleteFiles( String directory, String extension ) {
ExtensionFilter filter = new ExtensionFilter(extension);
File dir = new File(directory);
String[] list = dir.list(filter);
File file;
6.45 Delete files with a certain extension
if (list.length == 0) return;
for (int i = 0; i < list.length; i++) {
//file = new File(directory + list[i]);
file = new File(directory, list[i]);
System.out.print(file + " deleted : " + file.delete());
}
}
}
}
6.46 Insert a line in a file
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0073.html
The only way to insert a line in a text file is to read the original file and write the content in a
temporary file with the new line inserted. Then we erase the original file and rename the temporary
file to the original name.
In this example, you need to supply 3 arguments : the filename, a line number and the string to be
inserted at the line number specified.
java JInsert test.out 9 "HELLO WORLD"
will insert the string "HELLO WORLD" at line number 9 in the file "test.out".
of course you need more error checking...
[JDK1.1]
import java.io.*;
public class JInsert {
public static void main(String args[]){
try {
JInsert j = new JInsert();
j.insertStringInFile
(new File(args[0]),Integer.parseInt(args[1]), args[2]);
}
catch (Exception e) {
e.printStackTrace();
}
}
public void insertStringInFile
(File inFile, int lineno, String lineToBeInserted)
throws Exception {
// temp file
File outFile = new File("$$$$$$$$.tmp");
// input
FileInputStream fis = new FileInputStream(inFile);
BufferedReader in = new BufferedReader
(new InputStreamReader(fis));
// output
FileOutputStream fos = new FileOutputStream(outFile);
6.46 Insert a line in a file
PrintWriter out = new PrintWriter(fos);
String thisLine = "";
int i =1;
while ((thisLine = in.readLine()) != null) {
if(i == lineno) out.println(lineToBeInserted);
out.println(thisLine);
i++;
}
out.flush();
out.close();
in.close();
inFile.delete();
outFile.renameTo(inFile);
}
}
6.47 Read a file into a variable in one shot
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0074.html
import java.io.*;
public class ReadFullyIntoVar {
public static void main(String argv[]){
try {
FileInputStream file = new FileInputStream (argv[0]);
DataInputStream in = new DataInputStream (file);
byte[] b = new byte[in.available ()];
in.readFully (b);
in.close ();
String result = new String (b, 0, b.length, "Cp850");
/* */
System.out.println(result);
}
catch (Exception e) {
e.printStackTrace();
}
}
}
6.48 Serialize an object to a file
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0075.html
Suppose we have a class called Queue.class. We want to save the state of the Queue in a file.
Since our Queue extends the Vector class, the methods needed to serialize the object are already
done. All we need is an input or output stream.
First the Queue class
import java.util.Vector;
import java.io.*;
6.47 Read a file into a variable in one shot
public class Queue extends Vector {
/*
** FIFO, first in first out
*/
Queue() {
super();
}
void put(Object o) {
addElement(o);
}
Object get() {
if (isEmpty()) return null;
Object o = firstElement();
removeElement(o);
return o;
}
Object peek() {
if (isEmpty()) return null;
return firstElement();
}
}
To serialize (save the Queue state to a file) :
public static void main(String args[]) {
Queue theQueue;
theQueue = new Queue();
theQueue.put("element 1");
theQueue.put("element 2");
theQueue.put("element 3");
theQueue.put("element 4");
System.out.println(theQueue.toString());
// serialize the Queue
System.out.println("serializing theQueue");
try {
FileOutputStream fout = new FileOutputStream("thequeue.dat");
ObjectOutputStream oos = new ObjectOutputStream(fout);
oos.writeObject(theQueue);
oos.close();
}
catch (Exception e) { e.printStackTrace(); }
}
To unserialize (to load a previously saved Queue) :
public static void main(String args[]) {
Queue theQueue;
theQueue = new Queue();
// unserialize the Queue
System.out.println("unserializing theQueue");
try {
FileInputStream fin = new FileInputStream("thequeue.dat");
ObjectInputStream ois = new ObjectInputStream(fin);
theQueue = (Queue) ois.readObject();
6.47 Read a file into a variable in one shot
ois.close();
}
catch (Exception e) { e.printStackTrace(); }
System.out.println(theQueue.toString());
}
6.49 Redirect stdout to a file
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0061.html
[JDK1.1] application only
System.setOut(
new PrintStream(
new BufferedOutputStream(
new FileOutputStream("OUTPUT.DAT"))));
You may want to look at this How−to to redirect exception output to a Frame.
6.50 Get the "last modified" date from a file
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0068.html
Simply use the lastModified() method from a file object. but the return value is system dependent
and should only be used to compare with other values returned by last modified. It should not be
interpreted as an absolute time.
String s1 = "file1.dat";
String s2 = "file2.dat";
File f1 = new File(s1);
File f2 = new File(s2);
if (f1.lastModified() < f2.lastModified())
System.out.println((s1 + " IS OLDER THAN " + S2);
6.51 Check if a file exists
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0070.html
import java.io.*;
public class FileTest {
public static void main(String args[]) {
File f = new File(args[0]);
System.out.println
(f + (f.exists()? " is found " : " is missing "));
}
}
6.49 Redirect stdout to a file
6.52 Detect file modification
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0490.html
For a single file, a thread is launched to check the lastModified value and compare it with the
previous value.
import java.util.*;
import java.io.*;
public abstract class FileWatcher extends TimerTask {
private long timeStamp;
private File file;
public FileWatcher( File file ) {
this.file = file;
this.timeStamp = file.lastModified();
}
public final void run() {
long timeStamp = file.lastModified();
if( this.timeStamp != timeStamp ) {
this.timeStamp = timeStamp;
onChange(file);
}
}
protected abstract void onChange( File file );
}
import java.util.*;
import java.io.*;
class FileWatcherTest {
public static void main(String args[]) {
// monitor a single file
TimerTask task = new FileWatcher( new File("c:/temp/text.txt") ) {
protected void onChange( File file ) {
// here we code the action on a change
System.out.println( "File "+ file.getName() +" have change !" );
}
};
Timer timer = new Timer();
// repeat the check every second
timer.schedule( task , new Date(), 1000 );
}
}
For a directory, a thread is launched where we keep the Files in a Map, we check the current
lastModifed value of a given file and compare it with the value stored in the Map. Also a special
check is made to detect if a File is deleted.
6.52 Detect file modification
import java.util.*;
import java.io.*;
public abstract class DirWatcher extends TimerTask {
private String path;
private File filesArray [];
private HashMap dir = new HashMap();
private DirFilterWatcher dfw;
public DirWatcher(String path) {
this(path, "");
}
public DirWatcher(String path, String filter) {
this.path = path;
dfw = new DirFilterWatcher(filter);
filesArray = new File(path).listFiles(dfw);
// transfer to the hashmap be used a reference and keep the
// lastModfied value
for(int i = 0; i <filesArray.length; i++) {
dir.put(filesArray[i], new Long(filesArray[i].lastModified()));
}
}
public final void run() {
HashSet checkedFiles = new HashSet();
filesArray = new File(path).listFiles(dfw);
// scan the files and check for modification/addition
for(int i = 0; i < filesArray.length; i++) {
Long current = (Long)dir.get(filesArray[i]);
checkedFiles.add(filesArray[i]);
if (current == null) {
// new file
dir.put(filesArray[i], new Long(filesArray[i].lastModified()));
onChange(filesArray[i], "add");
}
else if (current.longValue() != filesArray[i].lastModified()){
// modified file
dir.put(filesArray[i], new Long(filesArray[i].lastModified()));
onChange(filesArray[i], "modify");
}
}
// now check for deleted files
Set ref = ((HashMap)dir.clone()).keySet();
ref.removeAll((Set)checkedFiles);
Iterator it = ref.iterator();
while (it.hasNext()) {
File deletedFile = (File)it.next();
dir.remove(deletedFile);
onChange(deletedFile, "delete");
}
}
protected abstract void onChange( File file, String action );
}
class DirFilterWatcher implements FileFilter {
private String filter;
public DirFilterWatcher() {
6.52 Detect file modification
this.filter = "";
}
public DirFilterWatcher(String filter) {
this.filter = filter;
}
public boolean accept(File file) {
if ("".equals(filter)) {
return true;
}
return (file.getName().endsWith(filter));
}
}
import java.util.*;
import java.io.*;
class DirWatcherTest {
public static void main(String args[]) {
TimerTask task = new DirWatcher("c:/temp", "txt" ) {
protected void onChange( File file, String action ) {
// here we code the action on a change
System.out.println
( "File "+ file.getName() +" action: " + action );
}
};
Timer timer = new Timer();
timer.schedule( task , new Date(), 1000 );
}
}
See also this related howto and this one too.
6.53 File/directory polling to detect change
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0617.html
6.54 jpoller (directory poller)
http://jpoller.sourceforge.net/
A general purpose Java component to enable polling on directories and aysnchronously notify client
code of incoming files. It's instrumented via JMX and controllable (also) via a JMX agent, like JBoss'
JMX console.
6.55 JNotify
http://jnotify.sourceforge.net/
6.53 File/directory polling to detect change
JNotify is a java library that allow java application to listen to file system events. JNotify works on
both Windows (Windows 2000, XP, Vista) and Linux with INotify support (Kernel 2.6.14 and above).
6.56 Java Native Access (JNA)
https://jna.dev.java.net/
The goal of the JNA project is to let you access native code from Java while avoiding C and the
Java Native Interface.
One example provides notification of file system changes using the mechanism provided by the OS.
FileMonitor.java
Javaworld article about JNA
6.57 Call native methods in a DLL from Java (NativeCall)
http://johannburkard.de/blog/programming/java/Call−native−methods−in−a−DLL−from−Java−without−JNI.ht
In this blog entry, the package NativeCall is used to call the Windows API to get notification about
modification in given folder.
6.58 Java 7
http://www.artima.com/lejava/articles/more_new_io.html
Java 7 is supposed to provides a mechanism to get notificaton on file change without polling (JSR
203).
6.59 The simple (and naive!) approach
Detect file modification
Using Threads and file lookup at regular interval.
6.60 Get the current directory
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0076.html
import java.io.File;
public class CurrentDir {
public static void main (String args[]) {
File dir1 = new File (".");
File dir2 = new File ("..");
try {
System.out.println ("Current dir : " + dir1.getCanonicalPath());
System.out.println ("Parent dir : " + dir2.getCanonicalPath());
}
catch(Exception e) {
6.56 Java Native Access (JNA)
e.printStackTrace();
}
}
}
6.61 Get the "root" of an application
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0581.html
By root, we mean the starting directory.
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
public class DummyApp {
public static void main(String args[]) throws Exception{
DummyApp s = new DummyApp();
s.getRoot();
}
public void getRoot() throws IOException, URISyntaxException{
URL u = getClass().getProtectionDomain().getCodeSource().getLocation();
File f = new File(u.toURI());
System.out.println(f.getParent());
}
}
Running from a regular class
C:\Applications\dev\HowTo>java −cp . DummyApp
C:\Applications\dev
Running from a jar
C:\Applications\dev\HowTo>jar cf DummyApp.jar DummyApp.*
C:\Applications\dev\HowTo>java −cp DummyApp.jar DummyApp
C:\Applications\dev\HowTo
See these related HowTo's : 1 2
6.62 Get the content of a directory with a Filter
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0055.html
First you create a class that implements java.io.FilenameFilter and then code the accept() method,
then call File.list() with the filter as a parameter. The returned array of strings has all the names that
passed through the accept()filter.
6.61 Get the "root" of an application
import java.io.File;
import java.io.FilenameFilter;
public class Filter implements FilenameFilter {
protected String pattern;
public Filter (String str) {
pattern = str;
}
public boolean accept (File dir, String name) {
return name.toLowerCase().endsWith(pattern.toLowerCase());
}
public static void main (String args[]) {
if (args.length != 1) {
System.err.println
("usage: java Filter <pattern list> ex. java Filter java");
return;
}
Filter nf = new Filter (args[0]);
// current directory
File dir = new File (".");
String[] strs = dir.list(nf);
for (int i = 0; i < strs.length; i++) {
System.out.println (strs[i]);
}
}
}
Here a version to support multiple filters.
import java.io.File;
import java.io.FilenameFilter;
import java.util.Arrays;
import java.util.Iterator;
import java.util.TreeSet;
/**
* <CODE>
* GenericFileFilter xml = new GenericFileFilter ("xml");
* // GenericFileFilter xmlandpdf = new GenericFileFilter (new String [] { "xml", "pdf" });
* File dir = new File (".");
* String[] strs = dir.list(xml);
* for (int i = 0; i < strs.length; i++) {
* // strs[i]
* }
* </CODE>
*/
public class GenericFileFilter implements FilenameFilter {
private TreeSet<String> exts = new TreeSet<String>() ;
public GenericFileFilter(String ext) {
exts.add("." + ext.toLowerCase().trim());
}
public GenericFileFilter(String[] extensions) {
Iterator<String> extList = Arrays.asList(extensions).iterator();
while (extList.hasNext()) {
exts.add("." + extList.next().toLowerCase().trim());
}
6.61 Get the "root" of an application
exts.remove("");
}
public boolean accept(File dir, String name) {
final Iterator<String> extList = exts.iterator();
while (extList.hasNext()) {
if (name.toLowerCase().endsWith(extList.next())) {
return true;
}
}
return false;
}
}
If multiple extensions are to be checked then a regular expression can be used.
import java.io.File;
import java.io.FilenameFilter;
import java.util.regex.*;
public class Filter implements FilenameFilter {
public boolean accept (File dir, String name) {
return Pattern.matches(".*\\.(jpg|jpeg|gif|png|bmp)", name);
// if only one extension to check : "\\.jpg"
}
public static void main (String args[]) {
if (args.length < 1) {
System.err.println
("usage: java Filter <directory> ex. java Filter c:\\temp");
return;
}
Filter nf = new Filter();
// current directory
File dir = new File (args[0]);
String[] strs = dir.list(nf);
for (int i = 0; i < strs.length; i++) {
System.out.println (strs[i]);
}
}
}
6.63 Get the content of a directory with subdirectories
Current version of this HowTo :
http://www.rgagnon.com/javadetails/../javadetails/java−0056.html
import java.io.*;
import java.util.*;
public class DirUtils {
public static List recurseDir(String dir) {
String result, _result[];
result = recurseInDirFrom(dir);
_result = result.split("\\|");
return Arrays.asList(_result);
}
6.63 Get the content of a directory with subdirectories
private static String recurseInDirFrom(String dirItem) {
File file;
String list[], result;
result = dirItem;
file = new File(dirItem);
if (file.isDirectory()) {
list = file.list();
for (int i = 0; i < list.length; i++)
result = result + "|"
+ recurseInDirFrom(dirItem + File.separatorChar + list[i]);
}
return result;
}
public static void main(String arg[]) {
if (arg.length > 0) {
System.out.println("recursive Dirs from " + arg[0]);
System.out.println(DirUtils.recurseDir(arg[0]));
}
else {
System.out.println("Usage :");
System.out.println(" java DirUtils c:\temp");
}
/*
output: