【问题标题】:javafx mouse events in transparent image透明图像中的javafx鼠标事件
【发布时间】:2019-01-30 03:33:27
【问题描述】:

如果您在透明像素上单击或拖动,JavaFx ImageView 不会触发诸如按下或拖动之类的鼠标事件,是否有办法解决此问题并从透明区域检测鼠标事件?

我有这张图片

我添加到这个非常简单的 JavaFX 场景中

使用 ImageView 命名视图,我想用鼠标拖动事件移动它 所以我写了这段代码

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class Main extends Application{

    double initMx, initMy,initX, initY;

    @Override
    public void start(Stage ps) throws Exception {
        StackPane pane = new StackPane();
        Image im = new Image("0.png");
        ImageView view = new ImageView(im);
        double fact = im.getWidth() / im.getHeight();

        view.setFitHeight(300);
        view.setFitWidth(300 * fact);

        view.setOnMousePressed(e->{
            initX = view.getTranslateX();
            initY = view.getTranslateY();
            initMx = e.getSceneX();
            initMy = e.getSceneY();
        });

        view.setOnMouseDragged(e->{
            double dx = initMx - e.getSceneX();
            double dy = initMy - e.getSceneY();

            double nx = initX - dx;
            double ny = initY - dy;

            view.setTranslateX(nx);
            view.setTranslateY(ny);

        });

        pane.getChildren().add(view);

        Scene scene = new Scene(pane, 500, 500);

        ps.setScene(scene);
        ps.show();

    }

    public static void main(String[] args) {
        launch(args);
    }
}

到目前为止,这段代码运行良好, 但如果你按下或拖动某个地方,比如他的耳朵下面(或任何透明的地方),什么都不会发生!如何解决这个问题!

【问题讨论】:

    标签: javafx


    【解决方案1】:

    更自然和最简单的解决方案是将边界上的选择设置为 true。

    view.setPickOnBounds(true);
    

    【讨论】:

    • 之前不知道这个方法有什么作用,非常感谢
    【解决方案2】:

    您可以通过将此图像设置为Button 中的图形来做到这一点

    button.setGraphics(new ImageView(im));
    

    注意:添加ImageView 后,您需要通过将按钮背景设置为透明背景颜色来从按钮中删除样式

    【讨论】:

    【解决方案3】:

    如果你还没有试试这个:

       view.setOnMouseDragged(e->{
            double dx = initMx - e.getX();
            double dy = initMy - e.getY();
    

    【讨论】:

    • 感谢您提供帮助-但是...好吧,您尝试了吗?真正的问题是透明像素对 mouseEvents 是透明的,即永远不会为形状之外的图像部分调用该方法。
    猜你喜欢
    • 2015-01-07
    • 2013-01-04
    • 1970-01-01
    • 2013-03-26
    • 2011-12-20
    • 1970-01-01
    • 2014-07-01
    • 2022-07-27
    • 2017-03-21
    相关资源
    最近更新 更多