- ·上一篇文章:给Java程序猿们推荐一些值得一看的好书
- ·下一篇文章:复习一下Java多线程
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
1 2 3 4 5 6 7 8 9 10 11 12 | package cn.k88; public class GUT_demo { public static void main(String[] args) { WindowTyped win=new WindowTyped(); win.setTitle("打字母游戏"); win.setSleepTime(3000); //线程sleep时间 } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 | package cn.k88; 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(); } } } |
运行结果:
java中的GUI线程