2

我想用java编写一个程序...我想将窗口的形状(一个JFrame)设置为一组PNG图像(具有透明背景)。(实际上,我想让窗口不断改变它的形状,它看起来像一个动画!)而且,我从文件中读取图像,将它们保存到一个数组中,然后,我使用类 GeneralPath 来获取我的动画区域字符(在 png 图像中),将其保存到 areaArray。

一切都完成后,我开始画线。效果很好...但有时窗口会闪烁(啊...我的意思是发生了闪烁,但是我在闪烁时看到的背景颜色是透明的,我可以看到我的桌面壁纸!)。

我不想再看到闪烁/闪烁,有人可以帮我吗?谢谢!

PS:对不起我的英语不好!

  public class JCustomFrame extends JFrame implements Runnable
  {
      private final int max_frame=18;   //Here is the max numbers of my png images
      private BufferedImage[] BufImageArray;    //The array to save all the png images
      private BufferedImage nowImage;   //Save the image to be drawn in this turn
      private int counter;          //Indicate which png image to be drawn
      private Area[] areaArray;     //Save the shapes of the animated character in each png image
      public void run()// a thread function to paint the frame continual
      {
          while(true){
              if(counter==max_frame)counter=0;
              nowImage=BufImageArray[counter];  
              setShape(areaArray[counter]);
              repaint();
              try{
                  Thread.sleep(100);
              }catch(InterruptedException e){
                  System.out.println("Thread.sleep error!");
              }
              counter++;
          }
      }

      public JCustomFrame()
      {
          super();  
          setUndecorated(true);
          setBackground(new Color(0,0,0,0));    
          counter= 0;
          //...some codes here
          new Thread(this).start();
      }

      public void paint(Graphics graphic)
      {
          graphic.drawImage(nowImage,0,0,this);
      }
  }

这是运行程序的示例代码:

import javax.swing.*;

  public class MainFrame
  {
      public static void main(String[] args)
      {
          JCustomFrame myFrame = new JCustomFrame();
          myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          myFrame.setSize(300,400);
          myFrame.setVisible(true);
          return ;
      }
  }

我修改了上面的 2 行,“png 文件名”和“max_frame”以应用新的图像文件。我发现如果我将相同的程序放在 Windows 而不是我的 OpenSuse 上,它运行得很好(没有闪烁),在这里我上传了我的所有源包(包括图像文件)。 这是我的代码。

再次感谢。

==================================================== =================================

感谢安德鲁汤普森的建议。

这次尝试把与问题无关的代码删掉,贴个gif来展示一下情况。上面的代码不可运行,但链接中的源代码运行良好。PS 闪烁/闪烁发生在随机帧中,与 gif 显示的并不完全相同。(因为我只能以固定顺序在我的 gif 图像中添加一个透明面板)

谢谢!!

情况图片

4

0 回答 0