2014-04-17 40 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欢迎您! –