java gif动画_在Java中显示Gif动画

小编典典

您只需要释放一些繁重任务的EDT线程,然后在单独的线程中执行即可。在这种情况下,gif动画将与其他正在运行的进程一起工作。

您也可以在单独的线程中创建应用程序接口(是的,不在EDT内部),而仅在显示它之前创建。之后,您应该在EDT内进行所有更改,否则您可能会遇到很多问题。

您还可以稍后在一个单独的线程中加载更多UI元素,只需确保将它们添加到EDT中显示的框架/容器中即可-这是最重要的。

这是“重载”接口加载的一个小示例:

public static void main ( String[] args ) throws InvocationTargetException, InterruptedException

{

// Main window

final JFrame frame = new JFrame ();

final JPanel panel = new JPanel ( new FlowLayout ( FlowLayout.LEFT, 5, 5 ) )

{

public Dimension getPreferredSize ()

{

Dimension ps = super.getPreferredSize ();

ps.width = 0;

return ps;

}

};

frame.add ( new JScrollPane ( panel ) );

frame.setSize ( 600, 500 );

frame.setDefaultCloseOperation ( JFrame.EXIT_ON_CLOSE );

frame.setLocationRelativeTo ( null );

SwingUtilities.invokeAndWait ( new Runnable ()

{

public void run ()

{

frame.setVisible ( true );

}

} );

// Load dialog

final JDialog load = new JDialog ( frame );

JPanel panel2 = new JPanel ( new BorderLayout () );

panel2.setBorder ( BorderFactory.createEmptyBorder ( 15, 15, 15, 15 ) );

load.add ( panel2 );

final JProgressBar progressBar = new JProgressBar ( 0, 100 );

panel2.add ( progressBar );

load.setModal ( false );

load.pack ();

load.setLocationRelativeTo ( frame );

SwingUtilities.invokeAndWait ( new Runnable ()

{

public void run ()

{

load.setVisible ( true );

}

} );

// Heavy task (takes approx. 10 seconds + some time on buttons creation)

for ( int i = 0; i < 100; i++ )

{

Thread.sleep ( 100 );

final JButton button = new JButton ( "Button" + i );

final int finalI = i;

// Updating panel and progress in EDT

SwingUtilities.invokeLater ( new Runnable ()

{

public void run ()

{

panel.add ( button );

button.revalidate ();

progressBar.setValue ( finalI );

}

} );

}

}

如您所见-所有接口更新操作都是在EDT中进行的,其他所有操作都在另一个线程中运行。

另请注意,主线程不是EDT线程,因此我们可以立即在其中执行繁重的操作。

在某些情况下,不需要立即显示接口的已加载部分,因此可以在“繁重”操作结束时将它们一起添加。这样可以节省一些加载时间,并使初始化代码更加简单。

关于EDT的简要说明以及我在回答中所说的…

…这是我在Swing L&F和许多基于Swing的应用程序下工作三年后发现的。我挖掘了很多Swing资料,发现了很多鲜为人知的有趣东西。

如您所知-用于接口更新的单个线程(其在Swing中的EDT)的整体思想是将每个单独的组件 可视

更新(及其事件)保留在队列中,并在该线程中一个接一个地执行它们。这主要是为了避免绘画问题,因为单个帧内的每个组件都被绘画为保存在内存中的 单个

图像。那里的绘画顺序很严格,因此一个组件不会在最终图像上覆盖另一个组件。绘制顺序取决于通过在另一个容器内添加一些组件或容器而创建的组件树(这是在Swing上创建任何应用程序接口时要做的基本操作)。

总结-您必须将所有 视觉 更新(可能导致它们的方法/操作)保留在EDT中。还有什么 可能 的EDT外完成-

例如,你可以准备EDT以外的应用程序接口(同样,除非你添加一个已经可以看到容器内/删除/移动组件)。

在某些非常非常罕见的情况下,仍然可能存在一些内部问题。很久以前,这里对这个问题进行了很好的讨论:http :

//www.velocityreviews.com/forums/t707173-why-does-jdk-1-6-recommend-creating-

swing-components-on-the-edt

.html

简而言之:自从第6个JDK版本以来,Sun在文档中指出,即使Swing组件创建也应在EDT内部完成,以避免 可能的

问题。在某些特定情况下,由于创建组件时发生的事件,它们可能会在创建大量接口的情况下出现。

无论如何,我会说在某些情况下,您可以在EDT外部创建接口,以避免加载程序/应用程序卡住。在其他情况下,当应用程序在接口创建时间内是否卡住并不重要-

您应该使用EDT。我不能说更具体的事情,因为一切都取决于您的情况。

2020-09-26

Java在窗口上加载显示GIF动画图像,将多个独立的GIF图像串联在一起显示,形成GIF特有的动画形式。主要代码如下:   ImageIcon[] images; //用于动画的图标数组   Timer animationTimer;   int currentImage = 0; //当前图像编号   int delay = 500; //图像切换延迟   int width; //图像宽度   int height; //图像高度   public AnimatorIcon() //构造函数   {    setBackground(Color.white);    images = new ImageIcon[2]; //初始化数组    for (int i=0;i   images[i]=new ImageIcon(getClass().getResource("image" i ".gif")); //实例化图标    width = images[0].getIconWidth(); //初始化宽度值    height = images[0].getIconHeight(); //初始化高度值   }   public void paintComponent(Graphics g) { //重载组件绘制方法    super.paintComponent(g); //调用父类函数    images[currentImage].paintIcon(this,g,70,0); //绘制图标    currentImage=(currentImage 1)%2; //更改当前图像编号   }   public void actionPerformed(ActionEvent actionEvent) {    repaint();   }   public void startAnimation() { //开始动画    if (animationTimer==null) {    currentImage=0;    animationTimer=new Timer(delay, this); //实例化Timer对象    animationTimer.start(); //开始运行    } else if (!animationTimer.isRunning()) //如果没有运行    animationTimer.restart(); //重新运行   }   public void stopAnimation() {    animationTimer.stop(); //停止动画   }   public static void main(String args[]) {    AnimatorIcon animation = new AnimatorIcon(); //实例化动画图标    JFrame frame = new JFrame("动画图标"); //实例化窗口对象    frame.getContentPane().add(animation); //增加组件到窗口上    frame.setSize(200, 100); //设置窗口尺寸    frame.setVisible(true); //设置窗口可视    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //关闭窗口时退出程序    animation.startAnimation(); //开始动画
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值