Updated 2003-01-07 13:16:44

Here is a little hack to let you treat Java Hashtables (mostly) like Tcl Arrays *using TclBlend or Jacl -- Todd Coram
 package require java

 proc tcljava_hashtable {arrayname javaHashTable} {
    upvar $arrayname arr
    java::lock $javaHashTable
    for {set e [$javaHashTable keys]} {[$e hasMoreElements]} {} {
	set key [$e nextElement]
	if {[java::instanceof $key String]} {
	    # Convienence, convert it to a Tcl String...
	    set key [$key toString]
	}
	set value [$javaHashTable get $key]
	if {[java::instanceof $value String]} {
	    # Convienence, convert it to a Tcl String...
	    set value [$value toString]
	}
	set arr($key) $value
    }
    trace variable arr uwr [list traceHashArray $javaHashTable]
 }

 proc traceHashArray {hash name index op} {
    upvar $name arr
    switch -- $op {
	w {
	    $hash put $index $arr($index)
	}
	r {
	    set value [$hash get $index]
	    if {[java::instanceof $value String]} {
		set value [$value toString]
	    }
	    set arr($index) $value
	}
	u {
	    java::unlock $hash
	}
    }
 }

You can use it on newly created hashtables or existing ones. It also works with any subclass of Hashtable:
 # Associate the array 'props' with the Java System Properties.
 #
 tcljava_hashtable props [java::call System getProperties]

 # Show all of the Java system property keys.
 puts [array names props]

 # Add a property (in a Tclish manner)
 #
 set props(Hacker) "Todd Coram"
 puts $props(Hacker)

 # Make sure Java sees it.
 #
 puts [java::call System getProperty Hacker]

TclJava Tricks

Category Java