【问题标题】:Consuming Events with EventFilters使用 EventFilters 消费事件
【发布时间】:2016-03-10 16:45:11
【问题描述】:

首先,谁能给我解释一下,为什么我的MouseEvent 会被消耗掉,无论我选择哪个Alert-Option?我想这与在EventFilter 中调用Alert 有关,但我还不清楚。

public class EventFilterConsumeErrorExample extends Application
{
  @Override
  public void start( final Stage primaryStage )
  {
    final CheckBox checkBox = new CheckBox( "Check me!" );
    checkBox.setOnAction( ( event ) ->
    {
      System.out.println( "onAction: " + checkBox.isSelected() );
    } );

    checkBox.addEventFilter( MouseEvent.MOUSE_RELEASED, ( event ) ->
    {
      System.out.println( "onFilter" );

      final Alert alert = new Alert( AlertType.CONFIRMATION, "Do you wonna consume this Event?" );

      if ( alert.showAndWait().get().equals( ButtonType.OK ) )
      {
        System.out.println( "Yes, consume Event" );
        event.consume();
      }
      else
      {
        System.out.println( "No, do NOT consume Event" );
        //<-- Why is the Event consumed anyway? onAction won´t be called.
      }
    } );

    final BorderPane root = new BorderPane( checkBox );
    final Scene scene = new Scene( root, 400, 400 );
    primaryStage.setScene( scene );
    primaryStage.show();
  }


  public static void main( final String[] args )
  {
    System.out.println( "Java Version " + System.getProperties().get( "javafx.runtime.version" ) );
    launch( args );
  }
}

在单击复选框两次并单击每个对话框决定一次后,程序生成以下输出:

Java 版本 8.0.72-b15
onFilter
是的,使用事件
onFilter
不,不要消费事件

在这两种情况下,复选框都不会改变其状态,onAction 不会被调用。任何人都可以解释为什么该复选框没有正确处理该事件?

其次,您将如何避免在基于用户的决策上检查蜜蜂的复选框?

【问题讨论】:

  • jdk1.8.0_66 事件在这里没有被消费,onAction 被调用
  • 奇怪,我自己用的是jdk1.8.0_66
  • 在 jdk1.8.0_71 上对我来说效果很好。
  • @crusam 顺便说一句 - 我正在使用 Fedora 23
  • 感谢两位的反馈。我正在使用 Win7,我刚刚切换到最新的 JDK 版本(jdk1.8.0_74),它仍然不适合我。在这两种情况下都不会调用 setOnAction。

标签: validation javafx javafx-8 alert eventfilter


【解决方案1】:

我调试了它,我猜这是一个错误,你应该file a bug report。只要您留在 EventFilter 中,该事件就不会被消耗。有时在处理该代码之后,该事件似乎在冒泡事件中被消耗。这可能是 Alert 类中嵌套事件的副作用。

您可以通过始终使用事件并手动设置复选框来轻松解决该问题,即。 e.

  if ( alert.showAndWait().get().equals( ButtonType.OK ) )
  {
    System.out.println( "Yes, consume Event" );
    event.consume();
  }
  else
  {
    System.out.println( "No, do NOT consume Event" );
    //<-- Why is the Event consumed anyway? onAction won´t be called.

    // always consume the event
    event.consume();

    // trigger the change manually
    checkBox.setSelected(!checkBox.isSelected());

  }

但是,您还有另一个问题,例如。 G。如果用户通过键盘(空格键)触发复选框选择事件。但是你明确地捕捉到了鼠标事件,所以我把它留在那里(提示:你可以例如恢复 onAction 事件中的选择)。

在 Win7 x64 上使用 Java 8u66 和 Java 8u74 进行了尝试。

【讨论】:

  • 感谢您确认,这可能是系统特定的错误。我开始认为这只是我们工作环境中的一个局部问题,因为其他陈述,在他们的系统上它按预期工作。也感谢您的解决方案。只是讨厌,在这种情况下我必须解决一个错误,但至少它仍然可以工作,当错误应该被修复时。我也已经想到了这一点。
  • 我提交了错误报告。有点惊讶,它不再在 JIRA 上;)。一旦它被批准为 bug,我将在此处添加 bug 票 ID。
猜你喜欢
  • 2012-02-08
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-16
  • 2020-04-21
  • 2020-12-17
相关资源
最近更新 更多