当前位置: 首页 > 知识库问答 >
问题:

javafx - 阻止其他事件处理的事件?

谢誉
2023-03-14

我正在使用javafx创建一个扫雷克隆,如果有人玩过原始游戏,他们可能会记得当你按下一个磁贴并四处移动时,其他磁贴的行为就好像它们也在被按下一样...如果你放手-即使你最初按下的是一个完全不同的节点,你鼠标当前所在的节点也会被点击。我很难重新创建这个,我需要一些帮助。

我正在使用全局事件处理程序类,我不太确定这是好是坏......但是,让我的克隆的事件单独处理感觉很好。我尝试过在事件发生的节点上使用方法,例如start FullDrag()或start DragAndDrop(),我认为这将允许其他事件发生或被其他节点使用?我认为通过在事件源节点上调用这些方法,它将允许处理其他事件或将信息发送到结束节点,但都没有真正起作用。在这种方法之前,我尝试以嵌套的方式处理事件,每种方法都以拖动事件而告终,不允许任何事情发生。

有没有人对我如何实现此功能有任何想法......我有点像在砖墙上。如果我不清楚某些事情,请问,我会尝试澄清。此外,对我的代码的任何批评也非常感谢。我一直在寻求改进。

我的克隆(到目前为止)和它在Gist上的所有类。

共有1个答案

孙莫希
2023-03-14

你上面的评论更有助于理解你在问题中的意思,因为,当然,我也曾经玩过扫雷游戏;)。

start FullDrag()是一种方法

@Override
public void start( Stage primaryStage )
{

    EventHandler<MouseEvent> dragDetectedHandler = (( MouseEvent event ) ->
    {
        (( ToggleButton ) event.getSource()).startFullDrag();
    });

    EventHandler<MouseDragEvent> dragEnteredHandler = (( MouseDragEvent event ) ->
    {
        (( ToggleButton ) event.getSource()).setSelected( true );
    });

    EventHandler<MouseDragEvent> onMouseDragHandler = (( MouseDragEvent event ) ->
    {
        (( ToggleButton ) event.getSource()).fire();
    });

    EventHandler<ActionEvent> onActionHandler = (( ActionEvent event ) ->
    {
        ToggleButton b = ( ToggleButton ) event.getSource();
        System.out.println( "Action on " + b.getText() );

        // without the following settings the button is not getting selected
        // and focused when fire() is triggered within onMouseDragHandler.
        b.setSelected( true );
        b.requestFocus();
    });

    VBox vBox = new VBox();

    ToggleButton tb1 = new ToggleButton( "A" );
    ToggleButton tb2 = new ToggleButton( "B" );
    ToggleButton tb3 = new ToggleButton( "C" );

    ToggleGroup group = new ToggleGroup();
    tb1.setToggleGroup( group );
    tb2.setToggleGroup( group );
    tb3.setToggleGroup( group );

    tb1.setOnAction( onActionHandler );
    tb2.setOnAction( onActionHandler );
    tb3.setOnAction( onActionHandler );

    tb1.setOnDragDetected( dragDetectedHandler );
    tb2.setOnDragDetected( dragDetectedHandler );
    tb3.setOnDragDetected( dragDetectedHandler );

    tb1.setOnMouseDragEntered( dragEnteredHandler );
    tb2.setOnMouseDragEntered( dragEnteredHandler );
    tb3.setOnMouseDragEntered( dragEnteredHandler );

    tb1.setOnMouseDragReleased( onMouseDragHandler );
    tb2.setOnMouseDragReleased( onMouseDragHandler );
    tb3.setOnMouseDragReleased( onMouseDragHandler );

    vBox.getChildren().addAll( tb1, tb2, tb3 );

    Scene scene = new Scene( vBox, 150, 150 );
    primaryStage.setScene( scene );
    primaryStage.show();
}

编辑:评论中的问题。

这是否仅在具有多个事件处理程序时才可能?我是否无法在一个事件处理程序中执行此操作?

您可以有一个通用的事件处理程序来捕获所有的事件类型,但是接下来您需要检查事件类型来基于该类型执行不同的任务,比如

if (event.getEventType().equals( MouseEvent.MOUSE_CLICKED)) {
    // do on mouse click
} else if (event.getEventType().equals( MouseDragEvent.MOUSE_DRAG_RELEASED)) {
    // do other
}

还有,为什么这只适用于切换组?

< code>ToggleGroup的javadoc声明:

一个类,包含对所有切换的引用,应管理其选定变量,以便在任何时候只能选择切换组中的单个切换。

没有它,您需要自己管理切换按钮的单个选择。

 类似资料:
  • 我在页面上有输入字段和提交按钮。 这里是jQuery代码: 我想防止模糊,如果从输入字段点击提交div,但想允许它,如果从输入字段点击页面的其他部分。我无法使用“提交”按钮。 我已竖起了小提琴。净/405kzboh/1 但是现在我甚至不明白为什么点击事件没有在模糊事件之前触发,如果有人从输入点击提交!

  • 问题内容: 我有一棵divs树: 在div上单击时,将使其子级不可见-即单击“ a”将使“ b”和“ c”不可见。 问题是:单击“ b”将调用“ a”的单击,并使“ b”和“ c”不可见。如何使用jQuery禁用对“ a”的点击? 谢谢 问题答案: 您可以为孩子添加一个处理程序,以防止click事件蔓延: 这样一来,点击不会传播到。都不会单击以转到,因此也不会。

  • 我正在编写一个Java7Swing应用程序,它调用一个非GUI类来在循环中执行某些操作。不幸的是,当循环运行时,我无法与GUI交互。在该循环中是否可以强制处理GUI事件? 我正在搜索一些内容,告诉JVM在继续循环之前处理其他GUI事件(如按钮单击)。

  • 我有一个非常基本的JavaFX项目,只有一个锚窗格和一个标签。这个想法是当你按下键盘上的一个按钮时,标签就会变成你按下的键。

  • 该部分 API 将帮助您监听光环板上的各类事件,学习如何使用广播进行线程间的通信,控制脚本的停止,以写出多线程程序。 省略代码中的halocode 注意:该部分 API 省略了“halocode.”,本篇提及的所有 API 均省略了“halocode.” ,如 led_driver.off( )实际为halocode.led_driver.off()。mbuild 电子模块平台的所有功能均维护在h

  • 我正在开发一个小应用程序,在创建菜单栏时遇到了一个问题。这是我的开始方法: 我遇到的问题在代码的这一部分: 我试图从数组列表中创建子菜单的条目。这些数据从数据库中获取,并以数组列表的形式返回。除了pairNameMenu.getItems()之外,我没有找到其他方法来做菜单项。add(new MenuItem(item));在for循环中。 现在我想处理项目中的点击,但我不知道如何操作。我试过使用