java中的GUI线程

付费节点推荐


免费节点


节点使用教程


当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]

运行结果:

20151206230748

未经允许不得转载:Bcoder资源网 » java中的GUI线程

相关推荐

赞 (1)
分享到:更多 ()

评论 0

评论前必须登录!

登陆 注册
  1. Coder.Bingcs