<AWT Dev> enableInputMethod(false) does not work in the TextArea and TextField on the linux platform

Charles Lee littlee at linux.vnet.ibm.com
Mon Feb 20 00:44:14 PST 2012


Hi Anthony,

That's great. Thank you very much :-)

On 02/17/2012 08:01 PM, Anthony Petrov wrote:
> Hi Charles,
>
> The latest fix looks reasonable. Basically, by removing the 
> enableInputMethod(true) call from peers' constructors we ensure we 
> don't override the enable/disable state set by user code.
>
> I've filed a CR: http://bugs.sun.com/view_bug.do?bug_id=7146572
>
> Let's wait a couple more days in case anyone else wants to comment on 
> this fix. If no further comments come, I'll push the fix next week.
>
> Thanks for the contribution!
>
> -- 
> best regards,
> Anthony
>
> On 2/13/2012 12:16 PM, Charles Lee wrote:
>> Hi guys,
>>
>> Here, I want propose a even easier patch to fix this issue. Please 
>> check here: http://cr.openjdk.java.net/~littlee/OJDK-124/webrev.01/ 
>> <http://cr.openjdk.java.net/%7Elittlee/OJDK-124/webrev.01/>
>>
>> The patch is mainly about remove enableInputMethod in two places in 
>> XTextAreaPeer and XTextFieldPeer.
>>
>> If it does the right thing, would anyone help to review the patch?
>>
>> On 02/09/2012 02:18 PM, Charles Lee wrote:
>>> Hi Anthony,
>>>
>>> Thank you for your review. I have changed the test case a little, 
>>> which will include a button to change the input method enable[1]. Is 
>>> it the dynamic thing in your mind?
>>>
>>> This test case can work well on my original patch, but I found 
>>> something interesting:
>>> Enable or disable jtext/xtext input method will have nothing to do 
>>> with input method. Only enableInputMethod of target has influence. I 
>>> was doing some code reading about this and find that (Please correct 
>>> me if wrong) :
>>> 1. jtext/xtext process InputMethodEvent from 
>>> XComponentPeer.handleEvent, and eventually goes to 
>>> Component.processInputMethodEvent and 
>>> JTextComponent.processInputMethodEvent. There are no route for input 
>>> method enable check.
>>> 2. So when input method is enabled in TextArea/TextField, jtext 
>>> should be work well.
>>> 3. And when input method is disabled by enableInputMethod(false), 
>>> input context will be removed from notification, and there will be 
>>> no more InputMethodEvent put into queue. So peer.handleEvent will 
>>> never be invoked since e is KeyEvent in the dispatchEventImpl method 
>>> of Component.
>>>
>>> So I conclude that set enable input method of jtext/xtext will have 
>>> no effect and my original patch can be reduced a very simple one. 
>>> Just remove the target.enableInputMethod(true) in both 
>>> XTextFieldPeer and XTextAreaPeer.
>>>
>>>
>>> P.S. Why there is a jtext(JTextArea) in the XTextAreaPeer? I am 
>>> missing some history here :-)
>>>
>>>
>>>
>>> [1]
>>> public class MyAWTTest extends JFrame {
>>>     private final TextArea ta;
>>>     private final TextField tf;
>>>     private final AtomicBoolean flag;
>>>
>>>     public MyAWTTest() {
>>>     super("Single Frame --- AWT Frame");
>>>
>>>     setLayout(new FlowLayout());
>>>
>>>     ta = new TextArea("TextArea component(No IM)");
>>>     ta.enableInputMethods(false);
>>>     ta.setPreferredSize(new Dimension(400, 100));
>>>     add(ta);
>>>
>>>     tf = new TextField("TextField component(No IM)", 52);
>>>     tf.enableInputMethods(false);
>>>     add(tf);
>>>
>>>     flag = new AtomicBoolean(false);
>>>
>>>     Button button = new Button("Click me, change the world");
>>>     add(button);
>>>
>>>     button.addActionListener(new ActionListener() {
>>>         @Override
>>>         public void actionPerformed(ActionEvent e) {
>>>         if (!flag.get()) {
>>>             ta.setText("TextArea component");
>>>             tf.setText("TextField component");
>>>
>>>             ta.enableInputMethods(true);
>>>             tf.enableInputMethods(true);
>>>
>>>             flag.set(true);
>>>         } else {
>>>             ta.setText("TextArea component (NO IM)");
>>>             tf.setText("TextField component (NO IM)");
>>>
>>>             ta.enableInputMethods(false);
>>>             tf.enableInputMethods(false);
>>>
>>>             flag.set(false);
>>>         }
>>>         }
>>>
>>>     });
>>>
>>>     setSize(850, 360);
>>>     setVisible(true);
>>>
>>>     setDefaultCloseOperation(EXIT_ON_CLOSE);
>>>     }
>>>
>>>     public static void main(String[] args) {
>>>     SwingUtilities.invokeLater(new Runnable() {
>>>         public void run() {
>>>         new MyAWTTest();
>>>         }
>>>     });
>>>
>>>     }
>>> }
>>>
>>> On 02/07/2012 07:29 PM, Anthony Petrov wrote:
>>>> Hi Charles,
>>>>
>>>> The general idea of the fix is OK and the fix looks fine to me.
>>>>
>>>> However, there's still a problem if an app enables or disables 
>>>> Input Methods dynamically during the app's execution. The updated 
>>>> status of the property needs to be propagated to the jtext or xtext 
>>>> somehow.
>>>>
>>>> -- 
>>>> best regards,
>>>> Anthony
>>>>
>>>> On 2/7/2012 1:17 PM, Charles Lee wrote:
>>>>> Hi guys,
>>>>>
>>>>> Given a simple test case below[1], enableInputMethod(false) does 
>>>>> not work. We can always invoke input method.
>>>>> [1]
>>>>> public class MyAWTTest extends JFrame {
>>>>>     Component c;
>>>>>
>>>>>     public MyAWTTest() {
>>>>>     super("Single Frame --- AWT Frame");
>>>>>
>>>>>     setLayout(new FlowLayout());
>>>>>
>>>>>     c = new TextArea("TextArea component(No IM)");
>>>>>     c.enableInputMethods(false);
>>>>>     c.setPreferredSize(new Dimension(400, 100));
>>>>>     add(c);
>>>>>
>>>>>     c = new TextField("TextField component(No IM)", 52);
>>>>>     c.enableInputMethods(false);
>>>>>     add(c);
>>>>>
>>>>>     setSize(850, 360);
>>>>>     setVisible(true);
>>>>>
>>>>>     setDefaultCloseOperation(EXIT_ON_CLOSE);
>>>>>     }
>>>>>
>>>>>     public static void main(String[] args) {
>>>>>     SwingUtilities.invokeLater(new Runnable() {
>>>>>         public void run() {
>>>>>         new MyAWTTest();
>>>>>         }
>>>>>     });
>>>>>
>>>>>     }
>>>>> }
>>>>>
>>>>> Patch @ http://cr.openjdk.java.net/~littlee/OJDK-124/webrev.00/ 
>>>>> <http://cr.openjdk.java.net/%7Elittlee/OJDK-124/webrev.00/>
>>>>>
>>>>> The patch is mainly about:
>>>>> 1. Add a new method in the ComponentAccessor which help to escape 
>>>>> the package restraints. Please check the changes in Component and 
>>>>> AWTAccessor.
>>>>> 2. Remove the enableInputMethod(true) in the XTextAreaPeer and 
>>>>> XTextFieldPeer and use areInputMethodEnabled to set jtext 
>>>>> correctly. Please check the changes in XTextAreaPeer and 
>>>>> XTextFieldPeer.
>>>>>
>>>>> I know it may not be a beautiful fix, but anyone interests in it?
>>>>>
>>>>
>>>
>>>
>>
>>
>


-- 
Yours Charles




More information about the awt-dev mailing list