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

Charles Lee littlee at linux.vnet.ibm.com
Wed Feb 8 22:18:48 PST 2012


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