2012-07-24 39 views
1

目前我正在一个swing应用程序,由一个框架与splitpanel组成。在左侧面板中,我有一个jtree,列出了世界上所有的国家,在右侧面板中我有一个OpenStreetMap,在启动时显示一张地图(哪个工作正常)。 的JTree的节点链接到的valueChanged(..)事件处理程序:摆动mappanel地图刷新

/** 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;它必须是this one

+0

随机重绘很少帮助:-)而且永远不会调用updateUI:它_not_意味着在应用程序代码(而不是,改变LAF时,它的内部使用)使用 – kleopatra 2012-07-25 08:15:59

+0

@kleopatra - 可能,但我在java教程中首先阅读了这些内容,并且他们在应用程序代码中使用绘画。说实话,我从来没有明白,绘画业务正常:) – jhulst 2012-07-25 14:26:47

+0

正在谈论这[链接](http://docs.oracle.com/javase/tutorial/uiswing/painting/step3.html) – jhulst 2012-07-25 14:33:04

回答

1

看起来您并没有将您创建的MapPanel实例添加到父容器中,如​​在valueChanged()方法中。

当调用valueChanged()方法时,您会调用drawOpenStreetMap()方法来创建MapPanel实例,但是,您没有将它添加到​​。这就是为什么地图的新位置没有出现。也许你需要插入类似下面的代码:

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. 
    ... 
+0

这确实是解决方案, 万分感谢!!我本以为只需在构造函数中将mappanel链接到rightpanel就足够了,并且会调用一些update/repaint/whatever来处理事件。但是,这工作。 – jhulst 2012-07-24 22:07:40

+0

+1发现:-)添加后,你必须调用revalidate来触发布局的更新。 @jhulst如果真的需要创建一个_new_ mapPanel,那么在添加新元素之前,您需要删除旧元素。如果MapPanel有更新位置的API,会更容易...是吗? – kleopatra 2012-07-25 08:19:50