まあ、ちょっとこんなコードを書いたと思ってください。(はてなの仕様上インデントされてません)
import java.awt.*; import java.awt.event.*; import javax.swing.*; class Swing_Test1 extends JFrame{ private JTextField inputField = new JTextField(20); private JLabel testLabel = new JLabel(); { setLayout(new FlowLayout()); inputField.addKeyListener(new keyListener()); add(inputField); add(testLabel); testLabel.setText(String.valueOf(inputField.getText().length())); } public void windowClosing(WindowEvent e) { System.exit(0); } class keyListener extends KeyAdapter{ public void keyReleased(KeyEvent e){ testLabel.setText(String.valueOf(inputField.getText().length())); } } public static void main(String [] args){ Swing_Test1 f = new Swing_Test1(); f.setTitle("JFrameTest"); f.setSize(300, 100); f.setVisible(true); } }
これはつまりこういう風なウィンドウを出すモノなんです。入力域(JTextField)に文字が入力されると、その入力された文字数が表示されるという。
で、これの動きがですね・・・と、その前に、これをAWTで動かした時(リスト中の「J」を取ったヤツねw)の挙動をまずご紹介しましょう。
Windows
IM-OFF時:1文字入力する度に文字数が表示される
IM-ON時:文字入力→変換確定のEnterで文字数が表示される
Mac
IM-OFF時:1文字入力する度に文字数が表示される
IM-ON時:文字入力で文字数が表示され、勝手に確定する。つまりIM入力状態がキャンセルされる。(漢字変換ができない)*1
ね、この時点であんまりでしょう。
じゃあ今回のSwingではどうなるかと言うと、
Windows
IM-OFF時:1文字入力する度に文字数が表示される
IM-ON時:1文字入力する度に文字数が表示され、変換確定のEnterで文字数が再表示される
Mac
IM-OFF時:1文字入力する度に文字数が表示される
IM-ON時:文字入力しても変換確定しても文字数が表示されない
と、Windowsでは理想的な動作をする一方で、Macの方では輪をかけて酷い結果に。
MacでIM働かせると、AWTでは敏感すぎて(?)、Swingでは鈍すぎるんです。どの位鈍いかと言うと、IMでの文字入力、及び変換確定のReturnではKeyReleasedが発生しないって位鈍いorz
ひょっとしてAppleって日本語環境でのJavaのテストしてない?それともこれは何か回避方法があるんでしょうかね?
*1:KeyReleasedに処理を入れ込むとおかしくなるみたい