Java setShape()会清除JFrame的背景吗?

Java setShape()会清除JFrame的背景吗?,java,swing,transparency,Java,Swing,Transparency,我想用java写一个程序。。。 我想将窗口(JFrame)的形状设置为一组PNG图像(具有透明背景)。 (实际上,我想让窗口连续改变形状,使其看起来像动画!) 然后,我从文件中读取图像,将它们保存到数组中,然后,我使用GeneralPath类获取动画角色的区域(在png图像中),将其保存到areaArray中 做完所有的事情后,我开始画线。它工作得很好…但有时窗口会闪烁(啊…我的意思是发生了闪烁,但我在闪烁时看到的背景色是透明的,我可以看到我的桌面壁纸!) 我不想再看到闪烁,有人能帮我吗?谢谢

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

做完所有的事情后,我开始画线。它工作得很好…但有时窗口会闪烁(啊…我的意思是发生了闪烁,但我在闪烁时看到的背景色是透明的,我可以看到我的桌面壁纸!)

我不想再看到闪烁,有人能帮我吗?谢谢

附言:对不起,我的英语很差

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

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

再次感谢

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

谢谢安德鲁·汤普森的建议

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

谢谢


我已经编辑了原始帖子…添加工作代码并上传我的所有文件,希望它们有用!!谢谢不相关,但添加对
super.paint(g)的调用paint()
方法中,我以前做过,但是…添加super.paint(g);in paint()会让事情变得很糟糕(它会更频繁地闪烁,我认为这是因为super.paint()会首先真正清除所有JFrame,然后绘制您真正想要的内容。)因此我删除了该语句(到目前为止它不会影响性能)。“这是我的代码。”嗯。。没有太多的人会浏览这个链接,下载2个源文件(和几十张图片)来尝试和帮助。我的建议是发布1,它以代码的方法生成图像。。作为旁白
monster1.png
似乎是一个带着胡萝卜鼻子的微笑雪人。那是什么怪物?!?(我一定很厌烦我检查了那张照片!)