我正在为javafx的乐趣创建一个Minesweeper克隆,如果有人玩过原始游戏,他们可能会记得,当你按下一个瓷砖并四处移动时,其他瓷砖的行为就好像它们也被按下了一样。如果你放手 - 即使你最初按下一个完全不同的节点,你的鼠标当前所在的节点也会被点击。我很难重新创建这个,我需要一些帮助。
我正在使用一个全局事件处理程序类,我不确定这是好还是坏......但是,我的克隆事件是分开处理的感觉是正确的。我已经尝试在事件发生的节点上使用方法,比如startFullDrag()或startDragAndDrop(),我认为这将允许其他事件发生或被其他节点使用?我想通过在事件源节点上调用这些方法,它将允许处理其他事件或将信息发送到结束节点,但没有真正起作用。在那种方法之前,我尝试以嵌套的方式处理事件,每个方法都以拖动事件结束,不允许任何事情发生。
有没有人对我如何实现这个功能有任何想法...我有点像砖墙。如果我不清楚某些事情,请询问,我会尽力澄清。对我的代码的任何批评都非常感谢。我一直在寻求改进。
答案 0 :(得分:0)
上面的评论对于理解你在问题中的含义更有帮助,因为当然,我也曾经玩过扫雷;)。
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();
}
编辑:评论中的问题。
只有拥有多个事件处理程序时才能实现此功能吗?我不能在一个事件处理程序中执行此操作吗?
您可以拥有一个捕获所有事件类型的公共事件处理程序,但是您需要检查事件类型以根据此类型执行不同的任务,例如
if (event.getEventType().equals( MouseEvent.MOUSE_CLICKED)) {
// do on mouse click
} else if (event.getEventType().equals( MouseDragEvent.MOUSE_DRAG_RELEASED)) {
// do other
}
为什么这只适用于ToggleGroup?
ToggleGroup
的javadoc状态:
包含对所选Toggles的引用的类 应该管理变量,使得只有一个Toggle 可以在任何时候选择ToggleGroup。
没有它,您需要自己管理单个选择的切换按钮。