2015-12-10 58 views
1

我正在製作跳棋遊戲。三個主要組件是一個Board類,BoardPiece和GamePiece。所有GamePiece對象對於鼠標來說基本上是不可見的。點擊棋子時,會執行檢查以查看BoardPiece當前是否有GamePiece。所以一旦BoardPiece被點擊並找到一塊,那麼該塊就需要處理該事件(用於拖放)。下面是從BoardPiece類的摘錄:JavaFX構建新的事件鏈

setOnMousePressed(e -> { 
    if (e.getTarget() instanceof BoardPiece) { 
     BoardPiece bp = (BoardPiece)e.getTarget(); 
     GamePiece p = bp.getPiece(); 
     if (p != null) { 
      p.fireEvent(e); 
     } 
    } 
}); 
setOnMouseDragged(e -> { 
    if (e.getTarget() instanceof BoardPiece) { 
     BoardPiece bp = (BoardPiece)e.getTarget(); 
     GamePiece p = bp.getPiece(); 
     if (p != null) { 
      p.fireEvent(e); 
     } 
    } 
}); 
setOnMouseReleased(e -> { 
    if (e.getTarget() instanceof BoardPiece) { 
     BoardPiece bp = (BoardPiece)e.getTarget(); 
     GamePiece p = bp.getPiece(); 
     if (p != null) { 
      p.fireEvent(e); 
     } 
    } 
}); 

正如你看到的,我必須手動告訴件來處理每一個事件,而不是事件的整個鏈條。我對JavaFX和Java一般都比較陌生,所以我主要關心的是學習最有效的方法。

回答

0

您必須設置所有的事件處理程序分開,但由於這些處理器具有相同的功能,可以簡化:

EventHandler<? super MouseEvent> mouseEventHanlder = e -> { 
    if (e.getTarget() instanceof BoardPiece) { 
     BoardPiece bp = (BoardPiece)e.getTarget(); 
     GamePiece p = bp.getPiece(); 
     if (p != null) { 
      p.fireEvent(e); 
     } 
    } 
}; 
setOnMousePressed(mouseEventHanlder); 
setOnMouseDragged(mouseEventHanlder); 
setOnMouseReleased(mouseEventHanlder); 
+0

謝謝!這基本上就是我最終做的,期望我只是將塊寫入一個在處理程序中調用的函數,然後再對BoardPiece執行其他任何操作。 –