java编程:为什么repaint()没有调用update呢?
【功能】绘制一个横着动的小球【问题】如题!小球动不起来【代码】importjava.awt.Color;importjava.awt.Graphics;importjav...
【功能】绘制一个横着动的小球
【问题】如题!小球动不起来
【代码】
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.*;
/*
* Panel to display the picture.
*/
class MyPanel extends JPanel{
public int x=50;
public int y=50;
Color ballColor;
Runnable mbr;
Thread mbt;
MyPanel(){
this.setVisible(true);
mbr=new MoveBall();
mbt=new Thread(mbr);
mbt.start();
}
public void update(Graphics g){
g.setColor(Color.ORANGE);
g.fillRect(0, 0, 600, 500);
x+=50;
System.out.println("------>the x is :"+x);
}
public void paint(Graphics g){
ballColor=Color.BLUE;
g.setColor(ballColor);
g.fillOval(x, y, 50, 50);
}
private class MoveBall implements Runnable{
public void run(){
try{
while(x<400){
System.out.println("@@@@@@@@@@--->"+x);
repaint();
mbt.sleep(1000);
}
}catch(Exception e){
System.out.println("Error:Thread----Sleep!");
}
}
}
}
/*
* Frame to display the application.
*/
class MyFrame extends JFrame{
JPanel myPanel;
MyFrame(){
this.setTitle("Graphics Test");
this.setBounds(20,10,600,500);
this.setVisible(true);
this.setDefaultCloseOperation(this.EXIT_ON_CLOSE);
myPanel=new MyPanel();
this.add(myPanel);
}
}
public class MyTest {
public static void main(String[] args){
MyFrame myFrame=new MyFrame();
}
}
---------------------------------------------------------------------------------------
希望各位大鸟说的详细些,非常感谢! 展开
【问题】如题!小球动不起来
【代码】
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.*;
/*
* Panel to display the picture.
*/
class MyPanel extends JPanel{
public int x=50;
public int y=50;
Color ballColor;
Runnable mbr;
Thread mbt;
MyPanel(){
this.setVisible(true);
mbr=new MoveBall();
mbt=new Thread(mbr);
mbt.start();
}
public void update(Graphics g){
g.setColor(Color.ORANGE);
g.fillRect(0, 0, 600, 500);
x+=50;
System.out.println("------>the x is :"+x);
}
public void paint(Graphics g){
ballColor=Color.BLUE;
g.setColor(ballColor);
g.fillOval(x, y, 50, 50);
}
private class MoveBall implements Runnable{
public void run(){
try{
while(x<400){
System.out.println("@@@@@@@@@@--->"+x);
repaint();
mbt.sleep(1000);
}
}catch(Exception e){
System.out.println("Error:Thread----Sleep!");
}
}
}
}
/*
* Frame to display the application.
*/
class MyFrame extends JFrame{
JPanel myPanel;
MyFrame(){
this.setTitle("Graphics Test");
this.setBounds(20,10,600,500);
this.setVisible(true);
this.setDefaultCloseOperation(this.EXIT_ON_CLOSE);
myPanel=new MyPanel();
this.add(myPanel);
}
}
public class MyTest {
public static void main(String[] args){
MyFrame myFrame=new MyFrame();
}
}
---------------------------------------------------------------------------------------
希望各位大鸟说的详细些,非常感谢! 展开
5个回答
2012-06-14
展开全部
自己在paint();中写个update(g);
还有点小建议:楼主貌似还有个不好的习惯。。。使用画笔时不先临时保存画笔原来的颜色。。。
建议在用画笔前先 Color tmp = g.getColor(); 用完后g.setColor(tmp);
楼主用的是轻量级的组件JFrame
API中的原话:
repaint
public void repaint(int x,
int y,
int width,
int height)重绘组件的指定矩形区域。
如果此组件是轻量组件,则此方法会尽快调用此组件的 paint 方法。否则此方法会尽快调用此组件的 update 方法。
还有点小建议:楼主貌似还有个不好的习惯。。。使用画笔时不先临时保存画笔原来的颜色。。。
建议在用画笔前先 Color tmp = g.getColor(); 用完后g.setColor(tmp);
楼主用的是轻量级的组件JFrame
API中的原话:
repaint
public void repaint(int x,
int y,
int width,
int height)重绘组件的指定矩形区域。
如果此组件是轻量组件,则此方法会尽快调用此组件的 paint 方法。否则此方法会尽快调用此组件的 update 方法。
展开全部
我刚刚也遇到了这个问题,我的解决方法是重写repaint()方法;
对于repaint方法,API中写的是”如果此组件是轻量级组件,则此方法会尽快调用此组件的 paint 方法。否则此方法会尽快调用此组件的
update 方法。“我不知道我的程序属不属于轻量级组件,但是肯定repaint没调用update.所以我只好重写:
public void repaint() {
super.repaint();
update(getGraphics());
}
更改之后就可以了,我是在双缓冲问题上遇到的。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
repaint()需要你自己写覆盖父类的这个方法,你有没指定它调update它怎么会自动去调
追问
不是说:调用repaint()时,它会自动调用update()然后在调用paint()吗?repaint()走的不是这个流程吗?
追答
重画的话paint里好像要用super.paint(g)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你把class MyPanel extends JPanel{中的JPanel换成Frame
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询