付费节点推荐
免费节点
节点使用教程
当Java程序中包含图形用户界面(GUI)时,Java虚拟机在运行程序是会自动启动更多线程,其中有两个重要的线程,AWT-EventQuecue和AWT-Windows,AWT-EventQuecue负责处理GUI事件,AWT-Windows负责将组件窗体绘制到桌面。JVM要保证各个线程都有机会获得CPU资源的机会。
下面的例子是一个键盘打字小游戏,一个线程giveLetter负责每3秒随机给出一个英文字母,用户需要在文本框中输入这个字母,按回车确认,这是会触发ActionEvent事件,那么JVM会中断giveLetter线程,以便处理ActionEvent事件。
GUI_demo.java
[cc lang="java"]
package cn.bcoder;
public class GUT_demo {
public static void main(String[] args) {
WindowTyped win=new WindowTyped();
win.setTitle("打字母游戏");
win.setSleepTime(3000); //线程sleep时间
}
}
[/cc]
[cc lang="java"]
package cn.bcoder;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.math.BigDecimal;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
public class WindowTyped extends JFrame implements ActionListener,Runnable{
JTextField inputLetter; //文本框
Thread giveLetter; //给出字母的线程
JLabel showLetter,showScore; //给出字母的label,和显示分数label
int sleepTime,score,total=0;
public WindowTyped() {
setLayout(new FlowLayout()); //设置组件的布局
giveLetter=new Thread(this); //实例化giveLetter线程
inputLetter=new JTextField(6); //实例化文本框并设置文本框长度
showLetter=new JLabel(" ",JLabel.CENTER); //实例化字母的label并且居中显示
showScore=new JLabel("分数:");
showLetter.setFont(new Font("Arial", Font.BOLD, 22)); //设置字体
add(new JLabel("显示字字母"));
add(showLetter); //添加 显示字母的label
add(new JLabel("输入所显示的字母(回车)"));
add(inputLetter); //添加 文本框
add(showScore);
inputLetter.addActionListener(this); //在文本框中添加action监听器,this指本类,(因为本类implements了ActionListener)
setBounds(100,100,400,280); //设置窗口位置及大小
setVisible(true); //设置窗体是否可见
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //设置关闭按钮
giveLetter.start(); //启动giveLetter线程
}
@Override
public void run() {
ArrayListlist=new ArrayList(); //我们用ArrayList存储字母表
for(char c='a';c<='z';c++)
list.add(c);
while(true){
int num=(int)(Math.random()*26); //随机选取0~25
String s=list.get(num).toString(); //s得到的就是某个英文字母
showLetter.setText(""+s+" "); //设置showLetter这个label的文本
total++; //统计字母个数
try {
Thread.sleep(sleepTime); //每随机一个字母,线程都sleep下
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void setSleepTime(int sleepTime) { //设置sleep时间
this.sleepTime = sleepTime;
}
@Override
public void actionPerformed(ActionEvent e) {
String s=showLetter.getText().trim(); //得到字母
String letter=inputLetter.getText().trim(); //得到用户输入的字母
float lv=0; //计算正确率
if(s.equals(letter)){ //两者对比
score++; //分数++
lv=(float)score/(float)total;
BigDecimal b = new BigDecimal(lv);
lv= b.setScale(2, BigDecimal.ROUND_HALF_UP).floatValue(); //四舍五入法,并保留2位小数
showScore.setText("得分"+score+" 总数:"+total+" 正确率:"+lv*100+"%"); //显示结果
inputLetter.setText(null); //将文本框置空
validate(); //确保组件具有有效布局,可不写
giveLetter.interrupt(); //吵醒休眠的线程,以便让giveLetter给出新的字母
}
else{
lv=(float)score/(float)total;
BigDecimal b = new BigDecimal(lv);
lv= b.setScale(2, BigDecimal.ROUND_HALF_UP).floatValue();
showScore.setText("输入错误!"+"得分"+score+" 总数:"+total+" 正确率:"+lv*100+"%");
inputLetter.setText(null);
giveLetter.interrupt();
}
}
}
[/cc]
运行结果:
未经允许不得转载:Bcoder资源网 » java中的GUI线程
评论前必须登录!
登陆 注册