我正在制作一个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);
}
});但我很好奇,有没有办法不在每个场景的每个控制器中复制/粘贴相同的代码?我能不能只写一次代码,然后在每个控制器或类似的东西中引用它?
发布于 2020-05-21 02:36:04
当然可以:只要定义一个类就可以了。
例如。
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(...)是为了更容易移除行为,也是为了让您可以独立于此在场景中注册其他行为。
我在这里假设
xOffset和yOffset字段设置为public和static是一个错误,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);
});
}
}https://stackoverflow.com/questions/61920096
复制相似问题