如何修复闪烁/闪烁 [英] How to fix blinking/flashing

查看:148
本文介绍了如何修复闪烁/闪烁的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

每次单击时都会记录一个简单的程序,但当点击过快时,图像似乎闪烁/闪烁。

  import java.awt。*; 
import java.awt.event。*;
import java.awt.Graphics;
import javax.swing。*;
import java.lang.Object;
import java.net.URL;
import java.lang.String;
import java.awt.Font;


public class Spaceship extends Canvas
{
private Font font1;
int myX = 100;
int myY = 400;
int count = 0;

这些是闪烁的2张图片,尽管使用的图片应该没有关系。

  Image img1 = Toolkit.getDefaultToolkit().getImage(spaceship.jpg); 
Image img2 = Toolkit.getDefaultToolkit().getImage(background.jpg);

public Spaceship()
{
setSize(new Dimension(1272,960));
addMouseListener(new MouseAdapter()
{
public void mousePressed(MouseEvent evt)
{
moveIt(evt);
count = count + 1;
}
}
);


$ b public void moveIt(MouseEvent evt)
{
myY = evt.getY() - 100;
myX = evt.getX() - 150;
update();
}


public void update()
{
repaint();
}

我假设这个问题在这里,但不确定如何解决。

  public void paint(Graphics g)
{
font1 = new Font(Serif, Font.BOLD,36);
g.drawImage(img2,0,0,this);
g.drawImage(img1,myX,myY,this);
g.drawRect(1000,0,272,96);
g.drawRect(1000,96,272,192);
g.drawRect(1000,192,272,288);
g.drawRect(1000,288,272,384);
g.drawRect(1000,384,272,480);
g.drawRect(1000,480,272,576);
g.drawRect(1000,576,272,672);
g.drawRect(1000,672,272,768);
g.drawRect(1000,768,272,864);
g.drawRect(1000,864,272,960);
g.setFont(font1);
g.drawString(Integer.toString(count),500,100);


$ b public static void main(String [] args)
{
JFrame frame = new JFrame(Basic Game);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Spaceship ex =新的Spaceship();
frame.getContentPane().add(ex);
frame.pack();
frame.setResizable(false);
frame.setVisible(true);
ex.requestFocus();




$ b $ p
$ b

我做错了什么?

解决方案

建议:

最重要的是,使用Swing而不是AWT,因为它绘制了Swing JComponents会给你自动双缓冲 - 缺少这种情况可能会导致你的问题。
  • 你甚至不应该混合你的AWT (Canvas)组件与您的Swing(JFrame)组件。再次,只需使用所有Swing组件。

  • 在JPanel的受保护的void paintComponent(Graphics g)方法中绘制。

  • 不要忘记在paintComponent重写中调用super的方法。
  • 将背景绘制到BufferedImage中,然后在<$ c $中显示BufferedImage c> paintComponent 方法。






  • 编辑

    一些有用的链接:



    • Swing常规信息和链接

    • Swing教程

    • 课程:执行自定义绘画

    • 在AWT和Swing中绘画




    • $ b $编辑2

      您声明: p>


      完美地工作,感谢您的帮助

      非常好,不客气!既然你已经解决了它,我发布我的版本感觉很好。随意提出任何问题或根据需要提供批评:

      pre $ import java.awt。*;
      import java.awt.event。*;
      import java.awt.image.BufferedImage;
      import java.awt.Graphics;

      import javax.imageio.ImageIO;
      import javax.swing。*;

      import java.io.IOException;
      import java.lang.Object;
      导入java.net.MalformedURLException;
      import java.net.URL;
      import java.lang.String;
      import java.awt.Font;

      public class Spaceship extends JPanel {
      private static final String BACKGROUND_PATH =http://www.thatsreallypossible.com/
      +wp-content / uploads / 2012 / 12 /空间Colonialisation.jpg;
      private static final String SPRITE_PATH =http://www.pd4pic.com/
      +images250_ / ufo-flying-saucer-spacecraft-spaceship-alien.png;

      私人字体font1;
      int myX = 100;
      int myY = 400;
      int count = 0;
      私有BufferedImage背景;
      private BufferedImage sprite;

      public Spaceship()抛出IOException {
      URL backgroundUrl = new URL(BACKGROUND_PATH);
      URL spriteUrl =新的URL(SPRITE_PATH);
      background = ImageIO.read(backgroundUrl);
      sprite = ImageIO.read(spriteUrl);

      MouseAdapter myMouseAdapter = new MouseAdapter(){
      public void mousePressed(MouseEvent evt){
      moveIt(evt);
      count = count + 1;
      }

      @Override
      public void mouseDragged(MouseEvent evt){
      moveIt(evt);
      }
      };
      addMouseListener(myMouseAdapter);
      addMouseMotionListener(myMouseAdapter);

      $ b @Override
      public Dimension getPreferredSize(){
      if(background!= null){
      返回新Dimension(background.getWidth() ,background.getHeight());
      }
      返回super.getPreferredSize();
      }

      public void moveIt(MouseEvent evt){
      myY = evt.getY() - sprite.getHeight()/ 2;
      myX = evt.getX() - sprite.getWidth()/ 2;
      repaint();
      }


      @Override
      保护void paintComponent(Graphics g){
      super.paintComponent(g);
      font1 =新的字体(Serif,Font.BOLD,36);
      g.drawImage(background,0,0,this);
      g.drawImage(sprite,myX,myY,this);
      g.setColor(Color.yellow);
      int rectCount = 10;
      //g.drawImage(img1,myX,myY,this);
      int height = getHeight()/ rectCount;
      int width = 272;
      int x = getWidth() - width;
      for(int i = 0; i int y = i * height;
      g.drawRect(x,y,width,height);
      }
      g.setFont(font1);
      g.drawString(Integer.toString(count),500,100);
      }

      public static void main(String [] args){
      JFrame frame = new JFrame(Basic Game);
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      Spaceship ex;
      尝试{
      ex = new Spaceship();
      frame.getContentPane()。add(ex);
      frame.pack();
      frame.setResizable(false);
      frame.setVisible(true);
      ex.requestFocus();
      } catch(IOException e){
      e.printStackTrace();
      }
      }
      }


    Simple program that counts every time you click, however the image seems to blink/flash when clicked too fast.

    import java.awt.*;
    import java.awt.event.*;
    import java.awt.Graphics;
    import javax.swing.*;
    import java.lang.Object;
    import java.net.URL;
    import java.lang.String;
    import java.awt.Font;
    
    
    public class Spaceship extends Canvas
    {
        private Font font1;
        int myX = 100;
        int myY = 400;
        int count = 0;
    

    These are the 2 images that flash, the images used shouldn't matter though.

        Image img1 = Toolkit.getDefaultToolkit ().getImage ("spaceship.jpg");
        Image img2 = Toolkit.getDefaultToolkit ().getImage ("background.jpg");
    
        public Spaceship ()
        {
            setSize (new Dimension (1272, 960));
            addMouseListener (new MouseAdapter ()
            {
                public void mousePressed (MouseEvent evt)
                {
                    moveIt (evt);
                    count = count + 1;
                }
            }
            );
        }
    
    
        public void moveIt (MouseEvent evt)
        {
            myY = evt.getY () - 100;
            myX = evt.getX () - 150;
            update ();
        }
    
    
        public void update ()
        {
            repaint ();
        }
    

    I assume this issue is in here somewhere but not really sure how to fix it.

        public void paint (Graphics g)
        {
            font1 = new Font ("Serif", Font.BOLD, 36);            
            g.drawImage (img2, 0, 0, this);
            g.drawImage (img1, myX, myY, this);
            g.drawRect (1000, 0, 272, 96);
            g.drawRect (1000, 96, 272, 192);
            g.drawRect (1000, 192, 272, 288);
            g.drawRect (1000, 288, 272, 384);
            g.drawRect (1000, 384, 272, 480);
            g.drawRect (1000, 480, 272, 576);
            g.drawRect (1000, 576, 272, 672);
            g.drawRect (1000, 672, 272, 768);
            g.drawRect (1000, 768, 272, 864);
            g.drawRect (1000, 864, 272, 960);
            g.setFont (font1);
            g.drawString (Integer.toString (count), 500, 100);
    
        }
    
        public static void main (String[] args)
        {
            JFrame frame = new JFrame ("Basic Game");
            frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
            Spaceship ex = new Spaceship ();
            frame.getContentPane ().add (ex);
            frame.pack ();
            frame.setResizable (false);
            frame.setVisible (true);
            ex.requestFocus ();
        }
    }
    

    What is it exactly that I'm doing wrong?

    解决方案

    Suggestions:

    • First and foremost, use Swing not AWT since drawing iwth Swing JComponents will give you automatic double buffering -- the lack of which is likely causing your problem.
    • You shouldn't even be mixing your AWT (Canvas) component with your Swing (JFrame) component. Again, just stick with all Swing components.
    • Draw in a JPanel's protected void paintComponent(Graphics g) method.
    • Don't forget to call the super's method in your paintComponent override.
    • Do background drawing into a BufferedImage, and then display that BufferedImage in the paintComponent method.

    Edit
    Some useful links:


    Edit 2
    You state:

    Got it working perfectly, thanks for the help

    Excellent and you're welcome! Since you've solved it, I feel OK in posting my version. Feel free to ask any questions or provide critique as needed:

    import java.awt.*;
    import java.awt.event.*;
    import java.awt.image.BufferedImage;
    import java.awt.Graphics;
    
    import javax.imageio.ImageIO;
    import javax.swing.*;
    
    import java.io.IOException;
    import java.lang.Object;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.lang.String;
    import java.awt.Font;
    
    public class Spaceship extends JPanel {
       private static final String BACKGROUND_PATH = "http://www.thatsreallypossible.com/"
             + "wp-content/uploads/2012/12/Space-Colonialisation.jpg";
       private static final String SPRITE_PATH = "http://www.pd4pic.com/"
             + "images250_/ufo-flying-saucer-spacecraft-spaceship-alien.png";
    
       private Font font1;
       int myX = 100;
       int myY = 400;
       int count = 0;
       private BufferedImage background;
       private BufferedImage sprite;
    
       public Spaceship() throws IOException {
          URL backgroundUrl = new URL(BACKGROUND_PATH);
          URL spriteUrl = new URL(SPRITE_PATH);
          background = ImageIO.read(backgroundUrl);
          sprite = ImageIO.read(spriteUrl);
    
          MouseAdapter myMouseAdapter = new MouseAdapter() {
             public void mousePressed(MouseEvent evt) {
                moveIt(evt);
                count = count + 1;
             }
    
             @Override
             public void mouseDragged(MouseEvent evt) {
                moveIt(evt);
             }
          };
          addMouseListener(myMouseAdapter);
          addMouseMotionListener(myMouseAdapter);
       }
    
       @Override
       public Dimension getPreferredSize() {
          if (background != null) {
             return new Dimension(background.getWidth(), background.getHeight());
          }
          return super.getPreferredSize();
       }
    
       public void moveIt(MouseEvent evt) {
          myY = evt.getY() - sprite.getHeight() / 2;
          myX = evt.getX() - sprite.getWidth() / 2;
          repaint();
       }
    
    
       @Override
       protected void paintComponent(Graphics g) {
          super.paintComponent(g);
          font1 = new Font("Serif", Font.BOLD, 36);
          g.drawImage(background, 0, 0, this);
          g.drawImage(sprite, myX, myY, this);
          g.setColor(Color.yellow);
          int rectCount = 10;
          //g.drawImage(img1, myX, myY, this);
          int height = getHeight() / rectCount;
          int width = 272;
          int x = getWidth() - width;
          for (int i = 0; i < rectCount; i++) {
             int y = i * height;
             g.drawRect(x, y, width, height);
          }
          g.setFont(font1);
          g.drawString(Integer.toString(count), 500, 100);
       }
    
       public static void main(String[] args) {
          JFrame frame = new JFrame("Basic Game");
          frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
          Spaceship ex;
          try {
             ex = new Spaceship();
             frame.getContentPane().add(ex);
             frame.pack();
             frame.setResizable(false);
             frame.setVisible(true);
             ex.requestFocus();
          } catch (IOException e) {
             e.printStackTrace();
          }
       }
    }
    

    这篇关于如何修复闪烁/闪烁的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆