4444import sun .awt .AWTAccessor ;
4545import sun .awt .AWTAccessor .ComponentAccessor ;
4646import sun .awt .im .InputMethodAdapter ;
47+ import sun .java2d .Disposer ;
48+ import sun .java2d .DisposerRecord ;
4749
4850final class WInputMethod extends InputMethodAdapter
4951{
@@ -124,6 +126,8 @@ final class WInputMethod extends InputMethodAdapter
124126 public WInputMethod ()
125127 {
126128 context = createNativeContext ();
129+ disposerRecord = new ContextDisposerRecord (context );
130+ Disposer .addRecord (this , disposerRecord );
127131 cmode = getConversionStatus (context );
128132 open = getOpenStatus (context );
129133 currentLocale = getNativeLocale ();
@@ -132,16 +136,23 @@ public WInputMethod()
132136 }
133137 }
134138
135- @ Override
136- @ SuppressWarnings ("removal" )
137- protected void finalize () throws Throwable
138- {
139- // Release the resources used by the native input context.
140- if (context !=0 ) {
141- destroyNativeContext (context );
142- context =0 ;
139+ private final ContextDisposerRecord disposerRecord ;
140+
141+ private static final class ContextDisposerRecord implements DisposerRecord {
142+
143+ private final int context ;
144+ private volatile boolean disposed ;
145+
146+ ContextDisposerRecord (int c ) {
147+ context = c ;
148+ }
149+
150+ public synchronized void dispose () {
151+ if (!disposed ) {
152+ destroyNativeContext (context );
153+ }
154+ disposed = true ;
143155 }
144- super .finalize ();
145156 }
146157
147158 @ Override
@@ -151,9 +162,7 @@ public synchronized void setInputMethodContext(InputMethodContext context) {
151162
152163 @ Override
153164 public void dispose () {
154- // Due to a memory management problem in Windows 98, we should retain
155- // the native input context until this object is finalized. So do
156- // nothing here.
165+ disposerRecord .dispose ();
157166 }
158167
159168 /**
@@ -448,6 +457,7 @@ public void hideWindows() {
448457 @ Override
449458 public void removeNotify () {
450459 endCompositionNative (context , DISCARD_INPUT );
460+ disableNativeIME (awtFocussedComponentPeer );
451461 awtFocussedComponent = null ;
452462 awtFocussedComponentPeer = null ;
453463 }
@@ -658,8 +668,8 @@ private WComponentPeer getNearestNativePeer(Component comp)
658668
659669 }
660670
661- private native int createNativeContext ();
662- private native void destroyNativeContext (int context );
671+ private static native int createNativeContext ();
672+ private static native void destroyNativeContext (int context );
663673 private native void enableNativeIME (WComponentPeer peer , int context , boolean useNativeCompWindow );
664674 private native void disableNativeIME (WComponentPeer peer );
665675 private native void handleNativeIMEEvent (WComponentPeer peer , AWTEvent e );
0 commit comments