【问题标题】:Moving multiple scenes in JavaFX在 JavaFX 中移动多个场景
【发布时间】:2020-05-20 18:16:06
【问题描述】:

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

//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);
        }
    });

但我很好奇,有没有办法不在每个场景的每个控制器中复制/粘贴相同的代码?我可以做一些事情来编写这段代码并在每个控制器或类似的东西中引用它吗?

【问题讨论】:

  • 为什么这些字段是publicstatic
  • 我试图停止在每个类中重复这些变量声明,至少这就是为什么它们是公共的和静态的。但无论如何,它并没有像我想要的那样工作。
  • 我不明白如果所有不同场景的偏移量相同,它会如何工作?
  • 我知道有些事情对你们中的许多人来说可能是显而易见的,但我只是 Java 的初学者。有错误请见谅。
  • 字段应该总是private。至少不是中等高级的静态的唯一用途是常量和public static void main(String[] args) 方法。

标签: java javafx


【解决方案1】:

是的,当然:只需定义一个类即可。

例如

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);
    }

}

那你就可以了

new SceneDragHandler(scene);

只要你需要。

我使用addEventHandler(...) 而不是setOnMousePressed(...)setOnMouseDragged(...) 以便更轻松地移除行为,并允许您在场景中独立地注册其他行为。

我在这里假设

  • xOffsetyOffset 字段设置为publicstatic 是一个错误,并且
  • 您想要拖动包含指定场景的窗口(如果没有,尽管其他任何东西看起来很奇怪,只需为舞台和场景创建一个字段)。

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

// turn on dragging behavior:
SceneDragHandler sceneDragHandler = new SceneDragHandler(scene);

// later....

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

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

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);
        });
    }
}

【讨论】:

  • 感谢您的帮助。它确实使代码更干净、更短:)
猜你喜欢
  • 2015-05-16
  • 2016-01-25
  • 1970-01-01
  • 2014-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-23
相关资源
最近更新 更多