Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Swing线程中混乱的事件顺序_Java_Swing_Events_Multithreading - Fatal编程技术网

Java Swing线程中混乱的事件顺序

Java Swing线程中混乱的事件顺序,java,swing,events,multithreading,Java,Swing,Events,Multithreading,我有一个面板,其中包含一个用于输入数字的文本字段和一个提交按钮 有时,当我单击按钮时,无法发送新的(更新的)值(已发送字段的上一个值) 在调试模式下,我有时会看到 AbstractButton.fireActionPerformed() 之前的事件调度线程调用(获取当时字段的值,然后提交) JFormattedTextFiled.FocusLostHandler 及 (更新字段的值) 我认为在文本字段失去焦点并更新其值之前,不应该调用jbutton事件 你知道这个问题吗 我正在使用xp-sp2

我有一个面板,其中包含一个用于输入数字的文本字段和一个提交按钮 有时,当我单击按钮时,无法发送新的(更新的)值(已发送字段的上一个值)

在调试模式下,我有时会看到

AbstractButton.fireActionPerformed()

之前的事件调度线程调用(获取当时字段的值,然后提交)

JFormattedTextFiled.FocusLostHandler

(更新字段的值)

我认为在文本字段失去焦点并更新其值之前,不应该调用jbutton事件

你知道这个问题吗


我正在使用xp-sp2和java 1.6.0_06-b02

对不起,我重新阅读了你的问题-我以前误解了它


我无法告诉您为什么焦点没有从字段中移开,但是我们的应用程序中也有类似的问题,但是JTable和编辑没有提交到CellRender,尽管我们已经设置了所有必需的表属性。作为事件侦听器的第一个操作,我们必须将焦点从表格单元格移开

对不起,我重新阅读了您的问题-我以前误解了它


我无法告诉您为什么焦点没有从字段中移开,但是我们的应用程序中也有类似的问题,但是JTable和编辑没有提交到CellRender,尽管我们已经设置了所有必需的表属性。作为事件侦听器中的第一个操作,我们只需将焦点从表单元格移开即可

感谢各位的回复,请原谅我在java论坛中启动了相同的therad(我不知道规则):

不管怎样,实际上我对问题的原因而不是解决方案感兴趣
EventQueue中有两种情况

以下是案例1的事件:

MouseEvent (MOUSE_RELEASED)
MouseEvent (MOUSE_CLICKED)
InvocationEvent
InvocationEvent
InvocationEvent
CausedFocusEvent (FOCUS_LOST; opposite: JButton; source: FormattedNumberField)
CausedFocusEvent (FOCUS_GAINED; opposite: FormattedNumberField; source: JButton)
InvocationEvent
MouseEvent (MOUSE_MOVED)
MouseEvent (MOUSE_EXITED)
下面是案例2的事件:

CausedFocusEvent (FOCUS_LOST; opposite: JButton; source: FormattedNumberField)
CausedFocusEvent (FOCUS_GAINED; opposite: FormattedNumberField; source: JButton)
InvocationEvent
InvocationEvent
...
MouseEvent (MOUSE_RELEASED)
MouseEvent (MOUSE_CLICKED)
InvocationEvent
InvocationEvent
...
MouseEvent (MOUSE_MOVED)
MouseEvent (MOUSE_EXITED)

也许java不能保证事件的顺序。如果这是真的,这将是一个常见的问题,但这是一个不寻常且非常罕见的情况。即使我也无法在其他gui面板中重现此问题。我想知道是什么导致了这个问题。

谢谢大家的回复,请原谅我在java论坛上启动了相同的therad(我不知道规则):

不管怎样,实际上我对问题的原因而不是解决方案感兴趣
EventQueue中有两种情况

以下是案例1的事件:

MouseEvent (MOUSE_RELEASED)
MouseEvent (MOUSE_CLICKED)
InvocationEvent
InvocationEvent
InvocationEvent
CausedFocusEvent (FOCUS_LOST; opposite: JButton; source: FormattedNumberField)
CausedFocusEvent (FOCUS_GAINED; opposite: FormattedNumberField; source: JButton)
InvocationEvent
MouseEvent (MOUSE_MOVED)
MouseEvent (MOUSE_EXITED)
下面是案例2的事件:

CausedFocusEvent (FOCUS_LOST; opposite: JButton; source: FormattedNumberField)
CausedFocusEvent (FOCUS_GAINED; opposite: FormattedNumberField; source: JButton)
InvocationEvent
InvocationEvent
...
MouseEvent (MOUSE_RELEASED)
MouseEvent (MOUSE_CLICKED)
InvocationEvent
InvocationEvent
...
MouseEvent (MOUSE_MOVED)
MouseEvent (MOUSE_EXITED)

也许java不能保证事件的顺序。如果这是真的,这将是一个常见的问题,但这是一个不寻常且非常罕见的情况。即使我也无法在其他gui面板中重现此问题。我想知道是什么原因导致了这个问题。

我很确定调试器会保持事情的顺序,但我看到当我忘记从另一个线程使用
invokeLater()
时,调试器会改变明显的顺序。

我很确定调试器会保持事情的顺序,但是,当我忘记从另一个线程使用
invokeLater()
时,我看到调试器改变了明显的顺序。

当我编写一个事件处理程序来处理另一个组件的值时,我直接引用它。如果“LostFocus”处理程序必须在内容有效之前运行,并且如果我们不能保证它会在按钮操作开始之前运行,那么最好将“LostFocus”处理程序中包含的代码移动到一个私有方法中,该处理程序和按钮操作可以访问该方法,这样它就可以自己完成工作。当“LostFocus”最终触发时,它将再次执行,但这并不重要。

当我编写一个事件处理程序来处理另一个组件的值时,我直接引用它。如果“LostFocus”处理程序必须在内容有效之前运行,并且如果我们不能保证它会在按钮操作开始之前运行,那么最好将“LostFocus”处理程序中包含的代码移动到一个私有方法中,该处理程序和按钮操作可以访问该方法,这样它就可以自己完成工作。当“LostFocus”最终触发时,它将再次执行,但这并不重要。

据我所知,Java对事件的顺序没有任何保证(如果我错了,请有人纠正我!)。无论如何,focusLost事件的问题似乎是正常的。我们自然希望在焦点实际转移和新控件的事件启动之前对其进行处理。事实并非如此

正如Catalina Island的帖子所暗示的,解决方案是使用“invokeLater”。“提交”按钮的代码应如下所示:

protected void buttonClick() {
  Runnable doStuff = new Runnable() {
    public void run() {
      // Do whatever button processing is needed here
    }
  };

  // Invoke later, so that any LostFocus event will have been processed first
  SwingUtilities.invokeLater(doListSelection);
}

如果您有许多控件进行一些处理,并且许多控件可能会失去焦点,那么似乎没有“好”的解决方案。坦率地说,这是Swing的一个弱点:它应该保证在焦点改变期间事件的逻辑顺序。

据我所知,Java不保证事件的顺序(如果我错了,请有人纠正我!)。无论如何,focusLost事件的问题似乎是正常的。我们自然希望在焦点实际转移和新控件的事件启动之前对其进行处理。事实并非如此

正如Catalina Island的帖子所暗示的,解决方案是使用“invokeLater”。“提交”按钮的代码应如下所示:

protected void buttonClick() {
  Runnable doStuff = new Runnable() {
    public void run() {
      // Do whatever button processing is needed here
    }
  };

  // Invoke later, so that any LostFocus event will have been processed first
  SwingUtilities.invokeLater(doListSelection);
}

如果您有许多控件进行一些处理,并且许多控件可能会失去焦点,那么似乎没有“好”的解决方案。坦率地说,这是Swing的一个弱点:它应该保证在焦点改变期间事件的逻辑顺序。

相关问题:Java 6 update 6非常旧。在Java6Update21中它仍然有这种行为吗?一般来说,您不能对单个输入事件的事件顺序说太多(所以不要编写依赖于它的脆弱代码)。在这种情况下,按钮操作通常应该在鼠标释放时发生(大多数UI),因此不确定发生了什么