getMagicCaretPosition()の挙動がおかしい。
英数字を入力している間は正しく返ってくるが、一度IMEを起動して「かな」などを入力したが最後、nullしか返ってこない。
何か手があるのだろうか。(Java6 u21にて確認)
import java.awt.BorderLayout; import javax.swing.JFrame; import javax.swing.JTextArea; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; public class Sample extends JFrame { private JTextArea area; public Sample() { super(); area = new JTextArea(); area.getDocument().addDocumentListener(new DocumentListenerImpl()); setLayout(new BorderLayout()); add(area); setSize(400, 300); setVisible(true); setDefaultCloseOperation(EXIT_ON_CLOSE); } public static void main(String[] args) { Sample sample = new Sample(); sample.setVisible(true); } class DocumentListenerImpl implements DocumentListener { public void changedUpdate(DocumentEvent e) { System.out.println(area.getCaret().getMagicCaretPosition()); } public void insertUpdate(DocumentEvent e) { System.out.println(area.getCaret().getMagicCaretPosition()); } public void removeUpdate(DocumentEvent e) { System.out.println(area.getCaret().getMagicCaretPosition()); } } }
【追記】
id:t_yanoから回答
DefaultCaretのソースをみると、MagicCaretPositionは、キャレット位置が変更されるといったんnullにされ、そのあとinvokeLaterで位置の再設定を行うタスクが登録されてます。よって、位置取得もinvokeLaterにしてEvent Dispatch Threadから取得するようにした。
class DocumentListenerImpl implements DocumentListener { public void changedUpdate(DocumentEvent e) { SwingUtilities.invokeLater(new Runnable() { public void run() { System.out.println(area.getCaret().getMagicCaretPosition()); } }); } public void insertUpdate(DocumentEvent e) { SwingUtilities.invokeLater(new Runnable() { public void run() { System.out.println(area.getCaret().getMagicCaretPosition()); } }); } public void removeUpdate(DocumentEvent e) { SwingUtilities.invokeLater(new Runnable() { public void run() { System.out.println(area.getCaret().getMagicCaretPosition()); } }); } }
thx @t_yano