首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在JavaFX中移动多个场景

在JavaFX中移动多个场景
EN

Stack Overflow用户
提问于 2020-05-21 02:16:06
回答 1查看 37关注 0票数 0

我正在制作一个JavaFX应用程序,我有一个问题。我的应用程序有6个场景,在每个场景中,我都复制并粘贴了负责通过鼠标移动场景的相同代码。这是我的代码:

代码语言:javascript
复制
//some class instance
public static double xOffset = 0;
public static double yOffset = 0;

scene.setOnMousePressed(new EventHandler<MouseEvent>() {
        @Override
        public void handle(MouseEvent mouseEvent) {
            xOffset = mouseEvent.getSceneX();
            yOffset = mouseEvent.getSceneY();
        }
    });

    scene.setOnMouseDragged(new EventHandler<MouseEvent>() {
        @Override
        public void handle(MouseEvent mouseEvent) {
            stage.setX(mouseEvent.getScreenX() - xOffset);
            stage.setY(mouseEvent.getScreenY() - yOffset);
        }
    });

但我很好奇,有没有办法不在每个场景的每个控制器中复制/粘贴相同的代码?我能不能只写一次代码,然后在每个控制器或类似的东西中引用它?

EN

回答 1

Stack Overflow用户

发布于 2020-05-21 02:36:04

当然可以:只要定义一个类就可以了。

例如。

代码语言:javascript
复制
public class SceneDragHandler {

    private double xOffset ;
    private double yOffset ;

    private final EventHandler<MouseEvent> mouseDownHandler ;
    private final EventHandler<MouseEvent> mouseDragHandler ;

    private final Scene scene ;

    public SceneDragHandler(Scene scene) {
        this.scene = scene ;
        mouseDownHandler = e -> {
            xOffset = e.getSceneX();
            yOffset = e.getSceneY();
        };
        mouseDragHandler = e -> {
            scene.getWindow().setX(e.getScreenX() - xOffset);
            scene.getWindow().setY(e.getScreenY() - yOffset);
        };
        scene.addEventHandler(MouseEvent.MOUSE_PRESSED, mouseDownHandler);
        scene.addEventHandler(MouseEvent.MOUSE_DRAGGED, mouseDragHandler);
    }

    // may not need this:
    public void dispose() {
        scene.removeEventHandler(MouseEvent.MOUSE_PRESSED, mouseDownHandler);
        scene.removeEventHandler(MouseEvent.MOUSE_DRAGGED, mouseDragHandler);
    }

}

然后你就可以这样做

代码语言:javascript
复制
new SceneDragHandler(scene);

当你需要它的时候。

我使用addEventHandler(...)而不是setOnMousePressed(...)setOnMouseDragged(...)是为了更容易移除行为,也是为了让您可以独立于此在场景中注册其他行为。

我在这里假设

  • xOffsetyOffset字段设置为publicstatic是一个错误,
  • 您希望拖动包含指定场景的窗口(如果不是这样,尽管其他内容看起来很奇怪,但只需为舞台和场景创建一个字段)。

dispose()方法允许您关闭拖动行为:

代码语言:javascript
复制
// turn on dragging behavior:
SceneDragHandler sceneDragHandler = new SceneDragHandler(scene);

// later....

// turn off dragging behavior:
sceneDragHandler.dispose();

如果您认为不需要dispose()功能,那么这将简化为

代码语言:javascript
复制
public class SceneDragHandler {

    private double xOffset ;
    private double yOffset ;

    public SceneDragHandler(Scene scene) {

        scene.addEventHandler(MouseEvent.MOUSE_PRESSED, e -> {
            xOffset = e.getSceneX();
            yOffset = e.getSceneY();
        });
        scene.addEventHandler(MouseEvent.MOUSE_DRAGGED, e -> {
            scene.getWindow().setX(e.getScreenX() - xOffset);
            scene.getWindow().setY(e.getScreenY() - yOffset);
        });
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61920096

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档