我想用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图像中添加透明面板)
谢谢!