2013-07-19 51 views
1

當我運行它時,重繪不起作用。該框架打開並保持2000毫秒,然後關閉。否則,如果我刪除System.exit(0);聲明,它並沒有關閉,但彩繪的球仍然沒有出現。在Java中移動球

BallWorld.java

import java.awt.*; 
import javax.swing.JFrame; 

public class BallWorld extends Frame { 

public static void main(String[] args) { 

    BallWorld bw1 = new BallWorld(Color.red); 
    bw1.show(); 


} 

public static final int framewidth = 600; 
public static final int frameheight = 400; 

private Ball aball; 
private int counter = 0; 

private BallWorld(Color ballColor){ 

    setSize(framewidth,frameheight); 
    setTitle("Ball World"); 

    aball = new Ball(10, 15, 5); 
    aball.setColor(ballColor); 
    aball.setMotion(3.0, 6.0); 

} 


public void paint(Graphics g){ 

    aball.paint1(g); 

    aball.move(); 


    if((aball.x() < 0) || (aball.x() > framewidth)) 

     aball.setMotion(-aball.xMotion(), aball.yMotion()); 

    if((aball.yMotion() < 0) || (aball.yMotion() > frameheight)) 

     aball.setMotion(aball.xMotion(),-aball.yMotion()); 

    //redraw the frame 

    counter = counter + 1; 

    if(counter < 2000) 
    repaint(); 
    else 
     System.exit(0); 
} 
} 

另一類是

Ball.java

import java.awt.*; 
import java.awt.Rectangle; 

public class Ball { 

protected Rectangle location; 
protected double dx,dy; 
protected Color color; 



public Ball(int x,int y, int r){ 

    location =new Rectangle(x-r, y-r, 2*r, 2*r); 

    dx=0; //initially no motion 
    dy=0; 
    color = Color.blue; 
} 

// Setters 
public void setColor(Color newColor){ 
    color = newColor; 
} 

public void setMotion(double new_dx, double new_dy){ 
    dx = new_dx; 
    dy = new_dy; 
} 


//Getters 

public int radius(){  
    return location.width/2; 
} 

public int x(){ 
    return location.x + radius(); 
} 

public int y(){ 
    return location.y + radius(); 
} 

public double xMotion(){ 
    return dx; 
} 

public double yMotion(){  
    return dy; 
} 

public Rectangle region(){ 
    return location; 
} 

//Methods that change attributes of the ball 

public void moveTo(int x, int y){ 
    location.setLocation(x, y); 
} 

public void move(){ 
    location.translate((int) dx,(int) dy); 
} 

public void paint1(Graphics g){ 

    g.setColor(color); 
    g.fillOval(location.x, location.y,location.width,location.height); 
} 
} 

回答

3
  1. 使用Swing不是AWT,AWT基本上obsolute
  2. 不要覆蓋頂級容器的paint,實際上就是tepped到的,爲什麼你不應該
  3. 不要叫repaint,或者可以稱之爲repaint任何paint方法中的任何方法的原因之一,它會創建一個無限循環,這將消耗你的CPU
  4. 繪畫處於被動AWT/Swing的。這意味着更新會根據更改發生在不規則的時間間隔,例如鼠標移動或框架大小的更改。

現在,到您的問題的核心。基本上,你在畫框下裝飾畫。出現這種情況的原因是窗口在其可見區域內添加了裝飾,而不是添加到其中。

更多細節

這就是爲什麼我們建議您不要覆蓋頂層容器的塗料見How to get the EXACT middle of a screen, even when re-sizedHow can I set in the midst?。你需要創建一個組件,可以添加到框架,然後你可以繪製

+0

我已經將我的BallWorld類擴展到JPanel並添加到JFrame中。現在它顯示了一條直線,而不是一個移動的球。仍然有repaint()或什麼問題?請幫忙!! –

+0

你沒有打電話super.paintCompoonet,假設你的覆蓋paintComponent – MadProgrammer

+0

非常感謝你,它幫助了很多! –