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();
}

}

}

解决方案 »

  1.   

    你永远不应该直接调用updateUI()方法
    正确的做法是重载paintComponent()方法,你好像没有
    需要刷新时调用repaint()
    还有请用BufferedImage把你的背景对象缓存,放在paintComponent直接读取
    会给刷新带来很大的问题!
      

  2.   

    引用:
    AWTUtilities.setWindowOpaque(this, false);   //关键点,设置窗体的透明,这种透明不会影响到内部组件,方便绘制背景。
    然后再自己重写一下JPanel的  paintComponent(Graphics g)方法,用该方法绘制背景,最好不要用paint方法,因为该方法会覆盖内部组件,遮住内部组件很蛋疼的哟。将自己写的JPanel通过setContentPane方法加入到JFrame或JWindow的contentPane中,再在contentPane里添加自己的组件即可。楼主你就是因为用了paint方法,所以会出现闪烁的情况。
    如果不想使用paintComponent(Graphics g),用逻辑的方式变通一下也是可以解决的。
      

  3.   

    推荐你看一下我刚写的一篇博客
    http://blog.csdn.net/go12355/article/details/8264568
      

  4.   

     paintComponent(Graphics g)方法  能不能给个简单的列子看看 我自学java se 只是些皮毛
      

  5.   

    谢谢上面的大哥博客
      我改好了
    不过怎么正确的做法是重载paintComponent()方法