java - JMapViewer: map 刚刚加载时未设置平移和缩放

标签 java zooming jmapviewer

我有两个自定义图像作为 JMapViewer 上的标记。我希望 map 设置正确的平移和缩放,以便两个标记在 map 显示上可见。我有一个按钮可以做到这一点。因此,发生的情况是 map 在加载时没有缩放到这些标记;但当我点击按钮时,它就会出现。有没有办法在加载时设置正确的平移和缩放?

public class PanelAcars extends javax.swing.JPanel implements JMapViewerEventListener  
{
    private final JMapViewerTree treeMap;

    public PanelAcars() 
    {
        super();
        initComponents(); // GUI components

        treeMap = new JMapViewerTree("Zones");

        // Listen to the map viewer for user operations so components will
        // receive events and update
        map().addJMVListener(this);

        setLayout(new BorderLayout());

        pnlAcarsMapView = new JPanel(new BorderLayout());
        JPanel panelTop = new JPanel();
        JPanel panelBottom = new JPanel();
        JPanel helpPanel = new JPanel();

        add(pnlAcarsMapView, BorderLayout.NORTH);
        add(helpPanel, BorderLayout.SOUTH);
        pnlAcarsMapView.add(panelTop, BorderLayout.NORTH);
        pnlAcarsMapView.add(panelBottom, BorderLayout.SOUTH);

        /* THIS BUTTON WORKS!!! */
        JButton button = new JButton("Zoom...");
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                map().setDisplayToFitMapMarkers();
            }
        });


        final JCheckBox showZoomControls = new JCheckBox("Show zoom controls");
        showZoomControls.setSelected(map().getZoomControlsVisible());
        showZoomControls.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                map().setZoomContolsVisible(showZoomControls.isSelected());
            }
        });
        panelBottom.add(showZoomControls);
        final JCheckBox scrollWrapEnabled = new JCheckBox("Scrollwrap enabled");
        scrollWrapEnabled.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                map().setScrollWrapEnabled(scrollWrapEnabled.isSelected());
            }
        });
        panelBottom.add(scrollWrapEnabled);
        panelBottom.add(button);

        add(treeMap, BorderLayout.CENTER);

        /* Add Airports to the map */
        LayerGroup mapGroupAirports = new LayerGroup("MapAirports");
        Layer mapLayerDep = mapGroupAirports.addLayer("MapDep");
        Layer mapLayerDest = mapGroupAirports.addLayer("MapDest");
        Layer mapLayerAlt = mapGroupAirports.addLayer("MapAlt");


        /* Add Plane to the map */
        Layer mapLayerPlane = new Layer("MapPlane");

        /* Set coordinates */
        Coordinate coordinatesPlane = new Coordinate(49.814284999, 98.642065999);
        Coordinate coordinatesDep = new Coordinate(23.814284999, 45.642065999);

        JMapViewerMarkerCustomImage markerPlane;
        JMapViewerMarkerCustomImage markerDep;

        Image imageMarkerPlane;
        Image imageMarkerDep;

        try 
        {
            imageMarkerPlane = ImageIO.read(this.getClass().getResource("/images/image1.png"));
            markerPlane = new JMapViewerMarkerCustomImage(coordinatesPlane,imageMarkerPlane);
            map().addMapMarker(markerPlane);

            imageMarkerDep = ImageIO.read(this.getClass().getResource("/images/image2.png"));
            markerDep = new JMapViewerMarkerCustomImage(coordinatesDep,imageMarkerDep);
            map().addMapMarker(markerDep);

            // AND THIS IS NOT WORKING AT LOADING!!!
            map().setDisplayToFitMapElements(true, true, true);

        } catch (IOException ex) {
            ex.printStackTrace();
        }


        map().addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                if (e.getButton() == MouseEvent.BUTTON1) {
                    map().getAttribution().handleAttribution(e.getPoint(), true);
                }
            }
        });

        map().addMouseMotionListener(new MouseAdapter() {
            @Override
            public void mouseMoved(MouseEvent e) {
                Point p = e.getPoint();
                boolean cursorHand = map().getAttribution().handleAttributionCursor(p);
                if (cursorHand) {
                    map().setCursor(new Cursor(Cursor.HAND_CURSOR));
                } else {
                    map().setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
                }
                //if (showToolTip.isSelected()) map().setToolTipText(map().getPosition(p).toString());
            }
        });

    }

非常感谢!

最佳答案

在 map 的 tileLoadingFinished() 实现中调用 setDisplayToFitMapMarkers()。使用 boolean 变量 loaded(默认情况下为 false),下面的实现在第一个图 block 加载后调用该方法;父实现将repaint()任何后续图 block 。

private boolean loaded;

private class MyViewer extends JMapViewer {

    @Override
    public void tileLoadingFinished(Tile tile, boolean success) {
        super.tileLoadingFinished(tile, success);
        if (!loaded & success) {
            loaded = true;
            setDisplayToFitMapMarkers();
        }
    }
    …
}

要使用 JMapViewerTree 获得类似的结果,您需要更改在 JMapViewerTree 构造函数中实例化的 map。以下更改适用于 Demo.java:

…
private boolean loaded;
…
public JMapViewerTree(String name, boolean treeVisible) {
    …
    map = new JMapViewer() {
        @Override
        public void tileLoadingFinished(Tile tile, boolean success) {
            super.tileLoadingFinished(tile, success);
            if (!loaded & success) {
                loaded = true;
                setDisplayToFitMapMarkers();
            }
        }
    };
    …
}

顺便说一句,考虑扩展或替换 DefaultMapController,而不是 MouseAdapter,如建议 here .

关于java - JMapViewer: map 刚刚加载时未设置平移和缩放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38944277/

相关文章:

java - 用 indexOf 检查双字母?

javascript - 了解 Vue 中的全景缩放

iphone - 如何让图像在我双击的地方缩放?

java - Openstreetmap 如何使用 Java 增加缩放粒度

java - jnlp 文件没有 .jnlp 扩展名? jnlp 负责启动沙箱吗?

java - 如何从非主类将变量返回到主类

java - 打开扬声器并不总是有效

Javascript Canvas : Apply zoom at given coordinates

java - 如何在 JMapViewer 中表示路由

Java JMapViewer : How can I change the color of a MapPolygon?