“有什么办法来获取JTextField中输入的字符串当用户停止键入”
用同样的方法,JavaScript有超时,摆有一个定时器。所以,如果你要寻找一个使用它的“计时器” fucntionality在Javscript实现,你可以看到,如果你能得到它与Swing Timers
工作例如Timer
有restart
。所以你可以在计时器上设置一个延迟,例如1000毫秒。一旦文本被输入(在文件中第一个变化),检查if (timer.isRunning())
和timer.restart()
如果是这样,否则timer.start()
(指在文件第一个变化)。只有在任何文档更改后经过一秒时,定时器的动作才会发生。在第二秒钟之前发生的任何其他更改都会导致定时器重置。并设置timer.setRepeats(false)
这样的动作,一旦
您的文档侦听可能看起来像
class TimerDocumentListener implements DocumentListener {
private Document doc;
private Timer timer;
public TimerDocumentListener() {
timer = new Timer(1000, new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (doc != null) {
try {
String text = doc.getText(0, doc.getLength());
statusLabel.setText(text);
} catch (BadLocationException ex) {
Logger.getLogger(TimerDemo.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
});
timer.setRepeats(false);
}
public void insertUpdate(DocumentEvent e) { set(e); }
public void removeUpdate(DocumentEvent e) { set(e); }
public void changedUpdate(DocumentEvent e) { set(e); }
private void set(DocumentEvent e) {
if (timer.isRunning()) {
timer.restart();
} else {
this.doc = e.getDocument();
timer.start();
}
}
}
这里有一个完整的例子,只发生在我“模拟”打字,通过明确插入到文档(九个数字)的该文本字段的受控间隔为500毫秒。您可以在DocumentListener拥有的Timer中看到延迟时间为1000毫秒。因此,只要发生键入,DocumentListener计时器将不会执行其操作,因为延迟时间超过500毫秒。对于文档中的每个更改,计时器都会重新启动。
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
public class TimerDemo {
private JTextField field;
private JLabel statusLabel;
public static void main(String[] args) {
Runnable runnable = new Runnable() {
public void run() {
new TimerDemo();
}
};
SwingUtilities.invokeLater(runnable);
}
public TimerDemo() {
JFrame frame = new JFrame();
frame.setLayout(new GridLayout(0, 1));
field = new JTextField(20);
field.getDocument().addDocumentListener(new TimerDocumentListener());
statusLabel = new JLabel(" ");
JButton start = new JButton("Start Fake Typing");
start.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
startInsertTimer();
}
});
frame.add(field);
frame.add(statusLabel);
frame.add(start);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
private void startInsertTimer() {
Timer timer = new Timer(500, new ActionListener() {
private int count = 9;
public void actionPerformed(ActionEvent e) {
if (count == 0) {
((Timer) e.getSource()).stop();
} else {
Document doc = field.getDocument();
int length = doc.getLength();
try {
doc.insertString(length, Integer.toString(count), null);
} catch (BadLocationException ex) {
Logger.getLogger(TimerDemo.class.getName()).log(Level.SEVERE, null, ex);
}
count--;
}
}
});
timer.start();
}
class TimerDocumentListener implements DocumentListener {
private Document doc;
private Timer timer;
public TimerDocumentListener() {
timer = new Timer(1000, new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (doc != null) {
try {
String text = doc.getText(0, doc.getLength());
statusLabel.setText(text);
} catch (BadLocationException ex) {
Logger.getLogger(TimerDemo.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
});
timer.setRepeats(false);
}
public void insertUpdate(DocumentEvent e) { set(e); }
public void removeUpdate(DocumentEvent e) { set(e); }
public void changedUpdate(DocumentEvent e) { set(e); }
private void set(DocumentEvent e) {
if (timer.isRunning()) {
timer.restart();
} else {
this.doc = e.getDocument();
timer.start();
}
}
}
}
我做到了。其中一些使用我不需要的库,因为我的问题不仅仅是条形码扫描,还包括用户键入的建议列表。有什么方法可以在用户停止输入时获得在'JTextField'上输入的字符串? – 2014-10-31 04:59:20
同样,Javascript有超时,Swing有一个Timer。因此,如果您正在寻找的是使用其“定时器”功能在Javscript中实现的,您可以看看您是否可以使用[Swing Timers](http://docs.oracle.com/javase/tutorial/uiswing/)杂项/定时器。html) – 2014-10-31 05:06:22
例如'Timer'有一个'restart'。所以你可以在计时器上设置一个延迟,例如1000毫秒。第一次更改时启动计时器。下一个改变,检查'if(timer.isRunning())'和'timer.restart()',否则'timer.start()'。只有在任何文档更改后经过一秒时,定时器的动作才会发生。并设置'timer.setRepeats(false)'这样的动作只发生一次 – 2014-10-31 05:10:26