Java Applet 线程动画 [英] Java Applet Thread Animation
本文介绍了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 做动画. - 重写
JPanel
的paintComponent()
方法以进行自定义绘制. - 不要忘记在重写的
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 useSwing
Timer for animation. - Override
paintComponent()
method ofJPanel
for custom painting. - Don't forget to call
super.paintComponent()
inside overriddenpaintComponent
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屋!
查看全文