【发布时间】:2015-02-26 10:06:13
【问题描述】:
我有一个Settings 类,它应该提供用于检索设置并将它们保存到文件的接口。我的设置应该在我更改输入值时更新(而不是在单击保存按钮之后)。这就是为什么我将此方法添加到Settings 类:
/** Automatically update setting value as user types.
* @param setting_name What is the name of associated setting?
* @param input JTextComponent (like JTextField) to listen on for events
*/
public void listenOnInput(final String setting_name, final JTextComponent input) {
//Debug output
System.out.println("Settings[\""+setting_name+"\"] automatically updates on input change.");
input.addInputMethodListener(new InputMethodListener() {
@Override
public void inputMethodTextChanged(InputMethodEvent event) {
//Set setting to current value
setSetting(setting_name, input.getText());
}
//This method is dummy, I see no use for it
@Override
public void caretPositionChanged(InputMethodEvent event) {}
});
}
这可能不是完美的设计,但我的应用程序永远不会有复杂的设置,因此我不会在这项任务上投入太多精力。我是这样使用的:
JTextField name = new JTextField();
Settings settings = new Settings();
name.setToolTipText("Enter your name");
contentPane.add(name);
settings.listenOnInput("user_name", name);
我的问题是上面的代码不起作用 - 我可以输入或按 Enter 但永远不会调用 inputMethodTextChanged。
那么获取更新值的正确方法是什么?
【问题讨论】:
-
我不相信
JTextField支持InputMethodListener,你应该考虑使用DocumentListener或InputVerifer或FocusListener -
但是
JTextField或JTextComponent中的方法都不支持这个监听器。 -
JTextField#getDocument,见Implementing a Document Filter -
你在用什么IME?
InputMethodListener在我输入日文字符时效果很好。 -
@aterai 我只是输入 - 我预计这应该会触发那个似乎不是真的事件。
标签: java swing events jtextfield jtextcomponent