只是为了好玩,穷人使用InputVerifier实现的单向绑定:请注意,在传输焦点之前,inputVerifier保证被访问(并且似乎在当前版本的jdk中工作 - 在旧版本中有一些问题
的验证和一些粗俗的数据对象:
/**
* Very simple uni-directional binding (component --> data) class.
*/
public static class BindingVerifier extends InputVerifier {
private RawData data;
private boolean first;
public BindingVerifier(RawData data, boolean first) {
this.data = data;
this.first = first;
}
@Override
public boolean shouldYieldFocus(JComponent input) {
String text = ((JTextComponent) input).getText();
if (first) {
data.one = text;
} else {
data.two = text;
}
return true;
}
@Override
public boolean verify(JComponent input) {
return true;
}
}
public static class RawData {
String one;
String two;
public RawData(String one, String two) {
this.one = one;
this.two = two;
}
public String toString() {
return one + "/" + two;
}
}
用法:
作为重点转移参与提交操作的),所以做任何更新的验证应该是安全的,只要
final RawData data = new RawData(null, null);
JTextField first = new JTextField(20);
first.setInputVerifier(new BindingVerifier(data, true));
JTextField second = new JTextField(20);
second.setInputVerifier(new BindingVerifier(data, false));
Action commit = new AbstractAction("commit") {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(data);
}
};
JComponent form = new JPanel();
form.add(first);
form.add(second);
form.add(new JButton(commit));
什么是'FocusOut'?我从未听说过这件事。 – camickr 2013-04-10 15:39:13
最近的QA显示[穷人的表单验证](http://stackoverflow.com/a/14041811/203657) - 对于更多的演化控制考虑使用像f.i这样的验证框架。 JGoodies数据。不是我每天仔细阅读;-)只是注意到你的问题是关于控制绑定与验证:将提交操作包装到SwingUtilities.invokeLater应该保证在提交之前首先实际将字段值传递给数据类。 – kleopatra 2013-04-10 15:48:49