Java Jpanel颜色未显示

Java Jpanel颜色未显示,java,swing,jpanel,paint,thread-sleep,Java,Swing,Jpanel,Paint,Thread Sleep,您好,我在学习2d图形,想制作这样的东西 我的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));

您好,我在学习2d图形,想制作这样的东西

我的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.");
        }
    }
   }
公共类动画扩展了JPanel{
私人ArrayList圈子;
动画(){
这个。设置大小(320240);
此.set不透明(true);
setBackground(新java.awt.Color(102255102));
圆圈=新的ArrayList();
}
公共空间涂料(图g){
Image dbImg=createImage(getWidth(),getHeight());
Graphics dbg=dbImg.getGraphics();
绘制(dbg);
g、 drawImage(dbImg,0,0,this);
}
公共空间绘制(图g){
对于(int i=0;i
这里的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);
  }
 }
公共类BouncingCircle实现Runnable{
私人INTX;
私营企业;
私人网络速度;
私人城市;
弹跳圈(){
x=0;
y=0;
x速度=2;
yVelocity=2;
}
公开募捐{
while(true){
move();
试一试{
睡眠(5);
}捕获(中断异常例外){
System.err.println(“错误:线程中断”);
}
}
}
私人空位移动(){
x+=x速度;
y+=y线性度;
if(x<0)
x速度=2;
如果(x>320)
x速度=-2;
if(y<0)
yVelocity=2;
如果(y>240)
yVelocity=-2;
}
虚线绘制(图形g){
g、 setColor(Color.RED);
g、 椭圆形(x,y,10,10);
}
}

但是它没有显示我用frame尝试过的背景色。添加(a)但仍然不起作用

验证,效果很好

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.");
            }
        }
    }
}
import java.util.ArrayList;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
公共类动画扩展了JPanel{
//私人ArrayList圈子;
动画(){
这个。设置大小(320240);
setBackground(新java.awt.Color(102255102));
//圆圈=新的ArrayList();
}
公共静态void main(字符串[]args){
JFrame=新JFrame(“游戏”);
frame.setVisible(true);
框架设置尺寸(320240);
frame.setresizeable(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
动画a=新动画();
frame.getContentPane().add(a);
对于(int i=0;i<5;i++){
//a.addCircle();
试一试{
睡眠(1000);
}捕获(中断异常例外){
System.err.println(“错误:线程中断”);
}
}
}
}

可能的原因是您重写了一个绘制方法,而没有调用其等效的超级方法

记住,画画做了很多重要的事情,比如在背景上喘气。 可能的原因是您重写了其中一个paint方法,而没有调用其等效的super方法

记住,画画做了很多重要的事情,比如在背景上喘气

请查看以了解更多详细信息

已更新

这就是你的问题

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

所以,摆脱
绘画
并使用

protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    draw(g);
}
相反。。。 查看更多详细信息

这将起作用:

    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();
    }
public void绘制(图形g){
超级油漆(g);
Image dbImg=createImage(getWidth(),getHeight());
Graphics dbg=dbImg.getGraphics();
绘制(dbg);
g、 drawImage(dbImg,0,0,null);
}
公共空间绘制(图g){
g、 setColor(新java.awt.Color(102255102));
g、 fillRect(0,0,getWidth(),getHeight());
对于(int i=0;i

如果在面板上绘制全尺寸图像,则应填充图像的背景

它适合我。但我删除了
a.addCircle();
行,因为我没有完整的
动画
类。该方法中可能有某种东西适合面板并隐藏背景线程。睡眠不会有帮助。你已经覆盖了Aniament面板中的一个绘制方法,你没有移动a.addCircle()无论如何,它不起作用是的,我重写了paint方法和draw方法是的,它起作用了,我将显示另一个类,问题似乎出在BouncingCircle上,我删除了a.addCircle(),但它没有显示背景color@user3544701看我的答案。是的,谢谢。我会继续学习绘画方法。谢谢你的帮助