1

目前我正在开发一个摇摆应用程序,由一个带有拆分面板的框架组成。在左侧面板中,我有一个 jtree,列出了世界上所有的国家,在右侧面板中,我有一个 OpenStreetMap,在启动时显示了一张地图(有效)。jtree 的节点链接到 valueChanged(..) 事件处理程序:

/** Required by TreeSelectionListener interface. */
public void valueChanged(TreeSelectionEvent e) {
    DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();

    mapPanel = drawOpenStreetMap(45, 65, 12);
    mapPanel.repaint();
    repaint();
    splitPane.repaint();
    repaint();
    updateUI();
}

MapPanel drawOpenStreetMap(double lon, double lat, int zoom) {
    mapPanel = new MapPanel(); // just a JPanel extension, add to any swing/awt container
    mapPanel.setZoom(zoom); // set some zoom level (1-18 are valid)
    Point position = mapPanel.computePosition(new Point2D.Double(lon, lat));
    mapPanel.setCenterPosition(position); // sets to the computed position
    mapPanel.repaint(); // if already visible trigger a repaint here
    return mapPanel;
}

valueChanged 方法在单击 jtree 节点时被调用,而 drawOpenStreetMap 确实被调用,我希望地图能够更新并显示新位置。但没有任何改变。启动时创建的地图保持可见不变。valueChange 方法的代码显示了许多 repaint() 调用等。我尝试过,但无济于事。

这是指向MapPanel源代码的指针。

如果有人能告诉我如何更新地图,那就太好了。提前致谢!

后记:我指错了MapPanel;一定是这个

4

1 回答 1

1

似乎您没有像SplitPanelvalueChanged()方法中那样将创建的 MapPanel 实例添加到父容器中。

调用方法时valueChanged(),您调用drawOpenStreetMap()方法来创建MapPanel实例,但是,您没有将其添加到SplitPanel. 这就是为什么地图的新位置没有出现的原因。也许您需要插入如下代码:

public void valueChanged(TreeSelectionEvent e) {
    DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();

    mapPanel = drawOpenStreetMap(45, 65, 12);
    rightPanel.add(mapPanel); // rightPanel is the panel in the right side of split pane.
    ... 
于 2012-07-24T21:49:21.997 回答