java - 事件的优先级

标签 java swing events

这是我的 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/

相关文章:

javascript - 处理 Socket.io 事件的最佳实践?

java - 内部异常: com. mysql.jdbc.exceptions.MySQLSyntaxErrorException: 'name'中的未知列 'field list'

java - 后台线程安卓

java - 将字符串从 Activity 传递到库类

Java JTable 显示数据库记录

java - 是否有用于处理 swing 应用程序中的数据库请求的框架?

events - 在 Meteor 中从服务器向客户端发送事件

java - 将数组输出格式化为 9x9 框

Java Swing 将变量分配给 URL

android - Motionevent.getX 和 getY