2014-10-27 12 views
0

我有一個ArrayList裏面保存了Path對象,並且每個路徑都有它自己的EventHandler。然而,當我鼠標移到某個路徑進而影響.setOnMouseEntered應用到ArrayList內的所有路徑,而不是某一個:如何從列表中選擇特定節點並對其應用效果?

Path path; 
Group root = new Group(); 
ArrayList<Path> paths = new ArrayList<Path>(); 
EventHandler<MouseEvent> mouseEventHandler = new EventHandler<MouseEvent>() { 
@Override 
public void handle (MouseEvent e) { 
    if (i == 0) { 
    if (e.getEventType() == MouseEvent.MOUSE_PRESSED) { 
     path = new Path(); 
     path.setStroke(Color.BLACK); 
     path.setStrokeWidth(10); 
     root.getChildren().add(path); 
     path.getElements().add(new MoveTo(e.getX(), e.getY())); 
    } 
    if (e.getEventType() == MouseEvent.MOUSE_DRAGGED) { 
     path.getElements().add(new LineTo(e.getX(), e.getY())); 
    } 
    if (e.getEventType() == MouseEvent.MOUSE_RELEASED) { 
     path.getElements().add(new LineTo(e.getX(), e.getY())); 
     for (Path path : paths) { 
     path.setOnMouseEntered(mouseEventHandler2); 
     path.setOnMouseExited(mouseEventHandler2); 
     path.setOnMouseDragged(mouseEventHandler2); 
     } 
     paths.add(path); 
    } 
} 
} 
EventHandler<MouseEvent> mouseEventHandler2 = new EventHandler<MouseEvent>() { 
@Override 
public void handle(MouseEvent me) { 
    if (me.getEventType() == MouseEvent.MOUSE_ENTERED) { 
     path.setEffect(new DropShadow(20, Color.BLACK)); 
    } 
    if (me.getEventType() == MouseEvent.MOUSE_EXITED) { 
     path.setEffect(null); 
    } 
    if (me.getEventType() == MouseEvent.MOUSE_DRAGGED) { 
     path.relocate(me.getX(), me.getY()); 
    } 
} 
}; 

所以這裏mouseEventHandler2被應用到所有的路徑ArrayList的路徑裏面,而不是某一個其中有MOUSE_ENTERED或MOUSE_EXITED

+0

顯示代碼如何將這些路徑添加到場景中。你可能會認爲你在某個路徑上鼠標懸停,但實際上覆蓋了所有路徑。 – 2014-10-27 15:26:58

回答

0

由於您每次在場景上單擊並拖動時都會創建一個新的Path,因此無需遍歷整個路徑列表來分配事件處理程序。只需將它們添加到最後的新路徑。

此外,還有一個問題,因爲您在mouseEventHandler2上使用全局變量path。你應該參考從e.getSource()的路徑。否則,只有最後一條路徑纔會對鼠標事件做出反應。

最後一個問題:如果你嘗試拖動現有的路徑,你正在創建一個新的同一時間......我想這是i==0部分,這沒有任何意義,我(假設i是路徑數量,我不明白你爲什麼限制爲1,然後使用for循環...)。

基本上,這些是我對代碼的修改(第二個拖動事件處理器註釋了,並且對路徑創建沒有限制)。

private final EventHandler<MouseEvent> mouseEventHandler2 = (MouseEvent me) -> { 
    Path path1 = (Path)me.getSource(); 
    if (me.getEventType() == MouseEvent.MOUSE_ENTERED) { 
     path1.setEffect(new DropShadow(20, Color.BLACK)); 
    } 
    if (me.getEventType() == MouseEvent.MOUSE_EXITED) { 
     path1.setEffect(null); 
    } 
     if (me.getEventType() == MouseEvent.MOUSE_DRAGGED) { 
      path1.relocate(me.getX(), me.getY()); 
     } 
}; 

private final EventHandler<MouseEvent> mouseEventHandler = (MouseEvent e) -> { 
    if (e.getEventType() == MouseEvent.MOUSE_PRESSED) { 
     path = new Path(); 
     path.setStroke(Color.BLACK); 
     path.setStrokeWidth(10); 
     path.getElements().add(new MoveTo(e.getX(), e.getY())); 
     root.getChildren().add(path); 
    } 
    if (e.getEventType() == MouseEvent.MOUSE_DRAGGED) { 
     path.getElements().add(new LineTo(e.getX(), e.getY())); 
    } 
    if (e.getEventType() == MouseEvent.MOUSE_RELEASED) { 
     path.getElements().add(new LineTo(e.getX(), e.getY())); 
     path.setOnMouseEntered(mouseEventHandler2); 
     path.setOnMouseExited(mouseEventHandler2); 
//  path.setOnMouseDragged(mouseEventHandler2); 
    } 
}; 
相關問題