2013-11-23 87 views
0

我學習在學校隊列和具有我們的實驗室中的一個問題,我相信這個問題是這裏的問題是,它不會達到50部分未正確執行

public void paint(Graphics g) 
    { 
     int incX = 5; // initial x increment for circle locations 
     int incY = 5; // initial y increment for circle locations 

     Coord temp = new Coord(0,0); 
     Queue<Coord> q = new LinkedList<Coord>(); 

     Circle c = new Circle(g,circleSize,incX,incY,TIME_DELAY); 
     try 
     { 
      for(int i = 1; i <= TOTAL_NUM_CIRCLES; i++) 
      { 
       if(q.size() >= 50) 
       { 
        temp = q.remove(); 
        c.eraseCircle(g,temp.getX(),temp.getY()); 
       } 
       temp = new Coord(getX(),getY()); 
       q.add(temp); 
       c.drawCircle(g); 
       c.hitEdge(); 
      } 
     } 
     catch(InterruptedException e){} 
    } 
後擦除圈

,如果您需要整個事情運行或測試這裏是它的所有與評論說什麼一切都和我想要做的

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import java.util.*; 


/** 
* Creates an instance of the GfxApp class, which uses the Circle class, Coord class, and 
* a queue to create a screen saver. 
* @param args not used 
*/ 
public class ScreenSaver 
{ 
    public static void main(String args[]) 
    { 
     GfxApp gfx = new GfxApp(); 
    } 
} 


/** 
* Creates a Screen Saver by placing Circle coordinates in a queue 
*/ 
class GfxApp extends JFrame 
{ 

    private int circleCount, circleSize; 
    public static final int TIME_DELAY = 10; // controls the speed 
    public static final int TOTAL_NUM_CIRCLES = 1000; // controls how long it goes 

    /** 
    * Creates a GfxApp with 50 circles with diameter 30 
    */ 
    public GfxApp() 
    { 
     circleCount = 50; 
     circleSize = 30; 

     setSize(800,600); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setVisible(true); 
    } 

    /** 
    * Draws a stream of circleCount circles of size circleSize. Uses a queue to erase circles 
    * at the end of the stream. The total number of circles that will be drawn is 2000. 
    * @param g the Graphics object 
    */ 
    public void paint(Graphics g) 
    { 
     int incX = 5; // initial x increment for circle locations 
     int incY = 5; // initial y increment for circle locations 

     Coord temp = new Coord(0,0); 
     Queue<Coord> q = new LinkedList<Coord>(); 

     Circle c = new Circle(g,circleSize,incX,incY,TIME_DELAY); 
     try 
     { 
      for(int i = 1; i <= TOTAL_NUM_CIRCLES; i++) 
      { 
       if(q.size() >= 50) 
       { 
        temp = q.remove(); 
        c.eraseCircle(g,temp.getY(),temp.getX()); 
       } 
       temp = new Coord(getX(),getY()); 
       q.add(temp); 
       c.drawCircle(g); 
       c.hitEdge(); 
      } 
     } 
     catch(InterruptedException e){} 
    } 
} 


/** 
* A class to represent Circle objects. Circles can be drawn and erased. 
*/ 
class Circle 
{ 
    private int tlX;  // top-left X coordinate 
    private int tlY;  // top-left Y coordinate 
    private int incX;  // increment movement of X coordinate 
    private int incY;  // increment movement of Y coordinate 
    private boolean addX; // flag to determine add/subtract of increment for X 
    private boolean addY; // flag to determine add/subtract of increment for Y 
    private int size;  // diameter of the circle 
    private int timeDelay; // time delay until next circle is drawn 

    /** 
    * Creates a Circle with a specified Graphics, size, x increment, y increment and time delay 
    */ 
    public Circle(Graphics g, int s, int x, int y, int td) 
    { 
     incX = x; 
     incY = y; 
     size = s; 
     addX = true; 
     addY = false; 
     tlX = 400; 
     tlY = 300; 
     timeDelay = td; 
    } 
    /** 
    * returns the top left X of this circle 
    * @return tlX 
    */ 
    public int getTLX() { return tlX;} 

    /** 
    * returns the top left Y of this circle 
    * @return tlY 
    */ 
    public int getTLY() { return tlY;} 


    /** 
    * delays the program for a specified number of miliseconds 
    * @param n number of miliseconds 
    */ 
    public void delay(int n) throws InterruptedException 
    { 
     Thread.sleep(n); 
    } 

    /** 
    * draws a blue circle and sets the tlX and tlY for the next drawing 
    * @param g Graphics object 
    */ 
    public void drawCircle(Graphics g) throws InterruptedException 
    { 
     g.setColor(Color.blue); 
     g.drawOval(tlX,tlY,size,size); 
     delay(timeDelay); 
     if (addX) 
      tlX+=incX; 
     else 
      tlX-=incX; 
     if (addY) 
      tlY+=incY; 
     else 
      tlY-=incY; 
    } 

    /** 
    * Randomly sets a new direction for the circle by randomly setting 
    * the x increment and y increment 
    */ 
    public void newData() 
    { 
     incX = (int) Math.round(Math.random() * 7 + 5); 
     incY = (int) Math.round(Math.random() * 7 + 5); 
    } 

    /** 
    * Determines if any of the four edges have been hit, and if so, reverses the 
    * appropriate flags (addX and addY) and calls newData 
    */ 
    public void hitEdge() 
    { 
     boolean a = false; 
     if (tlX < incX) 
     { 
      addX = true; 
      a = true; 
     } 
     if (tlX > 800 - (30 + incX)) 
     { 
      addX = false; 
      a = true; 
     } 
     if (tlY < incY + 30) 
     { 
      addY = true; 
      a = true; 
     } 
     if (tlY > 600 - (30 + incY)) 
     { 
      addY = false; 
      a = true; 
     } 
     if (a) 
      newData(); 
     } 

    // add an eraseCircle method 
    public void eraseCircle(Graphics g, int x, int y) 
    { 
     g.setColor(Color.black); 
     g.drawOval(x,y,size,size); 
    } 
} 


// Create a Coord class, so that coordinates of drawn circles can be placed in the queue. 
// As coordinates are removed from the queue, circles are erased with eraseCircle. 

class Coord 
{ 

    private int x; 
    private int y; 

    public Coord(int a, int b) 
    { 
      x=a; 
      y=b; 
    } 
    public int getX(){return x;} 
    public int getY(){return y;} 
    public int setX(int a){x=a; return x;} 
    public int setY(int b){y=b; return y;} 
} 
+0

你可以嘗試調試,以確定問題是什麼... –

回答

0

你的座標是倒退:

-public void eraseCircle(Graphics g, int x, int y) 
-c.eraseCircle(g,temp.getY(),temp.getX()); 

切換x和y,它應該工作。

編輯: 好了,所以這個問題是x和y在COORDS總是0,所以我修改了畫圓的方法來返回正確的座標,並存儲它們的繪製方法,所以這是你會得到什麼:

油漆:

public void paint(Graphics g) 
{ 
    int incX = 5; // initial x increment for circle locations 
    int incY = 5; // initial y increment for circle locations 

    Coord temp = new Coord(0,0); 
    Queue<Coord> q = new LinkedList<Coord>(); 

    Circle c = new Circle(g,circleSize,incX,incY,TIME_DELAY); 
    try 
    { 
     for(int i = 1; i <= TOTAL_NUM_CIRCLES; i++) 
     { 
      if(q.size() >= 50) 
      { 
       temp = q.remove(); 
       c.eraseCircle(g,temp.getX(),temp.getY()); 
      } 
      temp = new Coord(getX(),getY()); 
      //q.add(temp); 
      q.add(c.drawCircle(g)); 
      c.hitEdge(); 
     } 
    } 
    catch(InterruptedException e){} 
} 

畫圓:

/** 
* draws a blue circle and sets the tlX and tlY for the next drawing 
* @param g Graphics object 
* @return 
*/ 
public Coord drawCircle(Graphics g) throws InterruptedException 
{ 
    g.setColor(Color.blue); 
    g.drawOval(tlX,tlY,size,size); 
    delay(timeDelay); 
    if (addX) 
     tlX+=incX; 
    else 
     tlX-=incX; 
    if (addY) 
     tlY+=incY; 
    else 
     tlY-=incY; 
    return new Coord(tlX, tlY); 
} 

要確定這一點,我設定在paint方法斷點,看什麼temp的值是通過日食調試器。

+0

它仍然沒有工作,我必須切換它們,當我試圖修復它,謝謝 – user3025774

+0

它似乎試圖工作,我試圖讓它在我的本地機器上工作,但我看到它試圖放置一個橢圓形(看起來像錯誤的地方) – Sean

+0

現在解決方案已發佈 – Sean