这是我的 Swing 问题:
想象一下具有一个文本字段和一个按钮的框架。在这一帧的后面是一个具有一个字段的数据类。
- 文本字段具有 FocusListener,它使用 FocusOut 上文本字段中的值更新数据类字段
- 按钮有 ActionListener,它在单击时将数据类发送到服务器
如果我修改文本字段中的值并立即单击按钮,有时会将具有旧值的数据类发送到服务器。在我看来,不能保证文本字段的 FocusOut 事件将在按钮的 ActionPerformed 事件之前处理。如果是这样,有什么方法可以保证它的安全吗?我的意思是一些干净的方式,如果没有必要,我不想把它弄脏。
最佳答案
只是为了好玩,一个穷人的单向绑定(bind)用InputVerifier实现:请注意,保证在转移焦点之前访问inputVerifier(并且似乎在当前版本的jdk中工作 - 在旧版本中存在一些问题),因此只要提交操作涉及焦点转移,在 validator 中进行任何更新都应该是安全的:
验证者和一些原始数据对象:
/**
* 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));
关于java - 事件的优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15926584/