显示舞台的精确副本

时间:2017-07-07 00:18:18

标签: java javafx screen-scraping

我正在开发一个新项目,需要在辅助监视器上显示一个单独的阶段。这将是一个非交互式阶段(仅用于显示节点)。我将按照this approach处理该部分。

但是,我还希望在主应用程序的窗格中显示该阶段的副本。它需要在舞台的同时更新自己。

我将从哪里开始学习如何实现这一目标? Java是否提供了一个内置的API来显示阶段的实时屏幕截图?

1 个答案:

答案 0 :(得分:0)

我不是专家,但我认为有两种方法可以做到。

方法1

将该阶段的所有内容包装到主FXML /控制器文件/类中(作为视图)。然后你需要加载那个FXML文件两次,一次是在新阶段,另一次是你在主舞台准备的专用空间。

理想情况下,两个控制器实例的引用应保存在应用程序类或托管主阶段的类中的同一对象中。

从那里,你可以绑定值,让绑定API为你工作。

示例:

主要观点:

public class MainView {
    private Model model = new Model();
    private Pane space; // Dedicated space

    public void spawnView() {
        FXMLLoader spawnViewLoader = new FXMLLoader(getClass().getResource("View.fxml"));
        Parent spawnView = spawnViewLoader.load(); // Need to catch IOException
        ViewController spawnController = spawnViewLoader.getController();
        spawnController.setup(model);

        new Stage(new Scene(view));

        FXMLLoader dupViewLoader = new FXMLLoader(getClass().getResource("View.fxml"));
        Parent dupView = dupViewLoader.load(); // Need to catch IOException
        ViewController dupController = dupViewLoader.getController();
        dupController.setup(model);

        space.getChildren().setAll(dupView);
    }
}

型号:

public class Model {
    private final StringProperty title = new SimpleStringProperty();
    private final StringProperty titleProperty() { return title; }
    private final String getTitle() { return title.get(); }
    private final void setTitle(final String title) { this.title.set(title); }
}

查看控制器:

public class ViewController {
    @FXML private Label label;

    private Model model;

    public void setup(Model model) {
        if (model == null)
            throw new NullPointerException();

        this.model = model;
        label.textProperty().bind(model.titleProperty());
    }

    // Other stuff
}

虽然要小心绑定 - 我很确定无论我写的是什么都会导致内存泄漏;只要您持有model的引用,两个视图都不会清理。你总是可以在没有绑定的情况下完成它,但更新值会更加繁琐。

方法2

此方法更复杂,可能会慢几帧。我不打算发布示例代码,因为这不是那么简单。

您需要引用该阶段的Scene,并使用AnimationTimer来调用场景对象的snapshot方法。

然后,您需要在主阶段使用ImageView来显示返回的快照。

说真的,我认为这种方法会导致重复的View比原始的慢几帧。