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

Anthony Petrov anthony.petrov at oracle.com
Fri Feb 17 04:01:20 PST 2012


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?
>>>>
>>>
>>
>>
> 
> 



More information about the awt-dev mailing list