首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

关于java se的如何用Update()来解决背景图片闪烁的有关问题 求高手帮忙

2012-12-18 
关于java se的怎么用Update()来解决背景图片闪烁的问题 求高手帮忙package str.mimport java.awt.*impor

关于java se的怎么用Update()来解决背景图片闪烁的问题 求高手帮忙
package str.m;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.applet.*;
import javax.swing.*;
import java.util.*;
import java.util.List;
//-------------------马里奥游戏---主框架------------------------
public class Myframe extends JFrame implements ActionListener, KeyListener, Runnable                 
{
private Container c;
private JLabel flag;
private MenuBar bar;
private Menu game, about;
private MenuItem begin, end, explain;
/////////////////////////////////////
private Makings pic;
boolean b = false;
private Marioplay mario;
private Thread t;
//////////////////////////////////
//////////////////////////////////
public Myframe()
{
c = this.getContentPane();
c.setLayout(new BorderLayout());
flag = new JLabel();
c.setBackground(Color.BLACK);
c.add(flag);
bar = new MenuBar();
this.setMenuBar(bar);
game = new Menu("游戏");
about = new Menu("关于");
begin = new MenuItem("开始");
end = new MenuItem("退出");
explain = new MenuItem("说明");
bar.add(game);
bar.add(about);
game.add(begin);
game.addSeparator();
game.add(end);
about.add(explain);
begin.addActionListener(this);
end.addActionListener(this);
this.setTitle("超级马里奥");
this.setBounds(100, 50, 1000, 700);
this.setResizable(false);
this.addKeyListener(this);
pic  = new Makings();//----初始化背景----
mario = new Marioplay(0,580);//----初始化马里奥主角----
t  = new Thread(this);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
/////////////////////////////////////////////////////////////
public void update(Graphics gg)
{
paint(gg);
}
/////////////////////////////////////////////////////////////
public void paint(Graphics g)
{
super.paintComponents(g);//重写print方法,如果不传给父类,图片将被覆盖
BufferedImage image = new BufferedImage(1000,700,BufferedImage.TYPE_3BYTE_BGR);
Graphics g2=image.getGraphics();
if(b == true)
{
//-------------绘制背景-------
  g2.drawImage(pic.getbackGround(), 0, 0, this);
  //////////////绘制障碍物//////////////////////////////////
  for(int i=0; i<18; i++)
  {
    g2.drawImage(pic.getBarrier().get(9),i*60,640,this);
  }
    g2.drawImage(this.mario.getMario(), mario.getX(), mario.getY(),this);
  /////////////////////////////////////////////////
  g2.dispose();
  
}
g.drawImage(image,0,0,this);
}
///////////////////////////////////////////////////////////
/**
 * @param args
 */
public static void main(String[] args)
{
// TODO Auto-generated method stub
Myframe m = new Myframe();
}
//////////////////////////////////
public void actionPerformed(ActionEvent e)
{
if(e.getSource().equals(begin))
{

System.out.println("ok");


 b = true;
this.t.start();
}

}
    ///////////////////////////
@Override
//当点击键盘上的键时 
public void keyPressed(KeyEvent e)
{
// TODO Auto-generated method stub
if(b == true)
{
if(39 == e.getKeyCode())
{
this.mario.goRight();
System.out.println("按下 右键");
    }
if(37 == e.getKeyCode())
    {
this.mario.goLeft();
System.out.println("按下 左键");
    }
}
}
@Override
//当抬起键时
public void keyReleased(KeyEvent e)
{
// TODO Auto-generated method stub
if(b == true)
{
if(39 == e.getKeyCode())
{
this.mario.stopRight();
System.out.println("按下 右停");
    }
if(37 == e.getKeyCode())
    {
this.mario.stopLeft();
System.out.println("按下 左停");
    }
}
}
@Override
//输入一些信息时
public void keyTyped(KeyEvent e)
{
// TODO Auto-generated method stub
}
@Override
public void run()
{
// TODO Auto-generated method stub
while(true)
{
try 
{
Thread.sleep(100);
}
catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
this.repaint();
}

}

}




















[最优解释]
推荐你看一下我刚写的一篇博客
http://blog.csdn.net/go12355/article/details/8264568
[其他解释]
你永远不应该直接调用updateUI()方法
正确的做法是重载paintComponent()方法,你好像没有
需要刷新时调用repaint()
还有请用BufferedImage把你的背景对象缓存,放在paintComponent直接读取
会给刷新带来很大的问题!
[其他解释]
引用:
AWTUtilities.setWindowOpaque(this, false);   //关键点,设置窗体的透明,这种透明不会影响到内部组件,方便绘制背景。
然后再自己重写一下JPanel的  paintComponent(Graphics g)方法,用该方法绘制背景,最好不要用paint方法,因为该方法会覆盖内部组件,遮住内部组件很蛋疼的哟。将自己写的JPanel通过setContentPane方法加入到JFrame或JWindow的contentPane中,再在contentPane里添加自己的组件即可。

楼主你就是因为用了paint方法,所以会出现闪烁的情况。
如果不想使用paintComponent(Graphics g),用逻辑的方式变通一下也是可以解决的。
[其他解释]
 paintComponent(Graphics g)方法  能不能给个简单的列子看看 我自学java se 只是些皮毛
[其他解释]
谢谢上面的大哥博客
  我改好了
不过怎么正确的做法是重载paintComponent()方法

热点排行