2016-02-06 79 views
0

我已經通過併爲我的對象創建了類並在我的繪畫組件中調用了它們,但我實際上無法讓它們移動。這是我的舉動和檢查牆壁程序,它是在Object類中:動畫繪製對象

public void move() 
{ 
    ballX += dx; 
    ballY += dy; 

    checkWalls(); 
} 

//bounce of top/bottom, pass through left/right 
public void checkWalls() { 
    //left-right 
    if(ballX > w) { 
     ballX = -diam; 
    } 
    else if(ballX < -diam) { 
     ballX = w; 
    } 

    //top-bottom 
    if(ballY < 0) { 
     dy *= -1; 
    } 
    else if(ballY + diam > h) { 
     dy *= -1; 
    } 
} 

,這裏是我的電話給他們:

while(true) // infinite loop 
{ 
    jelly1.move(); 

    frame.repaint(); 

    try 
    { 
     Thread.sleep(10); 
    } 
    catch(Exception e){} 
} 

此外,我覺得有必要提我有一個背景和一個背景成分。 while(true)位於後臺組件中,因爲這是創建對象的位置。並且框架在主要方法的背景中設置爲可見。

塗料成份如下:

public class BackgroundComponent extends JComponent { 
    Jellyfish jelly1; 
    Jellyfish jelly2; 
    Jellyfish jelly3; 
    Diver diver; 

    public BackgroundComponent() { 
     diver = new Diver(100, 300); 
     jelly1 = new Jellyfish(450, 450); 
     jelly2 = new Jellyfish(150, 300); 
     jelly3 = new Jellyfish(350, 75); 
     diver = new Diver(100, 300); 
    } 


    public void paintComponent(Graphics g){ 
     //Drawing instructions go here 
     //Recover Graphics2D 
     Graphics2D g2 = (Graphics2D)g; 
     //Make gradient 
     g2.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); 
     int w = getWidth(); 
     int h = getHeight(); 
     Color color1 = Color.CYAN; 
     Color color2 = Color.BLACK; 
     GradientPaint gp = new GradientPaint(0, 0, color1, 0, h, color2); 
     g2.setPaint(gp); 
     g2.fillRect(0, 0, w, h); 
     //Constructs rectangles on edge of screen and draws them 
     Rectangle box = new Rectangle(0,0,75,700); 
     g.setColor(Color.LIGHT_GRAY); 
     g2.fill(box); 
     Rectangle box2 = new Rectangle(625, 0, 75, 700); 
     g.setColor(Color.LIGHT_GRAY); 
     g2.fill(box2); 
     //Draws lines, with a stroke of 5, over rectangles 
     Line2D.Double segment = new Line2D.Double(10, 0, 10, 700); 
     g2.setStroke(new BasicStroke(5)); 
     g.setColor(Color.GRAY); 
     g2.draw(segment); 
     Line2D.Double segment2 = new Line2D.Double(30, 0, 30, 700); 
     g.setColor(Color.GRAY); 
     g2.draw(segment2); 
     Line2D.Double segment3 = new Line2D.Double(50, 0, 50, 700); 
     g.setColor(Color.GRAY); 
     g2.draw(segment3); 
     Line2D.Double segment4 = new Line2D.Double(70, 0, 70, 700); 
     g.setColor(Color.GRAY); 
     g2.draw(segment4); 
     Line2D.Double segment5 = new Line2D.Double(690, 0, 690, 700); 
     g.setColor(Color.GRAY); 
     g2.draw(segment5); 
     Line2D.Double segment6 = new Line2D.Double(670, 0, 670, 700); 
     g.setColor(Color.GRAY); 
     g2.draw(segment6); 
     Line2D.Double segment7 = new Line2D.Double(650, 0, 650, 700); 
     g.setColor(Color.GRAY); 
     g2.draw(segment7); 
     Line2D.Double segment8 = new Line2D.Double(630, 0, 630, 700); 
     g.setColor(Color.GRAY); 
     g2.draw(segment8); 
     //Draws rectangle around title with thick boarder 
     Rectangle box3 = new Rectangle(40,40,620,75); 
     g.setColor(Color.WHITE); 
     g2.setStroke(new BasicStroke(5)); 
     g2.draw(box3); 
     //Drawing text 
     String title = "Through the Depths"; 
     //Sets font, font size, and color 
     g.setFont(new Font("Purisa", Font.BOLD, 50)); 
     g.setColor(Color.DARK_GRAY); 
     g2.drawString(title, (50), 100); 
     //Places same text slightly up and over 
     g.setFont(new Font("Purisa", Font.BOLD, 50)); 
     g.setColor(Color.WHITE); 
     g2.drawString(title, 53, 97); 
     //Draws ellipses with a stroke of 2 (these are the bubbles) 
     Ellipse2D.Double ellipse = new Ellipse2D.Double(450, 200, 150, 150); 
     g2.setStroke(new BasicStroke(2)); 
     g2.draw(ellipse); 
     Ellipse2D.Double ellipse2 = new Ellipse2D.Double(510, 375, 90, 90); 
     g2.draw(ellipse2); 
     Ellipse2D.Double ellipse3 = new Ellipse2D.Double(470, 485, 70, 70); 
     g2.draw(ellipse3); 
     Ellipse2D.Double ellipse4 = new Ellipse2D.Double(510, 580, 45, 45); 
     g2.draw(ellipse4); 
     // Draws curves for bubbles 
     QuadCurve2D q = new QuadCurve2D.Float(); 
     q.setCurve(548, 210, 607, 240, 590, 295); 
     g2.setStroke(new BasicStroke(3)); 
     g2.draw(q); 
     QuadCurve2D q2 = new QuadCurve2D.Float(); 
     q2.setCurve(575, 387, 607, 415, 585, 445); 
     g2.draw(q2); 
     QuadCurve2D q3 = new QuadCurve2D.Float(); 
     g2.setStroke(new BasicStroke(2)); 
     q3.setCurve(515, 493, 545, 511, 528, 540);  
     g2.draw(q3); 
     QuadCurve2D q4 = new QuadCurve2D.Float(); 
     g2.setStroke(new BasicStroke(1)); 
     q4.setCurve(538, 585, 558, 595, 545, 617); 
     g2.draw(q4); 
     // Sets color to pink before drawing jellyfish 
     g.setColor(Color.PINK); 
     //draws jellyfish 
     jelly1.draw(g); 
     jelly2.draw(g); 
     jelly3.draw(g); 
     // Draws diver 
     diver.draw(g); 
     while(true) // infinite loop 
     { 
     jelly1.move(); 


     repaint(); 

     try 
     { 
     Thread.sleep(10); 
     } 
     catch(Exception e){} 
     } 
     } 
} 
+0

BTW:'ballX = ballX%windowWidth'將使它環繞 –

+2

'while(true)'運行的線程是什麼?這是非常重要的信息。 (編輯:我們也缺少你的繪畫例程,請參閱http://stackoverflow.com/help/mcve。) – Radiodef

+0

它運行在後臺組件上。而且我沒有包含油漆成分,因爲它有點長,因爲它也有我所有的其他物體。即時嘗試移動一個對象,然後再移動到下一個 –

回答

1

while(true){ ... }Thread.Sleep一個paintComponent實現內部完全是做事的方式不對。通過這樣做,您完全阻止了Event Dispatching Thread這意味着您的用戶界面將不再被正確更新,用戶界面將不再響應。

你應該做的:

  • paintComponent覆蓋
  • 取出while(true){ ... }循環創建javax.swing.Timer,將其設置爲每10毫秒
  • ActionListener.actionPerformed實施 - 這將是行動每10毫秒執行一次 - 移動果凍並呼叫repaint
  • 初始化後啓動此計時器例如在構造函數或初始化方法(而不是paintComponent)的末尾完成。
  • 停止時,它不再需要

簡化的例子此定時器,根據您的片斷定時器:

new javax.swing.Timer(10, new ActionListener() { 
    @override 
    public void actionPerformed(ActionEvent e) { 
     jelly1.move(); 
     repaint(); 
    } 
}).start();