如何创建通过WorldMapView在线显示所有可用用户的地图?

时间:2019-01-14 14:44:21

标签: java controlsfx

正如标题所述,我一直在使用ControlsFX依赖项中提供的WorldMapView,但是遇到内存问题...

我的服务器发送每个在线用户的{纬度,经度}列表。我要做的是创建一个Location对象列表,并将其添加到WorldMapView的ListProperty中。

// Attributes
public static ScheduledExecutorService EXECUTOR = Executors.newScheduledThreadPool(1);

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

@Override
public void start(Stage stage) throws Exception{
    BorderPane contentPane = new BorderPane();
    contentPane.setBackground(new Background(new BackgroundFill(Color.BLACK, null, null)));

    WorldMapView worldMapView = new WorldMapView();
    worldMapView.setCountryViewFactory((country) -> {
        CountryView view = new CountryView(country);
        Color fillColor = Color.BLACK;
        view.fillProperty().set(Color.BLACK);
        view.strokeProperty().set(fillColor);
        view.strokeWidthProperty().set(1);
        return view;
    });

    worldMapView.getLocations().add(new Location(0, 0));
    worldMapView.setLocationViewFactory(location -> {
        Circle circle = new Circle();
        Color fillColor = Color.BLACK;
        circle.setFill(fillColor);
        circle.setRadius(8);
        circle.setTranslateX(-4);
        // translate to center node on location
        circle.setTranslateY(-4);
        // translate to center node on location
        return circle;
    });

    contentPane.setCenter(worldMapView);
    stage.setScene(new Scene(contentPane, 500, 500));
    stage.show();

    EXECUTOR.scheduleAtFixedRate(() -> {
        List<Location> locations = IntStream.range(0, 50).boxed().map((value) -> {
            return new Location(generateRandomDoubleInRange(60, -60), generateRandomDoubleInRange(120, -120));
        }).collect(Collectors.toList());
        Platform.runLater(() -> {
            worldMapView.locationsProperty().clear();
            worldMapView.locationsProperty().addAll(locations);
        });
    }, 0, 500, TimeUnit.MILLISECONDS);
}

我希望它在清除列表后能够清除Circle对象,但事实并非如此。似乎可以做到这一点,但是超时对象Circle并没有得到清理,最终程序使用了与允许的最大内存一样多的内存(尽管不会出错)。这需要一段时间(大约需要6分钟才能获得完整图片;使用我提供的代码)。 https://github.com/controlsfx/controlsfx/issues/1091我创建了一个问题报告,但老实说,它甚至可能不是bug,所以我决定来这里。

我还应该注意,我加快了时间,以便您更快地看到它。在我的普通程序中,我将更新设置为15秒左右。花费15秒钟才能看到GUI冻结,但最终确实会发生。

0 个答案:

没有答案