RFR: 8090267: JFXPanel Input Problem

Andy Goryachev angorya at openjdk.org
Thu Aug 17 20:02:38 UTC 2023


On Tue, 4 Jul 2023 05:54:54 GMT, Prasanta Sadhukhan <psadhukhan at openjdk.org> wrote:

> When Japanse (IME on) is inputted to the TextFIeld, which is on JFXPanel, 
> small window for inputting appears on top-left side of screen
> 
> ![image](https://github.com/openjdk/jfx/assets/43534309/65833d59-528e-4087-9992-9f86b8b8c47f)
> 
> For swing-interop case, WmImeStartComposition starts composition in native ImmSetCompositionWindow window as "m_useNativeCompWindow" below is true for FX
> https://github.com/openjdk/jdk/blob/514816ed7d7dea1fb13d32b80aef89774bee13d3/src/java.desktop/windows/native/libawt/windows/awt_Component.cpp#L3957
> 
> m_useNativeCompWindow is true because during sun.awt.im.InputContext#focusGained() calls activateInputMethod which calls WInputMethod.activate() which calls haveActiveClient() which checks for
> clientComponent.getInputMethodRequests().
> Now, in JFXPanel, getInputMethodRequests() returns null as setEmbeddedScene() is not called yet.
> Since getInputMethodRequests() returns null, haveActiveClient() is false which calls enableNativeIME() with 1 [thereby native composition window is enabled]
> https://github.com/openjdk/jdk/blob/514816ed7d7dea1fb13d32b80aef89774bee13d3/src/java.desktop/windows/classes/sun/awt/windows/WInputMethod.java#L316
> 
> Proposed fix is to ensure there is an active client "initially" so that enableNativeIME() is called with 0 and no native compostion window is shown.
> getInputMethodRequests() is called in setEmbeddedScene() so as to make sure getInputMethodRequest() is initialised to correct "InputMethodSupport.InputMethodRequestsAdapter.fxRequests" object and not NULL.
> 
> AFter fix
> ![image](https://github.com/openjdk/jfx/assets/43534309/ec3d8343-9295-4950-885b-f9983b9b017a)

issue 2:
configure Japanese IME for Hiragana input, such that the following icons are shown in the task bar:

![Screenshot 2023-08-17 125430](https://github.com/openjdk/jfx/assets/107069028/3c0971f9-8fe5-4b86-8332-8330ca25c966)

then launch the test app and type 'a'.

I see two hiragana ああ characters instead of one あ:

![Screenshot 2023-08-17 125206](https://github.com/openjdk/jfx/assets/107069028/52553335-686d-4efa-8833-8b722aa94846)

issue 3: further typing and editing (using BACKSPACE key) results in a series of exceptions:


Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index -1 out of bounds for length 3
	at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:100)
	at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:106)
	at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:302)
	at java.base/java.util.Objects.checkIndex(Objects.java:385)
	at java.base/java.util.ArrayList.get(ArrayList.java:427)
	at javafx.base/com.sun.javafx.collections.ObservableListWrapper.get(ObservableListWrapper.java:88)
	at javafx.base/com.sun.javafx.collections.VetoableListDecorator.get(VetoableListDecorator.java:314)
	at javafx.graphics/javafx.scene.Parent.updateCachedBounds(Parent.java:1705)
	at javafx.graphics/javafx.scene.Parent.recomputeBounds(Parent.java:1649)
	at javafx.graphics/javafx.scene.Parent.doComputeGeomBounds(Parent.java:1502)
	at javafx.graphics/javafx.scene.Parent$1.doComputeGeomBounds(Parent.java:115)
	at javafx.graphics/com.sun.javafx.scene.ParentHelper.computeGeomBoundsImpl(ParentHelper.java:84)
	at javafx.graphics/com.sun.javafx.scene.layout.RegionHelper.superComputeGeomBoundsImpl(RegionHelper.java:78)
	at javafx.graphics/com.sun.javafx.scene.layout.RegionHelper.superComputeGeomBounds(RegionHelper.java:62)
	at javafx.graphics/javafx.scene.layout.Region.doComputeGeomBounds(Region.java:3301)
	at javafx.graphics/javafx.scene.layout.Region$1.doComputeGeomBounds(Region.java:166)
	at javafx.graphics/com.sun.javafx.scene.layout.RegionHelper.computeGeomBoundsImpl(RegionHelper.java:89)
	at javafx.graphics/com.sun.javafx.scene.NodeHelper.computeGeomBounds(NodeHelper.java:117)
	at javafx.graphics/javafx.scene.Node.updateGeomBounds(Node.java:3812)
	at javafx.graphics/javafx.scene.Node.getGeomBounds(Node.java:3774)
	at javafx.graphics/javafx.scene.Node.computeLocalBounds(Node.java:3828)
	at javafx.graphics/javafx.scene.Node.updateLocalBounds(Node.java:3858)
	at javafx.graphics/javafx.scene.Node.getLocalBounds(Node.java:3728)
	at javafx.graphics/javafx.scene.Node.updateTxBounds(Node.java:3876)
	at javafx.graphics/javafx.scene.Node.getTransformedBounds(Node.java:3668)
	at javafx.graphics/javafx.scene.Node$MiscProperties$2.computeBounds(Node.java:6770)
	at javafx.graphics/javafx.scene.Node$LazyBoundsProperty.get(Node.java:9749)
	at javafx.graphics/javafx.scene.Node$LazyBoundsProperty.get(Node.java:1)
	at javafx.graphics/javafx.scene.Node.getBoundsInParent(Node.java:3361)
	at javafx.controls/javafx.scene.control.skin.TextFieldSkin.getCharacterBounds(TextFieldSkin.java:533)
	at javafx.controls/javafx.scene.control.skin.TextInputControlSkin$11.getTextLocation(TextInputControlSkin.java:351)
	at javafx.graphics/javafx.scene.Scene$InputMethodRequestsDelegate.getTextLocation(Scene.java:4169)
	at javafx.swing/javafx.embed.swing.InputMethodSupport$InputMethodRequestsAdapter.getTextLocation(InputMethodSupport.java:61)
	at java.desktop/sun.awt.im.InputMethodContext.getTextLocation(InputMethodContext.java:279)
	at java.desktop/sun.awt.windows.WInputMethod$1.run(WInputMethod.java:616)
	at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:318)
	at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:773)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:720)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:714)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:400)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:87)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:98)
	at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:747)
	at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:745)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:400)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:87)
	at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:744)
	at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index -1 out of bounds for length 4
	at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:100)
	at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:106)
	at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:302)
	at java.base/java.util.Objects.checkIndex(Objects.java:385)
	at java.base/java.util.ArrayList.get(ArrayList.java:427)
	at javafx.base/com.sun.javafx.collections.ObservableListWrapper.get(ObservableListWrapper.java:88)
	at javafx.base/com.sun.javafx.collections.VetoableListDecorator.get(VetoableListDecorator.java:314)
	at javafx.graphics/javafx.scene.Parent.updateCachedBounds(Parent.java:1705)
	at javafx.graphics/javafx.scene.Parent.recomputeBounds(Parent.java:1649)
	at javafx.graphics/javafx.scene.Parent.doComputeGeomBounds(Parent.java:1502)
	at javafx.graphics/javafx.scene.Parent$1.doComputeGeomBounds(Parent.java:115)
	at javafx.graphics/com.sun.javafx.scene.ParentHelper.computeGeomBoundsImpl(ParentHelper.java:84)
	at javafx.graphics/com.sun.javafx.scene.layout.RegionHelper.superComputeGeomBoundsImpl(RegionHelper.java:78)
	at javafx.graphics/com.sun.javafx.scene.layout.RegionHelper.superComputeGeomBounds(RegionHelper.java:62)
	at javafx.graphics/javafx.scene.layout.Region.doComputeGeomBounds(Region.java:3301)
	at javafx.graphics/javafx.scene.layout.Region$1.doComputeGeomBounds(Region.java:166)
	at javafx.graphics/com.sun.javafx.scene.layout.RegionHelper.computeGeomBoundsImpl(RegionHelper.java:89)
	at javafx.graphics/com.sun.javafx.scene.NodeHelper.computeGeomBounds(NodeHelper.java:117)
	at javafx.graphics/javafx.scene.Node.updateGeomBounds(Node.java:3812)
	at javafx.graphics/javafx.scene.Node.getGeomBounds(Node.java:3774)
	at javafx.graphics/javafx.scene.Node.computeLocalBounds(Node.java:3828)
	at javafx.graphics/javafx.scene.Node.updateLocalBounds(Node.java:3858)
	at javafx.graphics/javafx.scene.Node.getLocalBounds(Node.java:3728)
	at javafx.graphics/javafx.scene.Node.updateTxBounds(Node.java:3876)
	at javafx.graphics/javafx.scene.Node.getTransformedBounds(Node.java:3668)
	at javafx.graphics/javafx.scene.Node$MiscProperties$2.computeBounds(Node.java:6770)
	at javafx.graphics/javafx.scene.Node$LazyBoundsProperty.get(Node.java:9749)
	at javafx.graphics/javafx.scene.Node$LazyBoundsProperty.get(Node.java:1)
	at javafx.graphics/javafx.scene.Node.getBoundsInParent(Node.java:3361)
	at javafx.controls/javafx.scene.control.skin.TextFieldSkin.getCharacterBounds(TextFieldSkin.java:533)
	at javafx.controls/javafx.scene.control.skin.TextInputControlSkin$11.getTextLocation(TextInputControlSkin.java:351)
	at javafx.graphics/javafx.scene.Scene$InputMethodRequestsDelegate.getTextLocation(Scene.java:4169)
	at javafx.swing/javafx.embed.swing.InputMethodSupport$InputMethodRequestsAdapter.getTextLocation(InputMethodSupport.java:61)
	at java.desktop/sun.awt.im.InputMethodContext.getTextLocation(InputMethodContext.java:279)
	at java.desktop/sun.awt.windows.WInputMethod$1.run(WInputMethod.java:616)
	at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:318)
	at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:773)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:720)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:714)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:400)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:87)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:98)
	at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:747)
	at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:745)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:400)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:87)
	at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:744)
	at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
Exception in thread "JavaFX Application Thread" java.lang.IndexOutOfBoundsException: Index -1 out of bounds for length 4
	at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:100)
	at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:106)
	at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:302)
	at java.base/java.util.Objects.checkIndex(Objects.java:385)
	at java.base/java.util.ArrayList.get(ArrayList.java:427)
	at javafx.base/com.sun.javafx.collections.ObservableListWrapper.get(ObservableListWrapper.java:88)
	at javafx.base/com.sun.javafx.collections.VetoableListDecorator.get(VetoableListDecorator.java:314)
	at javafx.graphics/javafx.scene.Parent.updateCachedBounds(Parent.java:1705)
	at javafx.graphics/javafx.scene.Parent.recomputeBounds(Parent.java:1649)
	at javafx.graphics/javafx.scene.Parent.doComputeGeomBounds(Parent.java:1502)
	at javafx.graphics/javafx.scene.Parent$1.doComputeGeomBounds(Parent.java:115)
	at javafx.graphics/com.sun.javafx.scene.ParentHelper.computeGeomBoundsImpl(ParentHelper.java:84)
	at javafx.graphics/com.sun.javafx.scene.layout.RegionHelper.superComputeGeomBoundsImpl(RegionHelper.java:78)
	at javafx.graphics/com.sun.javafx.scene.layout.RegionHelper.superComputeGeomBounds(RegionHelper.java:62)
	at javafx.graphics/javafx.scene.layout.Region.doComputeGeomBounds(Region.java:3301)
	at javafx.graphics/javafx.scene.layout.Region$1.doComputeGeomBounds(Region.java:166)
	at javafx.graphics/com.sun.javafx.scene.layout.RegionHelper.computeGeomBoundsImpl(RegionHelper.java:89)
	at javafx.graphics/com.sun.javafx.scene.NodeHelper.computeGeomBounds(NodeHelper.java:117)
	at javafx.graphics/javafx.scene.Node.updateGeomBounds(Node.java:3812)
	at javafx.graphics/javafx.scene.Node.getGeomBounds(Node.java:3774)
	at javafx.graphics/javafx.scene.Node.computeLocalBounds(Node.java:3828)
	at javafx.graphics/javafx.scene.Node.updateLocalBounds(Node.java:3858)
	at javafx.graphics/javafx.scene.Node.getLocalBounds(Node.java:3728)
	at javafx.graphics/javafx.scene.Node.updateTxBounds(Node.java:3876)
	at javafx.graphics/javafx.scene.Node.getTransformedBounds(Node.java:3668)
	at javafx.graphics/javafx.scene.Node.updateBounds(Node.java:776)
	at javafx.graphics/javafx.scene.Parent.updateBounds(Parent.java:1836)
	at javafx.graphics/javafx.scene.Parent.updateBounds(Parent.java:1834)
	at javafx.graphics/javafx.scene.Parent.updateBounds(Parent.java:1834)
	at javafx.graphics/javafx.scene.Scene$ScenePulseListener.pulse(Scene.java:2615)
	at javafx.graphics/com.sun.javafx.tk.Toolkit.lambda$2(Toolkit.java:401)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:400)
	at javafx.graphics/com.sun.javafx.tk.Toolkit.runPulse(Toolkit.java:400)
	at javafx.graphics/com.sun.javafx.tk.Toolkit.firePulse(Toolkit.java:430)
	at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:592)
	at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:572)
	at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.pulseFromQueue(QuantumToolkit.java:565)
	at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.lambda$11(QuantumToolkit.java:352)
	at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
	at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
	at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$4(WinApplication.java:185)
	at java.base/java.lang.Thread.run(Thread.java:1623)
Exception in thread "JavaFX Application Thread" java.lang.IndexOutOfBoundsException: Index -1 out of bounds for length 4
	at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:100)
	at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:106)
	at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:302)
	at java.base/java.util.Objects.checkIndex(Objects.java:385)
	at java.base/java.util.ArrayList.get(ArrayList.java:427)
	at javafx.base/com.sun.javafx.collections.ObservableListWrapper.get(ObservableListWrapper.java:88)
	at javafx.base/com.sun.javafx.collections.VetoableListDecorator.get(VetoableListDecorator.java:314)
	at javafx.graphics/javafx.scene.Parent.updateCachedBounds(Parent.java:1705)
	at javafx.graphics/javafx.scene.Parent.recomputeBounds(Parent.java:1649)
	at javafx.graphics/javafx.scene.Parent.doComputeGeomBounds(Parent.java:1502)
	at javafx.graphics/javafx.scene.Parent$1.doComputeGeomBounds(Parent.java:115)
	at javafx.graphics/com.sun.javafx.scene.ParentHelper.computeGeomBoundsImpl(ParentHelper.java:84)
	at javafx.graphics/com.sun.javafx.scene.layout.RegionHelper.superComputeGeomBoundsImpl(RegionHelper.java:78)
	at javafx.graphics/com.sun.javafx.scene.layout.RegionHelper.superComputeGeomBounds(RegionHelper.java:62)
	at javafx.graphics/javafx.scene.layout.Region.doComputeGeomBounds(Region.java:3301)
	at javafx.graphics/javafx.scene.layout.Region$1.doComputeGeomBounds(Region.java:166)
	at javafx.graphics/com.sun.javafx.scene.layout.RegionHelper.computeGeomBoundsImpl(RegionHelper.java:89)
	at javafx.graphics/com.sun.javafx.scene.NodeHelper.computeGeomBounds(NodeHelper.java:117)
	at javafx.graphics/javafx.scene.Node.updateGeomBounds(Node.java:3812)
	at javafx.graphics/javafx.scene.Node.getGeomBounds(Node.java:3774)
	at javafx.graphics/javafx.scene.Node.computeLocalBounds(Node.java:3828)
	at javafx.graphics/javafx.scene.Node.updateLocalBounds(Node.java:3858)
	at javafx.graphics/javafx.scene.Node.getLocalBounds(Node.java:3728)
	at javafx.graphics/javafx.scene.Node.updateTxBounds(Node.java:3876)
	at javafx.graphics/javafx.scene.Node.getTransformedBounds(Node.java:3668)
	at javafx.graphics/javafx.scene.Node.updateBounds(Node.java:776)
	at javafx.graphics/javafx.scene.Parent.updateBounds(Parent.java:1836)
	at javafx.graphics/javafx.scene.Parent.updateBounds(Parent.java:1834)
	at javafx.graphics/javafx.scene.Parent.updateBounds(Parent.java:1834)
	at javafx.graphics/javafx.scene.Scene$ScenePulseListener.pulse(Scene.java:2615)
	at javafx.graphics/com.sun.javafx.tk.Toolkit.lambda$2(Toolkit.java:401)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:400)
	at javafx.graphics/com.sun.javafx.tk.Toolkit.runPulse(Toolkit.java:400)
	at javafx.graphics/com.sun.javafx.tk.Toolkit.firePulse(Toolkit.java:430)
	at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:592)
	at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:572)
	at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.pulseFromQueue(QuantumToolkit.java:565)
	at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.lambda$11(QuantumToolkit.java:352)
	at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
	at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
	at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$4(WinApplication.java:185)
	at java.base/java.lang.Thread.run(Thread.java:1623)

The good new is that the IME box appears at the right spot :-)

-------------

PR Comment: https://git.openjdk.org/jfx/pull/1169#issuecomment-1682892243
PR Comment: https://git.openjdk.org/jfx/pull/1169#issuecomment-1682894629
PR Comment: https://git.openjdk.org/jfx/pull/1169#issuecomment-1682895935


More information about the openjfx-dev mailing list