2014-04-17 64 views
0

你好,我正在研究關於2D圖形,並希望讓這樣的事情 http://i60.tinypic.com/71tm37.png的Java JPanel的顏色沒有出現

我對JPanel的框架和聲明代碼是這樣的:

public class Animation extends JPanel { 
private ArrayList<BouncingCircle> circles; 
Animation() { 
this.setSize(320, 240); 
this.setOpaque(true); 
this.setBackground(new java.awt.Color(102, 255, 102));  
circles = new ArrayList<BouncingCircle>(); 
} 

public void paint(Graphics g) { 
    Image dbImg = createImage(getWidth(), getHeight()); 
    Graphics dbg = dbImg.getGraphics(); 
    draw(dbg); 
    g.drawImage(dbImg, 0, 0, this); 
} 

public void draw(Graphics g) { 
    for (int i = 0; i < circles.size(); i++) { 
     BouncingCircle bc = circles.get(i); 
     bc.draw(g); 
    } 
    repaint(); 
} 

private void addCircle() { 
    BouncingCircle bc = new BouncingCircle(); 
    circles.add(bc); 
    Thread t = new Thread(bc); 
    t.start(); 
} 
public static void main(String[] args) { 
    JFrame frame = new JFrame("Game"); 
    frame.setVisible(true); 
    frame.setSize(320,240); 
    frame.setResizable(true); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    Animation a = new Animation(); 
    frame.getContentPane().add(a); 
    for (int i = 0; i < 5; i++) { 
     a.addCircle(); 
     try { 
      Thread.sleep(1000); 
     } catch (InterruptedException ex) { 
      System.err.println("Error: Thread Interrupted."); 
     } 
    } 
    } 

的BouncingCircle這裏類:

public class BouncingCircle implements Runnable { 
private int x; 
private int y; 
private int xVelocity; 
private int yVelocity; 

BouncingCircle() { 
    x = 0; 
    y = 0; 
    xVelocity = 2; 
    yVelocity = 2; 
} 

public void run() { 
    while (true) { 
     move(); 
     try { 
      Thread.sleep(5); 
     } catch (InterruptedException ex) { 
      System.err.println("Error: Thread Interrupted."); 
     } 
    } 
} 

private void move() { 
x += xVelocity; 
y += yVelocity; 
if (x < 0) 
    xVelocity = 2; 
if (x > 320) 
    xVelocity = -2; 
if (y < 0) 
    yVelocity = 2; 
if (y > 240) 
    yVelocity = -2; 
} 

void draw(Graphics g) { 
    g.setColor(Color.RED); 
    g.fillOval(x, y, 10, 10); 
    } 
} 

但它不顯示我試圖與frame.add的的backgroundColor(一),但仍無法正常工作

+0

它適合我。但是我刪除了'a.addCircle();'行,因爲我沒有完整的'Animation'類。可能有一種方法適合面板和隱藏背景 – BackSlash

+0

Thread.sleep不會幫助。你已經覆蓋了你的Aniamtion面板中的一種繪畫方法嗎?不是 – MadProgrammer

+0

被刪除了a.addCircle(),反正它沒有工作 – HkGDota

回答

0

可能的原因是您重寫了其中一種繪畫方法,並未調用其等效的超級方法。

記得油漆做了很多重要的事情,比如喘氣的背景。 可能的原因是你重寫了其中一種繪畫方法,而沒有調用其等價的超級方法。

記得油漆做了很多重要的事情,比如喘氣的背景。

看看Performing Customing Painting更多細節

更新

這是你的問題就在這裏......

public void paint(Graphics g) { 
    Image dbImg = createImage(getWidth(), getHeight()); 
    Graphics dbg = dbImg.getGraphics(); 
    draw(dbg); 
    g.drawImage(dbImg, 0, 0, this); 
} 

的基本問題是,你已經打破油漆這意味着繪畫所做的所有重要工作,如繪製背景,都沒有完成。

另外,Swing組件已經被雙緩衝,所以你不需要使用createImage,你不應該重寫paint,而是paintComponent

所以,擺脫paint和使用...

protected void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    draw(g); 
} 

,而不是... 看看Performing Customing Painting更多細節

+0

好吧我正在閱讀它現在會繼續謝謝 – HkGDota

0

已驗證,工作正常!

import java.util.ArrayList; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Animation extends JPanel { 
    // private ArrayList<BouncingCircle> circles; 

    Animation() { 
     this.setSize(320, 240); 
     this.setBackground(new java.awt.Color(102, 255, 102)); 
     // circles = new ArrayList<BouncingCircle>(); 
    } 

    public static void main(String[] args) { 
     JFrame frame = new JFrame("Game"); 
     frame.setVisible(true); 
     frame.setSize(320, 240); 
     frame.setResizable(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     Animation a = new Animation(); 
     frame.getContentPane().add(a); 
     for (int i = 0; i < 5; i++) { 
      // a.addCircle(); 
      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException ex) { 
       System.err.println("Error: Thread Interrupted."); 
      } 
     } 
    } 
} 
+0

是的,它的工作,我會顯示其他類看起來像問題是在BouncingCircle,我刪除了。addCircle()但它沒有顯示背景顏色 – HkGDota

+0

@ user3544701我需要看完整的代碼,然後! –

+0

完成我添加完整的代碼 – HkGDota

0

這會工作:

public void paint(Graphics g) { 
     super.paint(g); 
     Image dbImg = createImage(getWidth(), getHeight());  
     Graphics dbg = dbImg.getGraphics(); 
     draw(dbg); 
     g.drawImage(dbImg, 0, 0, null); 
    } 

    public void draw(Graphics g) { 
     g.setColor(new java.awt.Color(102, 255, 102)); 
     g.fillRect(0, 0, getWidth(), getHeight()); 
     for (int i = 0; i < circles.size(); i++) { 
      BouncingCircle bc = circles.get(i); 
      bc.draw(g); 
     } 
     repaint(); 
    } 

如果你畫在你的面板全尺寸的圖像,你應該填充圖像的背景然後。

+0

是的工作謝謝我將繼續研究塗料方法感謝您的幫助 – HkGDota

+0

@ user3544701歡迎您! –