Java 如何从列表中选择特定节点并对其应用效果?

Java 如何从列表中选择特定节点并对其应用效果?,java,javafx,Java,Javafx,我有一个ArrayList,其中包含路径对象,每个路径都有自己的EventHandler。但是,当我将鼠标移到某个路径上时,effect.SetOnMouseEnter将应用于ArrayList中的所有路径,而不是特定路径: Path path; Group root = new Group(); ArrayList<Path> paths = new ArrayList<Path>(); EventHandler<MouseEvent> mouseEvent

我有一个ArrayList,其中包含路径对象,每个路径都有自己的EventHandler。但是,当我将鼠标移到某个路径上时,effect.SetOnMouseEnter将应用于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());
    }
}
};
路径;
组根=新组();
ArrayList路径=新的ArrayList();
EventHandler mouseEventHandler=neweventhandler(){
@凌驾
公共无效句柄(MouseEvent e){
如果(i==0){
如果(e.getEventType()==MouseEvent.MOUSE_按下){
路径=新路径();
路径设定行程(颜色为黑色);
路径设置行程宽度(10);
root.getChildren().add(路径);
path.getElements().add(newmoveto(e.getX(),e.getY());
}
如果(e.getEventType()==MouseEvent.MOUSE_){
path.getElements().add(newlineto(e.getX(),e.getY());
}
如果(e.getEventType()==MouseEvent.MOUSE_已释放){
path.getElements().add(newlineto(e.getX(),e.getY());
for(路径路径:路径){
path.setonmouseintered(mouseEventHandler2);
path.setOnMouseExited(mouseEventHandler2);
path.setonmousedrable(mouseEventHandler2);
}
路径。添加(路径);
}
}
}
EventHandler mouseEventHandler2=新的EventHandler(){
@凌驾
公共无效句柄(MouseEvent me){
如果(me.getEventType()==MouseEvent.MOUSE_){
setEffect(新的DropShadow(20,颜色.黑色));
}
如果(me.getEventType()==MouseEvent.MOUSE_退出){
path.setEffect(空);
}
if(me.getEventType()==MouseEvent.MOUSE_){
重定位(me.getX(),me.getY());
}
}
};

因此,这里的mouseEventHandler2应用于ArrayList路径中的所有路径,而不是已输入或退出鼠标的特定路径

,因为您每次在场景上单击并拖动时都要创建一个新的
路径
,因此不必查看整个路径列表来分配事件处理程序。只需将它们添加到las即可这不是一条新路

此外,还有另一个问题,因为您在
mouseEventHandler2
上使用全局变量
path
。您应该引用
e.getSource()
中的路径。否则,只有最后一个路径会对鼠标事件作出反应

最后一个问题:如果您尝试拖动一个现有路径,同时创建一个新路径……我想这就是
I==0
部分,这对我来说没有意义(假设
I
是路径数,我不明白为什么您只限制为1,然后使用for循环…)

基本上,这些是我对代码的修改(注释了第二个拖动事件处理程序,对路径创建没有限制)

private final EventHandler mouseEventHandler2=(MouseEvent me)->{
路径path1=(Path)me.getSource();
if(me.getEventType()==输入MouseeEvent.MOUSE\u){
路径1.setEffect(新的DropShadow(20,颜色.黑色));
}
if(me.getEventType()==MouseEvent.MOUSE_uExit){
路径1.setEffect(空);
}
if(me.getEventType()==MouseEvent.MOUSE_){
路径1.重新定位(me.getX(),me.getY());
}
};
私有最终事件处理程序mouseEventHandler=(MouseEvent e)->{
如果(e.getEventType()==MouseEvent.MOUSE_按下){
路径=新路径();
路径设定行程(颜色为黑色);
路径设置行程宽度(10);
path.getElements().add(newmoveto(e.getX(),e.getY());
root.getChildren().add(路径);
}
如果(e.getEventType()==MouseEvent.MOUSE_){
path.getElements().add(newlineto(e.getX(),e.getY());
}
如果(e.getEventType()==MouseEvent.MOUSE_已释放){
path.getElements().add(newlineto(e.getX(),e.getY());
path.setonmouseintered(mouseEventHandler2);
path.setOnMouseExited(mouseEventHandler2);
//path.setonmousedrable(mouseEventHandler2);
}
};

显示如何将这些路径添加到场景中的代码。您可能会认为鼠标在某个路径上移动,但实际上在所有路径上移动。
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);
    }
};