「有什麼辦法來獲取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