2012-11-24 58 views
1

好吧,我真的不明白爲什麼這不起作用。另一個類中的鏈表可以從一個方法訪問,但不能從另一個方法訪問

class SketcherModel extends Observable implements Iterable<Element>{ 

    public Iterator<Element> iterator(){ 
     return elements.iterator(); 
    } 

    public LinkedList<Element> elements = new LinkedList<Element>(); 
} 

所以我在班裏Element在我的應用程序的「模型」部分的鏈表。我們的想法是,當該應用程序的「觀看」部分執行paint()方法,它會訪問鏈接的列表和繪製它包含的每個Element,如在下面的代碼所示:

public class SketcherView extends JComponent implements Observer{ 
    public SketcherView(Sketcher theApp){ 
     this.theApp = theApp; 

     //Testing to see if I can access the linked list, 'elements', outside of the paint() method; 
     Element test = theApp.getModel().elements.iterator().next() 
    } 

    public void update(Observable o, Object rectangle){ 
     //Code to respond to changes in model... 
    } 

    public void paint(Graphics g){ 
     Graphics2D g2D = (Graphics2D)g; 
     for(Element element : theApp.getModel()){ 
      element = (Element)elements.iterator().next(); 
      g2D.setPaint(element.getColor()); 
      g2D.draw(element.getShape()); 
     }  
    } 

現在,當訪問所述經鏈接列表elements從類構造函數它似乎沒有問題,但是當我使用基於集合的for循環通過使用迭代器運行elements它說'元素無法解析'。我錯過了什麼嗎?

回答

2
public void paint(Graphics g){ 
    Graphics2D g2D = (Graphics2D)g; 
    for(Element element : theApp.getModel()){ 
     element = (Element)elements.iterator().next(); 
     g2D.setPaint(element.getColor()); 
     g2D.draw(element.getShape()); 
    } 
} 

該方法中沒有任何elements變量。並且循環的當前元素已經在for循環中聲明。該代碼應該是

for(Element element : theApp.getModel()){ 
    g2D.setPaint(element.getColor()); 
    g2D.draw(element.getShape()); 
} 

另外,unrealated問題,是你應該重寫paintComponent(),而不是paint()

+0

感謝您解決問題,但即使我嘗試訪問'元素'通過保存在'element'中的'model'的時刻,我應該無法訪問嗎? (我想知道爲什麼它不起作用,所以我不會再犯同樣的錯誤) 此外,當使用'paint()'而不是'paintComponent()'需要? –

+0

由於'elements'是模型的公共字段,因此可以將該循環寫爲for(Element element:theApp.getModel()。elements)',或者作爲'List elements = theApp.getModel()。elements; for(Element element:elements)'。 AFAIK,'paint()'不應該被Swing組件覆蓋。 –

+0

非常感謝,謝謝 –