- PR -

jdk1.6でJTextFieldのIME制御が上手く行われません。

1
投稿者投稿内容
未記入
会議室デビュー日: 2008/01/15
投稿数: 11
投稿日時: 2008-01-28 16:39
お世話様になります。
質問させていただきます。

現在、windows,jdk1.4環境で、JTextFieldに対し下記のIME制御を行っています。

・直接入力のみさせたいテキストフィールドには、
  focusGainedのイベント処理にてenableinputmethods(false)を行い、
  インプットメソッドサポートを使用不可状態(直接入力)にしています。

しかし、jdk1.4からjdk1.6へ環境を変えたところ(ソースは変更無し)、
以下のような問題が発生しました。

・1回目のfocusFainedで、enableinputmethods(false)を実行しているにも関わらず
  インプットメソッドサポートが使用可能状態?となってしまう。
   (正確には、IMEの入力モードを「ひらがな」等に変更でき、入力できる。
     ただし、入力途中の文字・確定した文字は画面表示されない。)
・2回目以降のフォーカスインではIME制御が期待通りに行われている。
   (常に直接入力状態となっている)。

この問題について何かご存知の方がいらっしゃいましたら、
教えていただけますでしょうか。
よろしくお願い致します。
ranco
大ベテラン
会議室デビュー日: 2007/11/02
投稿数: 112
投稿日時: 2008-01-28 20:05
FocusEventには2状態(2ステート)あるから、問題の現象を再現できる小さなプログラムを投稿してみてください。現状では、何をどこでどうしてどうなっているのかということが、皆目見えません。

それと、やっぱこれは、イベントリスナのなかでこちょこちょ毎回呼ぶべきメソッドではなく、コンポーネントの初期化コンフィギュレーションの一環として(たぶんコンストラクタの中で)、がつんと呼んでおくべきものでしょう。setEditable()等々と並んで…。そうすると、イベントのステートなどに結果を左右されなくなります。enableInputMethods()メソッドを、いちいちイベントリスナの中で毎回呼ばなければならない、絶対的な理由はありますか?


[ メッセージ編集済み 編集者: ranco 編集日時 2008-01-28 20:14 ]
未記入
会議室デビュー日: 2008/01/15
投稿数: 11
投稿日時: 2008-01-29 10:41
返信、ありがとうございます。
以下が現象が起きるソースです。
jTextField2にフォーカスが遷移したら、enableinputmethods(false)を行い
インプットメソッドサポートを使用不可にしています。

****テストアプリケーション********************************
package cmncomponenttest;

import java.awt.Toolkit;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import java.awt.Dimension;

public class testApri {

/**
* アプリケーションの構築と表示。
*/
public testApri() {
Frame1 frame = new Frame1();
frame.validate();

// ウィンドウを中央に配置
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
Dimension frameSize = frame.getSize();
if (frameSize.height > screenSize.height) {
frameSize.height = screenSize.height;
}
if (frameSize.width > screenSize.width) {
frameSize.width = screenSize.width;
}
frame.setLocation((screenSize.width - frameSize.width) / 2,
(screenSize.height - frameSize.height) / 2);
frame.setVisible(true);
}

/**
* アプリケーションエントリポイント。
*
* @param args String[]
*/
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
try {
UIManager.setLookAndFeel(UIManager.
getSystemLookAndFeelClassName());
} catch (Exception exception) {
exception.printStackTrace();
}
new testApri();
}
});
}
}
**********************************************************
****フレーム**************************************************
import java.awt.*;
import javax.swing.*;
import java.awt.Rectangle;
import java.awt.event.FocusEvent;
import java.awt.event.FocusAdapter;
import java.awt.im.InputSubset;

public class Frame1 extends JFrame {
//IME制御無しテキストフィールド
JTextField jTextField1 = new JTextField();
//直接入力用テキストフィールド
JTextField jTextField2 = new JTextField();
public Frame1() {
try {
jbInit();
} catch (Exception exception) {
exception.printStackTrace();
}
}

private void jbInit() throws Exception {
getContentPane().setLayout(null);

jTextField1.setText("jTextField1");
jTextField1.setBounds(new Rectangle(42, 34, 201, 36));


jTextField2.setText("jTextField2");
jTextField2.setBounds(new Rectangle(43, 102, 200, 37));
jTextField2.addFocusListener(new Frame1_jTextField2_focusAdapter(this));

this.getContentPane().add(jTextField1);
this.getContentPane().add(jTextField2);
}

public void jTextField2_focusGained(FocusEvent e) {
jTextField2.enableInputMethods(false);
}
}


class Frame1_jTextField2_focusAdapter extends FocusAdapter {
private Frame1 adaptee;
Frame1_jTextField2_focusAdapter(Frame1 adaptee) {
this.adaptee = adaptee;
}

public void focusGained(FocusEvent e) {
adaptee.jTextField2_focusGained(e);
}
}

**********************************************************


>>enableInputMethods()メソッドを、いちいちイベントリスナの中で毎回呼ばなければならない、絶対的な理由はありますか?

特に絶対的な理由はありません。
コンストラクタ等で呼ぶようにしてみます。
ranco
大ベテラン
会議室デビュー日: 2007/11/02
投稿数: 112
投稿日時: 2008-01-29 12:21
早速、ご投稿のコードを動かしてみました。
Linux/GNOME/ATOK for Linuxでは、ご指摘の問題は生じません。
Win上では、試していません。
java version "1.6.0_02"
Java(TM) SE Runtime Environment (build 1.6.0_02-b05)
Java HotSpot(TM) Client VM (build 1.6.0_02-b05, mixed mode, sharing)

でもやはり、イベントリスナの中で呼ぶ理由はまったくありませんね。イベントでトリガされるべき処理ではないから…。

----[追記]
WinXP/ATOKでも、ご指摘の問題は生じません。


[ メッセージ編集済み 編集者: ranco 編集日時 2008-01-29 16:16 ]
未記入
会議室デビュー日: 2008/01/15
投稿数: 11
投稿日時: 2008-01-29 13:05
早速動かしていただき、ありがとうございました。
Linux上では問題が起きないのですね・・・

rancoさんの意見を参考に、
私のほうでも、focusGainで行っていたenableInputMethods(false)を
jtextFieldインスタンス生成後に行わせてみたところ、
期待値通りにIMEの制御を行うことが出来ました。
windows環境で、focusGainで行うと問題が発生するのでしょうか・・・

なんだか腑に落ちませんが、
とりあえず問題点を解決することができました。
貴重なご意見、誠にありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)