Java Jpanel颜色未显示
您好,我在学习2d图形,想制作这样的东西 我的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));
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看我的答案。是的,谢谢。我会继续学习绘画方法。谢谢你的帮助