在 Java 中,如何用Swing实现打字.需要掌握多线程,JFrame的创建方法。多线程的创建方法,一个是继承Thread类,一个是实现Runnable接口。框架的实现,直接创建一个类继承JFrame.
基本思路是,1.创建一个JFrame 2.启动十个线程,每个线程携带了一个JLabel,用到了随机函数,每个JLabel的刚出现的时候,他们的y坐标都是一样的,x坐标是随机的(随机范围在JFrame的宽度内.JLabel显示的值,是Ascii对应的拉丁字母 .3.线程控制每个JLael的y坐标增加,这样字母就在往下掉 4.响应键盘事件
//载入包
import .awt.*;
import javax.swing.*;
import java.util.*;
import java.awt.event.*;
import java.applet.*;
// 创建一个线程
class MyThread extends Thread {
int height=0;
// JLabel的x坐标
int intx=0;
// JLabel 的y坐标
int inty=0;
static int com=0;
JLabel lb1;
public MyThread(ThreadGroup g,String name,int width,int fheight){
this.setName(name);
height=fheight;
// 设置JLabel显示的大写字母,通过随机值控制.65是大写A的Ascii值
lb1=new JLabel(“”+(char)(int)(Math.random()*26+65));
// 设置JLabel的背景颜色,红,绿,蓝组成自然界所有色彩
lb1.setForeground(new Color((int)(Math.random()*250),(int)(Math.random()*250),(int)(Math.random()*250)));
intx=(int)(Math.random()*(width-20));
//线程启动
start();
}
public void run(){
try{
while(true){
//睡眠50毫秒往下掉
sleep((int)(Math.random()*50));
lb1.setBounds(intx,inty,15,15);
//改变y坐标
inty++;
if(inty>=(height-20)){
lb1.show(false);
MyThread.com++;
break;
}
}
}catch(Exception e){}
}
}
//创建窗口
class TestKey extends JFrame
{
JButton b1,b2;
static int index=0;
Container conent=getContentPane();
static int idd=0;
static int count=0;
int ixx;
static ThreadGroup dg=new ThreadGroup(“group1”);
static ThreadGroup dg1;
static MyThread t1;
Thread list[];
public TestKey() throws ArrayStoreException
{
setSize(400,600);
b1=new JButton(“开始”);
b2=new JButton(“结束”);
conent.setLayout(null);
b1.setBounds(getWidth()/2-100,getHeight()-70,80,30);
b2.setBounds(getWidth()/2+50,getHeight()-70,80,30);
conent.add(b1);
conent.add(b2);
conent.setBackground(Color.blue);
Container cont=getContentPane();
conent.setBackground(Color.white);
show();
//响应按钮事件
b1.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent even)
{
for(int i=0;i<10;i++)
{
t1=new MyThread(dg,”t”+i,getWidth(),getHeight());
getContentPane().add(t1.lb1);
}
}
});
b2.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent even)
{
int num=conent.getComponentCount()-2;
for(int i=2;i { conent.remove(2); conent.repaint(); } if((float)num/count<=0.02) JOptionPane.showMessageDialog(null,”共有”+count+”个字母n”+”只有”+num+”个未打掉!n您真是高手,佩服,佩服!”); else if((float)num/count<=0.15) JOptionPane.showMessageDialog(null,”共有”+count+”个字母n”+”有”+num+”个未打掉!n水平不错,继续努力吧!”); else if((float)num/count<=0.3) JOptionPane.showMessageDialog(null,”共有”+count+”个字母n”+”有”+num+”个未打掉!n您很有潜力,不要虚度光阴哦!”); else if((float)num/count<=0.4) JOptionPane.showMessageDialog(null,”共有”+count+”个字母n”+”有”+num+”个未打掉!n挺危险的,加把劲啊!”); else JOptionPane.showMessageDialog(null,”共有”+count+”个字母n”+”有”+num+”个未打掉!n不蛮你,你真的很差劲,抓紧练习吧!”); } }); //监听窗口事件 addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent event) { if(conent.getComponentCount()==2) JOptionPane.showMessageDialog(null,”您真的要退出吗?n记得经常来练习啊!”); else JOptionPane.showMessageDialog(null,”您确定要退出吗?n我还没为您评分的啊!”); System.exit(0); } }); b1.addKeyListener(new KeyAdapter() { public void keyTyped(KeyEvent event) { list=new Thread[dg.getParent().activeCount()]; int count=dg.getParent().enumerate(list); for(int i=0;i { try { MyThread mt=null; mt=(MyThread)(list[i]);// instanceof MyThread) if(event.getKeyChar()==mt.lb1.getText().charAt(0)) { mt.lb1.setVisible(false); MyThread hh=new MyThread(dg,”t”+i,getWidth(),getHeight()); getContentPane().add(hh.lb1); } }catch(Exception e){} } } }); } public static void main(String args[]){ TestKey mf=new TestKey(); Container cont=mf.getContentPane(); cont.setBackground(Color.white); cont.setLayout(null); //创建十个线程,携带十个字母往下掉 for(int i=0;i<10;i++) { t1=new MyThread(dg,”t”+i,mf.getWidth(),mf.getHeight()); cont.add(t1.lb1); } } } 大家有不同的实现方式,欢迎在下面留言