<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