在应用中我门经常可以遇到这样的情况,用户在文本匡中输入数字的时候另一个文本框会自动的和他做出相应的响应,比如,文本框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
共享就是力量
|
|