2015-12-29 20 views
0

今年我在學校開始java,我被要求創建一個程序,用3個線程繪製30個隨機圓圈(每個線程10個)。Java新手:我如何創建一個控制我的paintComponent方法的線程?

我不知道如何使用的paintComponent工作得很好,但這裏是我做了什麼:

class MioPanel extends JPanel implements Runnable { 

@Override 
public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    Dimension dimCerchio1 = new Dimension(50, 50); 

    for(int i = 0; i < 10; i++) { 
    g.setColor(Color.black); 
    g.drawOval((int) ((Math.random()*this.getWidth()) - (dimCerchio1.width)), (int) (Math.random()*this.getHeight() - (dimCerchio1.height)), dimCerchio1.width , dimCerchio1.height); 
    } 

    /*for(int i = 0; i < 10; i++) { 
    g.setColor(Color.red); 
    g.drawOval((int) ((Math.random()*this.getWidth()) - (dimCerchio1.width)), (int) (Math.random()*this.getHeight() - (dimCerchio1.height)), dimCerchio1.width , dimCerchio1.height); 
    } 

    for(int i = 0; i < 10; i++) { 
    g.setColor(Color.blue); 
    g.drawOval((int) ((Math.random()*this.getWidth()) - (dimCerchio1.width)), (int) (Math.random()*this.getHeight() - (dimCerchio1.height)), dimCerchio1.width , dimCerchio1.height); 
    }*/ 
}  

@Override 
public void run() { 

} 

中的run方法是空的「,因爲我真的不知道我怎麼能一起工作這兩個線程和油漆

這裏的主:

public class Main { 
    public static void main(String[] args) {   
    MFrame mframe = new MFrame("Cerchi casuali"); 

    Thread first = new Thread(new MioPanel()); 

    /*Thread second = new Thread(new MioPanel()); 

    Thread third = new Thread(new MioPanel());*/ 
    } 
} 

我希望得到任何幫助,對不起我的英語水平,如果事情是錯的。

+1

你不能這樣做。 Java的Swing組件不是線程安全的。您必須使用單個線程(即Event Dispatch Thread)來執行這些更新。 – markspace

+0

那我該怎麼做類似的事呢? – Jacopo

+0

這不是一個新手任務。這個任務似乎更適合於中級或高級Java類。 –

回答

0

你不要試圖把所有東西放在同一個班上。

  1. 創建一個在SwingUtilities invokeLater方法上啓動Swing組件的類。在這個類中創建JFrame。

  2. 創建一個擴展JPanel的DrawingPanel類。將DrawingPanel添加到JFrame。

  3. 創建一個Ball類,生成x和y中心和10個球的半徑。您可以使用java.awt.Point類來保存中心。這個類是一個Java對象。它除了保持球的中心和半徑外什麼都沒做。

  4. 創建一個實現Runnable的Drawing類。將Balls類的實例傳遞給Drawing類。

  5. 創建Drawing類的3個實例。將Drawing類的3個實例傳遞給DrawingPanel。在paintComponent方法中使用3個實例。 不要在paintComponent方法中繪製球。

  6. 將DrawingPanel的實例傳遞給Drawing類的3個實例。

  7. 在GUI完成後,啓動3個線程並使用這3個實例。

相關問題