目前,我正在开发秋千应用程序,该应用程序包括带有拆分面板的框架。在左侧面板中,我有一个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;
}
单击jtree节点时将调用valueChanged方法,而确实调用了drawOpenStreetMap,我希望地图能够更新并显示新位置。但是什么都没有改变。启动时创建的地图保持不变。 valueChange方法的代码显示了许多repaint()调用等。我尝试过,但无济于事。
这是MapPanel源代码的指针。
如果有人可以告诉我如何更新地图,那将是很棒的。提前致谢!
后记:我指的是错误的MapPanel;它必须是this one。
最佳答案
似乎您没有将创建的MapPanel实例添加到SplitPanel
方法中的父容器(如valueChanged()
)。
调用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.
...