Java Applet 线程动画 [英] Java Applet Thread Animation

查看:32
本文介绍了Java Applet 线程动画的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我经历了一些代码java小程序和动画,我写了以下代码:

import java.applet.*;导入 java.awt.*;/*<applet code="AppletDemo" width = 200 height = 100></applet>*/公共类 AppletDemo 扩展 Applet 实现 Runnable{String msg = "从右到左的文本动画...";线程 t = 空;内部状态;布尔停止标志;int msgX = 200;字符串 s;布尔差异;公共无效初始化(){设置背景(颜色.青色);设置前景(颜色.黑色);}公共无效开始(){t = 新线程(这个);停止标志 = 假;t.start();s = "abc";diff = s.equalsIgnoreCase("abc");}公共无效运行(){而(真){尝试{如果(msgX>=-150)msgX--;别的msgX = 200;线程睡眠(10);重绘();}捕获(例外 e){}}}公共空心漆(图文g){g.drawString(msg,msgX,20);showStatus(diff+"Text at "+msgX+",20");}}

发生的事情是,当我放置 Thread.sleep(100) 时,它工作正常,但是当我尝试更快地设置动画时,即 Thread.sleep(10) 它开始闪烁,我无法理解发生了什么任何人都可以帮助.

解决方案

  • 不要直接在顶层容器上绘画.使用 JPanel 在它上面作画.
  • 不要使用Thread.sleep().最好使用 Swing Timer 做动画.
  • 重写 JPanelpaintComponent() 方法以进行自定义绘制.
  • 不要忘记在重写的 paintComponent 方法中调用 super.paintComponent().

尝试使用

I am gone through some of code java applet and animation, i write the following code :

import java.applet.*;
import java.awt.*;

/*<applet code="AppletDemo" width = 200 height = 100></applet>
*/

public class AppletDemo extends Applet implements Runnable
{
    String msg = "Text Animating from right to left...";
    Thread t = null;
    int state;
    boolean stopFlag;
    int msgX = 200;
    String s;
    boolean diff;

    public void init()
    {
        setBackground(Color.cyan);
        setForeground(Color.black);
    }
    public void start()
    {
        t = new Thread(this);
        stopFlag = false;
        t.start();
        s = "abc";
         diff = s.equalsIgnoreCase("abc");
    }

    public void run()
    {
        while (true)
        {
            try{
            if(msgX>=-150)
                msgX--;
            else
                msgX =200;

            Thread.sleep(10);
            repaint();
               }
               catch(Exception e)
               {}
        }
    }
    public void paint(Graphics g)
    {
        g.drawString(msg,msgX,20);
        showStatus(diff+"Text at "+msgX+",20");
    }

}

What is happening is that when i put Thread.sleep(100), it works fine but when i try to animate faster that is Thread.sleep(10) it starts flickering , i couldn't understand what is happening can anyone help.

解决方案

  • Don't directly paint over top level container. Use JPanel to paint on it.
  • Don't use Thread.sleep(). It's better to use Swing Timer for animation.
  • Override paintComponent() method of JPanel for custom painting.
  • Don't forget to call super.paintComponent() inside overridden paintComponent method.

Instead of infinite loop try with Swing Timer.

Please have a look at How to Use Swing Timers

sample code:

import java.applet.Applet;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JPanel;
import javax.swing.Timer;

/*
 * <applet code="AppletDemo" width = 200 height = 100></applet>
 */

public class AppletDemo extends Applet {
    String msg = "Text Animating from right to left...";
    int state;
    boolean stopFlag;
    int msgX = 200;
    String s;
    boolean diff;
    JPanel panel;

    public void init() {
        setBackground(Color.cyan);
        setForeground(Color.black);
        panel = new JPanel() {
            @Override
            public void paintComponent(Graphics g) {
                super.paintComponents(g);
                g.drawString(msg, msgX, 20);
                showStatus(diff + "Text at " + msgX + ",20");
            }

            @Override
            public Dimension getPreferredSize() {
                return new Dimension(200, 40);
            }
        };
        add(panel);

        int delay = 10; // milliseconds
        ActionListener taskPerformer = new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                if (msgX >= -150)
                    msgX--;
                else
                    msgX = 200;
                repaint();
            }
        };
        Timer timer = new Timer(delay, taskPerformer);
        timer.setRepeats(true);
        timer.start();
    }

}

Find a Sample code here

这篇关于Java Applet 线程动画的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆