Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java小程序线程动画_Java_Swing_Applet - Fatal编程技术网

Java小程序线程动画

Java小程序线程动画,java,swing,applet,Java,Swing,Applet,我已经完成了java小程序和动画的一些代码,我编写了以下代码: 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 fro

我已经完成了java小程序和动画的一些代码,我编写了以下代码:

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

}
import java.applet.*;
导入java.awt.*;
/*
*/
公共类AppletDemo扩展Applet实现Runnable
{
String msg=“文本从右向左设置动画…”;
线程t=null;
int状态;
布尔停止标志;
int msgX=200;
字符串s;
布尔差分;
公共void init()
{
挫折背景(颜色:青色);
设置前景(颜色为黑色);
}
公开作废开始()
{
t=新螺纹(本螺纹);
stopFlag=false;
t、 start();
s=“abc”;
差异=s.等信号情况(“abc”);
}
公开募捐
{
while(true)
{
试一试{
如果(msgX>=-150)
msgX--;
其他的
msgX=200;
睡眠(10);
重新油漆();
}
捕获(例外e)
{}
}
}
公共空间涂料(图g)
{
g、 抽绳(味精,味精,20);
showStatus(在“+msgX+”处的diff+”文本,20“);
}
}
现在发生的事情是,当我把线程。睡眠(100),它工作得很好,但当我试图动画速度更快,这是线程。睡眠(10)它开始闪烁,我无法理解正在发生的事情谁能帮我。

  • 不要直接在顶层容器上涂漆。使用
    JPanel
    在其上绘制
  • 不要使用
    Thread.sleep()
    。最好使用
    Swing
    计时器进行动画
  • 覆盖
    paintComponent()
    自定义绘制的
    JPanel
    方法
  • 不要忘记调用
    super.paintComponent()
    内部重写的
    paintComponent
    方法
尝试使用,而不是无限循环

请看一看

示例代码:

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

}
import java.applet.applet;
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.Graphics;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入javax.swing.JPanel;
导入javax.swing.Timer;
/*
*


是的,它会闪烁。您必须使用双缓冲的概念来解决这个问题。这意味着要绘制的图像在其在屏幕上绘制之前已被缓冲。它将消除闪烁效果