Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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
javafx-阻止处理其他事件的事件?_Java_User Interface_Events_Javafx_Handler - Fatal编程技术网

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

javafx-阻止处理其他事件的事件?,java,user-interface,events,javafx,handler,Java,User Interface,Events,Javafx,Handler,我正在用javafx创建一个扫雷舰克隆,如果有人玩过原版游戏,他们可能会记得当你按下一块地砖并四处移动时,其他地砖的行为就好像它们也被按下一样。。。如果你放手,你的鼠标当前所在的节点将被点击,即使你最初按下的是一个完全不同的节点。我很难再创造这个,我需要一些帮助 我正在使用一个全局事件处理程序类,我不确定这是好是坏。。。但是,单独处理我的克隆的事件感觉是对的。我曾尝试在发生事件的节点上使用方法,如startFullDrag()或startDragAndDrop(),我认为这将允许其他节点发生或使

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

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

有人对我如何实现这个功能有什么想法吗。。。我有点像砖墙。如果我对某事不清楚,请询问,我将尝试澄清。此外,对我的代码的任何批评都是非常感谢的。我一直在寻求提高


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

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();
}
为什么这只适用于切换组

ToggleGroup
的javadoc声明:

一个类,该类包含对其选定对象的所有切换的引用 应管理变量,以便在 可在任何时候选择切换组


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

对于所有节点,只有一个事件处理程序是可以的。我不知道;我不明白你们为什么要使用拖拽事件,在最初的扫雷舰上并没有拖拽行为。与其向相邻节点触发新事件,不如构建一个循环来遍历相邻节点,以检查地雷和地雷提示号,并执行node.setopen或setPressed等操作。如果这是一项家庭作业任务,请尝试自己完成。我对查找地雷和所有这些方面没有问题,我说的是我玩过的每一个扫雷游戏中的一点细微差别,当你左键点击并按住一块地砖,然后在按住鼠标的同时移动鼠标,你要去的每个节点都会被按下,直到你释放以暴露潜在的地雷或w/e。在带有任意按钮(包括ToggleButton)的Java中,当您单击并按住并拖动其他平铺时,不会发生这种情况。所以我试着模仿游戏中那个古老而微妙的东西。你知道我在说什么吗?只有当你有多个事件处理程序时才有可能吗?我不能在一个事件处理程序中执行此操作吗?为什么这只适用于切换组?然而,切换组的一个大问题是,只能选择一个磁贴,所以我不能玩扫雷游戏。
if (event.getEventType().equals( MouseEvent.MOUSE_CLICKED)) {
    // do on mouse click
} else if (event.getEventType().equals( MouseDragEvent.MOUSE_DRAG_RELEASED)) {
    // do other
}