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

javafx - events blocking other events from getting handled?

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

我正在使用全局事件处理程序 class,我不太确定这是好是坏...但是,让我的克隆事件单独处理感觉不错.我已经尝试在事件发生的节点上使用方法,比如 startFullDrag() 或 startDragAndDrop() 我认为这将允许其他事件发生或被其他节点使用?我认为通过在事件源节点上调用这些方法,可以处理其他事件或将信息发送到结束节点,但没有任何效果。在此方法之前,我尝试以嵌套方式处理事件,每种方法都以不允许任何事情发生的拖动事件结束。

是否有人对我如何实现此功能有任何想法...我有点不知所措。如果我不清楚某些事情,请询问,我会尽力澄清。也非常感谢对我的代码的任何批评。我一直在寻求改进。

My clone (so far) and all of its classes on Gist.

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

startFullDrag() 是一条路:

@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();
}

编辑:评论中的问题。

Is this only possible when you have multiple event handlers? Would I not be able to do this in one event handler?

你可以有一个通用的事件处理程序来捕获所有事件类型,但是你需要检查事件类型以根据这种类型执行不同的任务,比如

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

Also why does this only work with a ToggleGroup?

ToggleGroup 的 javadoc 指出:

A class which contains a reference to all Toggles whose selected variables should be managed such that only a single Toggle within the ToggleGroup may be selected at any one time.

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