2014-12-10 37 views
0

我試圖使用方法addBall進行繪製球與它自己的線程獻給coloredBallPanel添加一個線程對象到一個JPanel在Java中

我非常卡住,並會appreiciate任何幫助都沒有。

順便說一句我正在試圖使彈跳球程序中的所有球運行在自己的單獨線程。

public class ColoredBallPanel extends JPanel 
{ 
    Ball ball; 
    public ColoredBallPanel() 
    { 
     ball= new Ball(); 
    } 
    public void paintComponent(Graphics g) 
    { 
     Graphics2D g2 = (Graphics2D) g; 
     g2.setColor(Color.WHITE); 
     g2.fillRect(0, 0, 499, 300); 
//  ball.paint(g2); 

    } 
} 


import java.awt.BorderLayout; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
public class BallsFrame extends JFrame 
{ 
    private ColoredBallPanel coloredBallPanel; 
    private final int FRAME_WIDTH = 500; 
    private final int FRAME_HEIGHT = 500; 
    private int BallDimensionsx =30,BallDimensionsy=30; 
    private Ball ball = new Ball(); 
    public BallsFrame() 
    { 
     //sets the size of the JFrame 
     setSize(FRAME_WIDTH, FRAME_HEIGHT); 
     coloredBallPanel = new ColoredBallPanel();//Initialize a Ball panel 
     add(coloredBallPanel, BorderLayout.CENTER);//white square in the centre 
     addBall(); // add two balls to panel(Doesn't work yet) 
     addBall(); 

    } 

    public void addBall() 
    { 
     Ball ball = new Ball(); 
     coloredBallPanel.add(ball); 

     Runnable r = new ColoredBallRunnable(ball, coloredBallPanel); 
     Thread t = new Thread(r); 
     t.start(); 
    } 



} 





import java.awt.*; 

import javax.swing.*; 


public class Ball extends JComponent 
{ 
    private int x=(int) (Math.random()*(500 -1)), 
       y =(int) (Math.random()*(300-1)), 
       xVelocity=-10, 
       yVelocity=10; 
    private int width=30,height=30,size =30; 
    /** 
    * @param args 
    */ 
    public void update() 
    { 
     x+=xVelocity; 
     y+=yVelocity; 
     if(x<=0) 
     { 
      xVelocity =10; 
     } 
     else if(x+size>=500) 
     { 
      xVelocity = -10; 
     } 
     if(y<=0) 
     { 
      yVelocity =10; 
     } 
     else if (y+size>=300) 
     { 
      yVelocity=-10; 
     } 
    } 

    public void paint(Graphics g) 
    { 
     Graphics2D g2 = (Graphics2D) g; 
     g2.setColor(Color.GREEN); 
     g2.fillOval(x, y, width, height); 
    } 


} 

    import javax.swing.JComponent; 
import javax.swing.JPanel; 


public class ColoredBallRunnable implements Runnable 
{ 
    private Ball ball ; 
    public ColoredBallRunnable(Ball ball, ColoredBallPanel coloredBallPanel) 
    { 
     // TODO Auto-generated constructor stub 
     ball = new Ball(); 
     coloredBallPanel = new ColoredBallPanel(); 
    } 


    public void run() 
    { 
     Ball ball = new Ball(); 
     while(true) 
     { 
     ball.update(); 
     ball.repaint(); 
     try{ 
      Thread.sleep(10); 
     }catch(InterruptedException e){ 
      return; 
     } 
     } 
    } 

} 
+1

'ColoredBallRunnable'類在哪裏?考慮提供一個[可運行的示例](https://stackoverflow.com/help/mcve),它可以證明你的問題。這會減少混淆和更好的反應 – MadProgrammer 2014-12-11 00:08:13

+0

我在課堂上添加了 – timi95 2014-12-11 00:18:35

回答

2

有這麼多的問題...

  1. Ball的成分被添加到Container這是一個LayoutManager的控制之下,這意味着,即使你有Ball移動,你會一直與佈局管理器打架
  2. Ball沒有「大小」(或位置),所以當它被添加到Container時,它的大小設置爲默認大小0x0,使得它,v其實,無形
  3. Ball從不畫。這實際上有兩個原因,但我們將從明顯的開始,它不會覆蓋允許Swing繪製它的任何有效的繪製方法...如果它大於0x0

解決方案...?

  • Ball只是它知道它一個POJO的大小和位置(如果那是你所需要的可以自行更新)
  • 創建某種可以在視圖ColoredBallPanel和控制器之間的數據共享的「模式」 (線程)。這種模式應保持現有Ball的List ...
  • 通過球的這個列表允許ColoredBallPanel循環和油漆他們通過它paintComponent方法
  • 通過球的這個列表允許控制器循環和更新它們。
  • 同步對高爾夫球列表的訪問,因此無論是視圖還是控制器都可能會混淆列表而另一個正在使用它。你做的任何自定義塗裝

也許,更多的東西一樣之前,您可能會考慮在列表視圖的只讀版本,但可能超出範圍現在...

  • 呼叫super.paintComponentJava Bouncing Ball

  • +0

    希望它有幫助;) – MadProgrammer 2014-12-11 02:28:40

    相關問題