2013-04-10 107 views
0

这是我的问题与摆动:
想象与一个文本框和一个按钮的框架。在这个框架后面有一个字段的数据类。
事件的优先级

  • 文本字段具有的FocusListener其对事件的内容与价值更新文本字段数据类字段
  • 按钮具有的ActionListener将数据发送级服务器上点击

,如果我在文本框,然后点击修改值按钮,有时将旧值的数据类发送到服务器。在我看来,不能保证在按钮的ActionPerformed事件之前处理文本字段的FocusOut事件。如果是这样,有什么方法可以保护它?我的意思是一些干净的方式,如果不是必要的话,我不想全部弄脏它。

+0

什么是'FocusOut'?我从未听说过这件事。 – camickr 2013-04-10 15:39:13

+0

最近的QA显示[穷人的表单验证](http://stackoverflow.com/a/14041811/203657) - 对于更多的演化控制考虑使用像f.i这样的验证框架。 JGoodies数据。不是我每天仔细阅读;-)只是注意到你的问题是关于控制绑定与验证:将提交操作包装到SwingUtilities.invokeLater应该保证在提交之前首先实际将字段值传递给数据类。 – kleopatra 2013-04-10 15:48:49

回答

1

的错误订单,如果我在文本字段修改值,然后单击该按钮向右走,数据类旧值有时发送到服务器。在我看来,不能保证在按钮的ActionPerformed事件之前处理文本字段的FocusOut事件。如果是这样,有什么方法可以保护它?

设计形式不同。那就是当你点击按钮时,ActionListener应该调用窗体上所有文本字段上的getText()方法。

+0

谢谢 – 2013-05-21 07:45:56

1

你可以这样做。我只是给一个伪代码。

private boolean check = false; 

txtField FocusOutMethod { 
check = true; 
} 

button ActionPerformedMethod(){ 

if(check){ 

     place your code that you want to execute in button click. 

     check = false; 
} 
} 

通过这个actionPerformed方法将只运行事件的内容方法的执行后,你的代码。

+0

没有冒犯的意思,但这正是我的意思,我不想肮脏它:)我也有一种感觉,如果我这样做,用户将被迫单击按钮两次如果在FocusOut – 2013-04-10 13:11:20

+1

之前处理actionPerformed以点击按钮,用户将首先将鼠标放在该按钮上,这样您还可以使用该按钮的MouseEntered属性调用您想要在FocusOut ....中执行的相同代码: )。我希望这会起作用,并将满足您的要求...... – 2013-04-10 13:17:53

+0

看起来很有趣。我仍然会寻找解决方案,那不会让我添加另一个重复其他人的工作的监听者,但是,这实际上应该是诀窍。谢谢 – 2013-04-10 13:29:43

1
  • 不可能在摇摆,没有可能从一个监听事件的排序没有的情况下,两个或多个监听器触发事件​​concurently

,如果我在文本框修改和价值有时候点击按钮, 具有旧值的dataclass被发送到服务器。在我看来, 没有保证TextOffice的FocusOut事件会在按钮的ActionPerformed事件之前处理为 。如果是这样,是否有一些 方式如何保护它?我的意思是一些干净的方式,如果不是必要的话,我不想全都肮脏。

  • 重点是异步的,但在射击适当的情况下,所有的情况下,问题可能出在你的代码

  • 一些听众的组合可以造成相当无限循环(事件被触发室内用延迟),然后您可以CONTROLER点火事件

+0

我已经为我的听众添加了sysouts,它们的处理顺序纯属巧合。恐怕我只剩下脏东西了......如果不涉及编程,那么顺便说一句就不一定是坏事:-) – 2013-04-10 13:41:11

+0

将DocumentListener添加到JTextComponent,然后所有更改都将是... ,请注意,但如何可能'哪些更新数据类字段与FocusOut'上的文本字段值消耗了大量的时间???,简单地删除,禁用,更改,最简单,谢谢 – mKorbel 2013-04-10 13:56:24

2

只是为了好玩,穷人使用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));