2012-07-24 61 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