请问setShape()清除JFrame的背景吗?

时间:2012-11-08 15:54:20

标签: java swing transparency

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

完成所有工作后,我开始绘制线程。它工作得很好......但有时窗口会闪烁(啊......我的意思是闪烁发生了,但我闪烁时看到的背景颜色是透明的,我可以看到我的桌面壁纸!)。

我不想再看到闪烁/闪光灯,有人会帮助我吗?谢谢!

P.S。 :抱歉我的英语不好!

  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上,它运行得很好(没有闪烁),在这里我上传了我的所有源包(包括图像文件)。 Here my code is.

再次感谢。

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

感谢Andrew Thompson的建议。

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

谢谢!

Situation Picture

0 个答案:

没有答案