java 线程(多线程)thread,案例:汉字打字练习(AWT-EventQuecue,AWT-Windows)

实验目的

当Java程序包含图形用户界面(GUI)时,Java虚拟机在运行应用程序时会自动启动更多的线程,其中有两个重要的线程:AWT-EventQuecue和 AWT-Windows。

  • AWT-EventQuecue线程负责处理GUI事件。
  • AWT-Windows线程负责将窗体或组件绘制到桌面。

JVM要保证各个线程都有使用CPU资源的机会。

  • 例如,程序中发生GUI界面事件时,JVM就会将CPU资源切换给AWT-EventQuecue线程,AWT-EventQuecue线程就会来处理这个事件。
  • 例如,你单击了程序中的按钮﹐触发ActionEvent事件,AWT-EventQuecue线程就立刻排队等候执行处理事件的代码。

实现要求

编写一个Java应用程序,在主线程中再创建一个Frame类型的窗口,在该窗口中再创建一个线程give Word。线程give Word每隔2秒钟给出一个汉字,用户使用一种汉字输入法将该汉字输入到文本框中。

代码

本案例包含三个类

test6_4_programm

public class test6_4_programm {
    public static void main(String[] args) {
        new ThreadFrame().setTitle("汉字打字练习");
    }
}

WordThread

import javax.swing.*;

public class WordThread extends Thread {
    char word;
    int startPosition = 19968;      //Unicode表的19968位置至32320上的汉字
    int endPosition = 32320;
    JTextField showWord;            //显示汉字的文本区域
    int sleepLength=6000;
    public void setJTextField(JTextField t){
        showWord=t;
        showWord.setEditable(false);//使此文本区域不能被编辑
    }
    public void setSleepLength(int n){
        sleepLength=n;
    }
    public void run(){              //线程运行
        int k=startPosition;
        while (true){
            word=(char) k;          //
            showWord.setText(""+word);//组件.setText(String str);将组件上的文字内容设置为str
            try {
                Thread.sleep(sleepLength);//线程类调用sleep方法使线程终端sleeplength毫秒
            }catch (InterruptedException e){}
						k++;
            if (k>=endPosition){
                 k=endPosition;
            }
        }
    }
}

ThreadFrame

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
//主线程
public class ThreadFrame extends JFrame implements ActionListener {
    JTextField showWord;
    JButton button;
    JTextField inputText,showScore;//输入框,展示得分
    WordThread giveWord;//内部有一个giveword副线程
    JLabel ID=new JLabel();
    int score=0;
    ThreadFrame(){
				//设置显示文字区域的样式
        showWord=new JTextField(6);
        showWord.setFont(new Font("",Font.BOLD,72));
        showWord.setHorizontalAlignment(JTextField.CENTER);
				//设置副线程
        giveWord=new WordThread();
        giveWord.setJTextField(showWord);
        giveWord.setSleepLength(5000);
				//设置其他组件
        button=new JButton("开始");
        inputText=new JTextField(10);
        showScore=new JTextField(5);
				//设置其他组件监视器以及位置
        button.addActionListener(this);        
        inputText.addActionListener(this);
        add(button,BorderLayout.NORTH);    //
        add(showWord,BorderLayout.CENTER); //
				showScore.setEditable(false);
				//BorderLayout布局 最下方插入面板,内含三个组件:标签,输入框,展示得分
        JPanel southP=new JPanel();
        southP.add(new JLabel("输入汉字(回车):"));
        southP.add(inputText);
        southP.add(showScore);
        add(southP,BorderLayout.SOUTH);
				//设置窗口基本样式
        setBounds(100,100,350,180);
        setVisible(true);
        validate();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    @Override//重写监视器
    public void actionPerformed(ActionEvent e) {
				//按钮监视器
        if (e.getSource()==button){
            if(!(giveWord.isAlive())){     //如果当前线程没开始,创建一个线程
                giveWord=new WordThread();
                giveWord.setJTextField(showWord);
                giveWord.setSleepLength(5000);
            }
            try{
                giveWord.start();
            }catch (Exception exe){
            }
        }
				//输入框监视器
				else if (e.getSource()==inputText){
            if (inputText.getText().equals(showWord.getText())){
                score++;         //如果输入的汉字与showWord中的内容匹配 得1分
            }
            showScore.setText("得分:"+score);
            inputText.setText(null);
        }
    }
}

setEditable(false)

使调用这个函数的控件不能被编辑,如果设为true或者不调用这个函数,则控件可以编辑

isAlive()

isAlive()方法: 判断当前的线程是否处于活动状态
活动状态是指线程已经启动且尚未终止,线程处于正在运行或准备开始运行的状态,就认为线程是存活的

getSource()

就是获得你目前这个事件的事件源,说通俗点,比如有一个按钮事件,你点击一个按钮,在处理事件中你用e.getSource(),就是获得这个按钮,你可以这样写

JButton a=(JButton)e.getSource();把事件源转换成你点击的那个对象类。这样你的a就可以用JButton里面的变量与方法了。
如果你有许多控件事件,这样写还可以区分你获得的是哪个控件事件的事件源。

本例是在监视器中处理事件时,产生KeyEvent e 然后通过getSource获取当前的文本框

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值