JSPCN主页 | JSP空间 | 网站制作 | JSP下载 | JSP论坛 | JSP教程 | 关于JSPCN | 联系我们
JSP虚拟主机,jsp空间,java空间,java虚拟空间,详细请点击进入
做最专业的JSP中文网站 当前位置首页--JAVA技术--JAVA线程  
文章搜索:
关键字 标题
  
JSP中文网内容管理系统(JCMS)
JSP虚拟主机
网络笔记本
网摘,图片,笔记收藏
虚拟服务器

JSPCN文章目录分类
JSP配置[219]JSP基础[136]
中文问题[69]上传问题[27]
JAVABEAN[46]数据库[212]
文件操作[126]图片声音[17]
JSP其他[57]时间相关[16]
JAVAMAIL[72]STRUTS[144]
开发工具[28]教程系列[157]
JSP实例[89]
JAVA基础[421]APPLET[78]
JAVA网络[179]Applica[115]
Servlet[98]XML[163]
J2ME[257]J2EE[374]
考试相关[63]JAVA线程[90]
EJB[261]Swing[26]
Java API[141]声音图片[28]
异常处理[33]JAVA实例[290]
JAVA类[139]SUN[89]
Hibernate[6]JMX[8]
Spring[34]
本版推荐文章 
本版热点文章 
相关文章链接 
 
使用多线程延缓JTextField中数值改变事件激发时间
作者:     文章来源:
访问次数:6次     加入时间:2007年04月14日
在应用中我门经常可以遇到这样的情况,用户在文本匡中输入数字的时候另一个文本框会自动的和他做出相应的响应,比如,文本框A中原先没有数值,文本框B中原先的数值是100,当在文本框A中输入100,我们期望B中的值在A输入数字后停留几秒种再做出相应的加和动作并且得出结果。

我在论坛中看到有网友提出了有关的问题:由于但由于更新速度太快,没等A输入完呢,B里面的结果就出来了,而且往往加和的结果不是我们所预期的,为解决这个问题,我采用了多线程的方法望大家共同探讨,提出更优解决方案。

代码:

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class NumAdd {

    private JTextField textField_b;
    private JTextField textField_a;
    private JFrame frame;
    private String text_a;
    private String text_b;
    private int text_key_strok;
    
    public static  SubTextFieldTask subtask = null;
    
    private static int count;

    /**
     * Launch the application
     * @param args
     */
    public static void main(String args[]) {
        try {
            NumAdd window = new NumAdd();
            window.frame.setVisible(true);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * Create the application
     */
    public NumAdd() {
        
        initialize();
    }

    /**
     * Initialize the contents of the frame
     */
    private void initialize() {
        frame = new JFrame();
        frame.setBounds(100, 100, 500, 375);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        final JPanel panel = new JPanel();
        panel.setLayout(null);
        frame.getContentPane().add(panel, BorderLayout.CENTER);
        
        textField_b = new JTextField();
        textField_b.setText("10");
        textField_b.setBounds(235, 126, 185, 24);
        
        textField_a = new JTextField();
        text_b = textField_b.getText();

        textField_a.addKeyListener(new KeyAdapter() {
            
            public void keyReleased(KeyEvent e) {
                text_a = textField_a.getText();
                if(text_a.equals("")){
                    text_a = "0";
                }
                
                count++;

                //助count只执行依次调用子线程的动作
                if(count==1){
                    subtask  = new SubTextFieldTask();
                    subtask.start();
                }
                
            }
            
        });

        textField_a.setBounds(50, 125, 155, 25);
        panel.add(textField_a);    
        panel.add(textField_b);

        final JLabel label = new JLabel();
        label.setText("A");
        label.setBounds(51, 154, 50, 25);
        panel.add(label);

        final JLabel label_1 = new JLabel();
        label_1.setText("B");
        label_1.setBounds(236, 151, 70, 20);
        panel.add(label_1);

        final JButton resetButton = new JButton();
        resetButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                
                textField_b.setText("10");
                textField_a.setText("");
                count=0;
            }
        });
        resetButton.setText("reset");
        resetButton.setBounds(190, 195, 100, 30);
        panel.add(resetButton);
    }

    // 子线程,用来处理文本框加和
     private class SubTextFieldTask extends Thread {
            public void run(){
                    try {
                         sleep(1500);// here to set postphone time    // 使线程休眠1.5秒
                         text_key_strok = (new Integer(text_a).intValue())+(new Integer(text_b).intValue());
                         textField_b.setText(new Integer(text_key_strok).toString());
                            
                         count=0;  //每一次执行完子线程 subtask 后自动清零
                        
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }

            }
        }

}


可以看到程序用采用了内部线程的方法,并使用了sleep()方法使该线程停顿。还有一点,是使用了count 计数器,他记录被键盘松开的次数,并且在每一次执行完子线程 subtask 后自动清零,之所以采用这个方法是因为在输入数字的时候我们有可能输入超过一位的数字比如100(敲击了3次键盘),这样按键就激发了3次   public void keyReleased(KeyEvent e) 方法,从而调用了3次子线程,而导致加和结果错误,所以借助count只执行依次调用子线程的动作。

可以直接编译运行该程序,大家有什么更好的解决次类问题的方法,欢迎探讨。

Jegg

Java-J2SE-Swing

共享就是力量
Copyright © 2002-2005 JSPCN.net. All rights reserved.
JSP中文网    备案序号:蜀ICP备05001583号
成都恒海科技发展有限公司    成都市一环路南二段6号新瑞楼三楼8号