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