java 打字机线程_java实现打字机效果的程序

import java.applet.*;

import java.awt.*;

import java.io.*;

import java.net.URL;

import java.util.*;

public class Typewriter4 extends Applet implements Runnable

{

AudioClip hit, cr, ding ;

boolean alreadyRun = false,

soundOn = false,

loop = false;

Color bgColor = Color.lightGray,

textColor = Color.black ;

Font font ;

Image offScreen, background ;

int width, height,

currentline = 0,

currentword = 0,

currentletter = 0,

depth = 0,

margin = 0,

cycles = 0,

step = 0,

pause = 0,

speed = 0,

update = 0,

linecount = 0 ;

long lastread = 0;

MediaTracker mt ;

String soundactivation, text, textfile, target ;

Thread woohoo = null;

URL hotlink = null;

Vector lines = null;

public Typewriter4()

{

alreadyRun = false;

soundOn = false;

loop = true;

soundactivation = "enter";

}

public void buildLines()

{

lines = new Vector();

FontMetrics fontmetrics =

offScreen.getGraphics().getFontMetrics();

StringTokenizer strTok = new StringTokenizer(text, "\n") ;

while (strTok.hasMoreTokens())

{

StringTokenizer strTok1 =

new StringTokenizer(strTok.nextToken());

int wordcount = strTok1.countTokens();

String[] words = new String[wordcount];

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

words[i] = strTok1.nextToken();

String s = "" ;

for(int j = 0; j < wordcount; j++)

{

s = s != null ? s + words[j] + " " : words[0];

if(fontmetrics.stringWidth(s) > width - margin * 2)

{

lines.addElement(s.substring(0,

s.lastIndexOf(" ", s.lastIndexOf(" ") - 1)));

s = words[j] + " ";

}

}

lines.addElement(s);

linecount = lines.size();

}

depth = height - fontmetrics.getHeight() / 2;

}

public void checkTextfile()

{

loop = true;

text = "";

try

{

DataInputStream datainputstream = new

DataInputStream((new URL(getDocumentBase(),

textfile)).openStream());

boolean flag = true;

while(flag)

{

String s = datainputstream.readLine();

if(s == null)

flag = false;

else

text = text + s + "\n";

}

datainputstream.close();

lastread =

(new Long((new Date()).getTime())).longValue();

return;

}

catch(Exception exception)

{

System.out.println("OOOHH--" + exception.toString());

}

}

public void init()

{

mt = new MediaTracker(this);

lastread = 0L;

width = getSize().width;

height = getSize().height;

offScreen = createImage(width, height);

String param ;

if ((param = getParameter("BACKGROUND")) != null)

{

try

{

background = getImage(new URL(getDocumentBase(),

param));

}

catch(Exception e) { }

if(background != null) mt.addImage(background, 0);

}

if ((param = getParameter("BGCOLOR")) != null)

bgColor = new Color(Integer.parseInt(param, 16)) ;

if ((param = getParameter("TEXTCOLOR")) != null)

textColor = new Color(Integer.parseInt(param, 16)) ;

String fontName = "Helvetica" ;

if ((param = getParameter("FONTNAME")) != null)

fontName = param ;

int fontSize = 12 ;

if ((param = getParameter("FONTSIZE")) != null)

fontSize = Integer.parseInt(param) ;

int fontStyle = Font.PLAIN ;

if ((param = getParameter("FONTSTYLE")) != null)

{

param = param.toUpperCase() ;

if (param.indexOf("BOLD") != -1)

fontStyle |= Font.BOLD ;

if (param.indexOf("ITALIC") != -1)

fontStyle |= Font.ITALIC ;

}

font = new Font(fontName, fontStyle, fontSize);

param = getParameter("CYCLES");

if(param == null || param.equalsIgnoreCase("infinite"))

{

cycles = 1;

step = 0;

}

else

{

cycles = Integer.parseInt(param);

step = 1;

}

param = getParameter("MARGIN");

margin = param == null ?

width / 10 : Integer.parseInt(param);

param = getParameter("PAUSE");

pause = param == null ? 2000 : Integer.parseInt(param);

param = getParameter("SOUNDACTIVATION");

soundactivation = param == null ?

"enter" : param.toLowerCase();

soundOn = soundactivation.equals("auto");

if((param = getParameter("SOUND.KEYSTROKE")) != null)

try

{

hit = getAudioClip(new URL(getDocumentBase(),

param));

}

catch(Exception e) { }

if((param = getParameter("SOUND.RETURN")) != null)

try

{

cr = getAudioClip(new URL(getDocumentBase(),

param));

}

catch(Exception e) { }

if((param = getParameter("SOUND.BELL")) != null)

try

{

ding = getAudioClip(new URL(getDocumentBase(),

param));

}

catch(Exception _ex) { }

param = getParameter("SPEED");

speed = param == null ?

100 : Math.max(10, Integer.parseInt(param));

param = getParameter("TARGET");

target = param == null ? "_self" : param;

if((param = getParameter("URL")) != null)

try

{

hotlink = new URL(getDocumentBase(), param);

}

catch(Exception e) { }

param = getParameter("TEXT");

text = param == null ?

"This is a test... \nthis is a test..." : param;

text = text.replace('\\', '\n');

textfile =  getParameter("TEXTFILE") ;

param = getParameter("UPDATE");

update = param == null ? 15 : Integer.parseInt(param);

buildLines();

try

{

mt.waitForID

(0);

return;

}

catch(InterruptedException _ex) { return; }

}

public void run()

{

currentline = 0;

for(int i = 0; i < cycles; i += step)

{

long l = (new Long((new Date()).getTime())).longValue();

if(l - lastread > (long)(update * 60000)

&& textfile != null)

{

checkTextfile();

buildLines();

}

for(int j = 0; j < linecount; j++)

{

currentletter = 1;

String s = (String)lines.elementAt(j);

for(int k = 0; k < s.length(); k++)

{

if(soundOn && hit != null)

hit.play();

if(k == s.length() && soundOn && cr != null)

cr.play();

repaint();

int i1 = 75 + (int)(Math.random() * 100D);

try

{

Thread.sleep((i1 * speed) / 100);

}

catch(InterruptedException interruptedexception)

{

System.out.println("BB: "

+ interruptedexception.toString());

}

currentletter++;

}

currentletter = 0;

currentline++;

alreadyRun = false;

}

currentline = currentline % linecount;

try

{

Thread.sleep(pause);

}

catch(InterruptedException interruptedexception)

{

System.out.println("AA: " +

interruptedexception.toString());

}

}

}

public void paintBuffer(Graphics g)

{

if(background != null)

{

g.drawImage(background, 0, 0, this);

}

else

{

g.setColor(bgColor);

g.fillRect(0, 0, width, height);

}

g.setColor(textColor);

g.setFont(font);

FontMetrics fontmetrics = g.getFontMetrics();

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

g.drawString(

(String)lines.elementAt(currentline - i - 1),

margin, depth - (i + 1) * fontmetrics.getHeight()

);

String s = (String)lines.elementAt(currentline);

String s1 = currentletter >= s.length() ?

s : s.substring(0, currentletter);

if(fontmetrics.stringWidth(s1) > (8 * width) / 10

&& !alreadyRun && soundOn)

{

alreadyRun = true;

if(ding != null) ding.play();

}

g.drawString(s1, margin, depth);

}

public void paint(Graphics g)

{

paintBuffer(offScreen.getGraphics());

g.drawImage(offScreen, 0, 0, this);

}

public void update(Graphics g)

{

paint(g);

}

public void start()

{

if(woohoo == null)

{

woohoo = new Thread(this);

woohoo.start();

}

}

public void stop()

{

woohoo.stop();

woohoo = null;

}

public boolean mouseEnter(Event event, int i, int j)

{

if(hotlink != null) showStatus("Link to " + hotlink.toString());

if(soundactivation.equals("enter")) soundOn = true;

return true;

}

public boolean mouseExit(Event event, int i, int j)

{

if(soundactivation.equals("enter")) soundOn = false;

return true;

}

public boolean mouseDown(Event event, int i, int j)

{

try

{

getAppletContext().showDocument(hotlink, target);

}

catch(Exception e) { }

return true;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值