2012-06-21 73 views
2

我在繪製多行時出現問題。代碼如下:重繪爲什麼只畫一條線?

public void paintComponent(Graphics g){ 
    Graphics2D g2d = (Graphics2D) g; 

    Map<Device, Device> devMap = matchEncDec(); 
    if(devMap != null){ 
     Iterator<?> it = devMap.entrySet().iterator(); 
     while(it.hasNext()){ 
      Map.Entry<Device, Device> pair = (Entry<Device, Device>) it.next(); 
      it.remove(); 

      g2d.setColor(Color.BLUE); 
      g2d.drawLine(pair.getKey().getLocationOnScreen().x + 150, pair.getKey().getLocationOnScreen().y, 
        pair.getValue().getLocationOnScreen().x + 150, pair.getValue().getLocationOnScreen().y); 

      g2d.drawLine(50, 50, 500, 550); 
     } 
    } 
} 

它只爲最後一對在HashMap和我添加的測試線繪製線。 在此先感謝您的幫助。

+2

是否matchEncDec每次都返回Map的新實例? –

回答

2

不要從迭代器中刪除這對。

it.remove(); 

這是一個未neccesary一步,如果這是一個臨時的HashMap,如果它是一個HashMap中重複使用它的一個關鍵問題。這會從底層hashmap中刪除該項目。因此,如果matchEncDec()正在返回正被重用的散列表,則只會繪製每行一次,因爲一旦它被繪製,該對將從散列表中刪除。

這將有助於看到matchEncDec()方法,但我只是檢查一下,看看你是否在每次調用時都返回一個對同一個hashmap的引用。如果是這樣的話,那肯定是問題所在。

+0

如果這不是問題,那麼在遍歷它之前檢查hashmap,以確保它實際上包含您認爲它的作用。它可能只包含一對,或者同一對重複一遍又一遍。無論哪種方式,如果你仍然有問題,它在'matchEncDec()'方法中。 –

+0

是的。即使比賽時多於一次,也只會畫一條線。好的,我仔細檢查matchEncDec()方法。 – SneakyMummin

+0

好的,問題確實在matchEncDec()中。顯然HashMap不能包含密鑰重複項:P repaint()工作正常。謝謝您的幫助。 – SneakyMummin

相關問題