当前位置: 首页 > 知识库问答 >
问题:

在子节点JavaFX上不接收鼠标按下事件

张丁雷
2023-03-14

我要在两个图像视图之间绘制路径,视图与图片相同

此路径从其中一个imageview开始(按鼠标),继续(按鼠标)并在窗格上移动事件,并且必须在另一个imageview结束(按鼠标)。这是第一次鼠标按下在imageviews上没有收到任何鼠标按下事件后的问题,该事件只是在窗格上收到,因为绘制线没有停止。我的代码出了什么问题?

这是我的控制器代码:

public class DrawLine {
    @FXML
    ImageView imageView1 ;
    @FXML
    ImageView imageView2 ;
    @FXML
    AnchorPane pane ;
    private  Line currentLine ;
    private  String state ;
    private DoubleProperty mouseX = new SimpleDoubleProperty();
    private DoubleProperty mouseY = new SimpleDoubleProperty();

    @FXML
    private  void initialize(){
        state = "dfkl" ;
        imageView1.setPreserveRatio( false);
        imageView2.setPreserveRatio( false);
        imageView1.setOnMousePressed( event -> {
            imageMousePress( event);
        });
        imageView2.setOnMousePressed( event -> {
            imageMousePress( event);
        });
        pane.setOnMousePressed( event ->  {
            paneMousePress( event) ;
        });
        imageView2.setPickOnBounds(false);
        imageView1.setPickOnBounds(false);
        pane.setOnMouseMoved( event -> {
            paneMouseMove( event);
        });

    }


    public  void paneMouseMove( MouseEvent e) {
        if( this.state.equals("DRAWLINE") && this.currentLine != null) {
            makeLine( e);
        }
    }
    public void paneMousePress( MouseEvent e) {
        if( this.state.equals("DRAWLINE") && this.currentLine != null) {
            endLine(e);
            startLine(e);
        }
    }
    private  void  startLine( MouseEvent e ){
        currentLine = new Line();
        currentLine.setStyle( "-fx-stroke: #a86a6a ; -fx-stroke-width: 5");
        currentLine.setStartX( e.getSceneX());
        currentLine.setStartY(e.getSceneY());
        mouseX.set( e.getSceneX()) ;
        mouseY.set( e.getSceneY());
        currentLine.endXProperty().bind(mouseX);
        currentLine.endYProperty().bind(mouseY);
        pane.getChildren().add(currentLine);
    }
    private  void  endLine (  MouseEvent e){
        currentLine.endXProperty().unbind();
        currentLine.endYProperty().unbind();
        currentLine.setEndX(e.getX());
        currentLine.setEndY(e.getY());
        currentLine = null;
    }
    private  void makeLine( MouseEvent e){
        mouseX.set(e.getX());
        mouseY.set(e.getY());
    }

    private void imageMousePress( MouseEvent event){
        if( currentLine == null){
            startLine(event);
            state = "DRAWLINE" ;
        }else if( currentLine != null & state.equals("DRAWLINE")){
            endLine( event);
        }
    }
}

请帮帮我。

共有1个答案

佴德曜
2023-03-14

拖动直线的endpoint时,endpoint位于鼠标光标下方。这样,鼠标事件的目标是线,而不是图像视图,并且由于消耗它的线没有事件处理程序,因此事件被传递到线的父对象,线是锚链,而不是图像视图。

要修复此问题,请将行的mouseTransparent属性设置为true:

private void startLine(MouseEvent e) {
    currentLine = new Line();
    currentLine.setMouseTransparent(true);
    ...
}

此外,您应该使用ImageView的事件以不触发AnchorPane的事件处理程序:

imageView1.setOnMousePressed(event -> {
    imageMousePress(event);
    event.consume();
});
imageView2.setOnMousePressed(event -> {
    imageMousePress(event);
    event.consume();
});

另请注意,MouseEventxy属性相对于添加处理程序的Node的坐标系。

private void endLine(MouseEvent e) {
    currentLine.endXProperty().unbind();
    currentLine.endYProperty().unbind();
    currentLine.setEndX(e.getX());
    currentLine.setEndY(e.getY());
    currentLine = null;
}

需要更改为

private void endLine(MouseEvent e) {
    currentLine.endXProperty().unbind();
    currentLine.endYProperty().unbind();
    currentLine = null;
}

此外,如果状态数量有限,我建议使用枚举,因为这样可以在编译时检查拼写错误。为此目的使用字符串可能会意外地添加错误,例如,如果您意外地使用“DRAWLINE”而不是“DRAWLINE”,这可能很难发现。此外,可以使用比较枚举常数。

private enum States {
    DRAWLINE
}
 类似资料:
  • 我准备好为此拔掉头发了。我正在开发游戏图形用户界面,它有一个由网格单元组成的地图。 单元格网格由StackPane组成,然后由ImageView或Shapes等组成的几个层组成。 整个内容包含在GridPane中,GridPane包含BorderPane的中心元素; 我不能在底层场景中添加鼠标事件,因为所有节点都会得到它- 下面是创建堆栈的代码: 这是设置EventHandler的代码- 谢谢你的

  • 我正在尝试接收JavaFX 2.2中一个不可见节点的MouseEvents。可以把它想象成一个互动但不可见的区域,比如当鼠标悬停在它上面时,它会触发一个动作。问题是,这不是一个静态定义的区域,但有多个区域(很多)可以被应用程序移动和调整大小。所以对于我的用例来说,全局监听鼠标移动并手动检测鼠标移动事件会有很大的开销。 目前,我正在试验一个透明矩形(),但实际/最终的应用程序将使用某种窗格,因为它实

  • 我正在构建一个Java应用程序。这个应用程序是一个典型的“油漆”应用程序,你可以选择一种颜色,并在画布上绘制。除了...我将有一个圆圈数组分布在画布的顶部。我希望这些圆立即改变颜色,如果,当用户正在绘制和鼠标得到圆的X(10)个像素(其中X是绘制的线的宽度除以2)。 这是我的密码。我有一张画布是一组的一部分。我还创建了一个圆圈节点,并将其作为组的一部分。我想我需要以某种方式创建一个鼠标事件,当用户

  • 问题内容: 我正在开发JavaFX项目,并且需要类似于表征 “按下并按住”事件的东西 。但是应该将其映射为一个,因为我在Linux上的触摸事件遇到了麻烦。例如,在Ubuntu中,它不会响应触摸事件。 请让我知道,如果你对如何触发一个任何想法 每当 “按住” 在Linux上出现? 问题答案: 只需将a 用作“保持”的计时器即可。如果按下鼠标,则将其启动;如果释放或拖动,则将其停止。

  • 所以我有这个anchorpane,我希望为第二个鼠标键添加一个鼠标listner。我尝试了以下方法,但我一直得到一个错误,有人知道问题是什么吗? 为了记录在案,我也尝试过这样做: 绑定不匹配:MouseButton类型不能有效替代EventHandler类型的有界参数

  • 我想要一个舞台,是相同的大小,屏幕是完全透明的,接收鼠标事件在任何地方。在下面的示例中,我只在鼠标位于圆圈上方时才获得鼠标事件。我在使用Java 8U11的Windows XP和Windows 7上都看到了这个问题 有趣的是,如果我将填充颜色的alpha部分设置为它的绝对最小值,那么我会得到鼠标事件。然而,我不想使用这个变通方法,而是要真正深入到问题的底部。我的结论是,在JavaFX或Window