«Есть ли способ, чтобы получить строку введенную на JTextField, когда пользователь прекращает печатать»
Точно так же, JavaScript имеет тайм-аут, Swing имеет таймер. Так что, если то, что вы ищете достигается в Javscript, используя его «таймер» fucntionality, вы можете увидеть, если вы можете заставить его работать с 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 миллисекунд. Вы можете видеть в Timer, принадлежащем DocumentListener, что задержка составляет 1000 миллисекунд. Таким образом, пока набирается текст, таймер DocumentListener не будет выполнять свое действие, поскольку задержка длится более 500 миллисекунд. Для каждого изменения в документе таймер перезапускается.
![enter image description here](https://i.stack.imgur.com/58OBn.gif)
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', когда пользователь перестает печатать? –
Точно так же, Javascript имеет таймаут, Swing имеет таймер. Так что, если вы ищете в Javscript, используя его «таймер» fucntionality, вы можете увидеть, можете ли вы заставить его работать с [Swing Timers] (http://docs.oracle.com/javase/tutorial/uiswing/ разное/таймер.html) –
Например, 'Timer' имеет' restart'. Таким образом, вы можете установить задержку на таймере, например, 1000 миллисекунд. Запустите таймер при первом изменении. Следующий изменяется, проверяйте 'if (timer.isRunning())' и 'timer.restart()', else 'timer.start()'. Действие для таймера будет происходить только в том случае, если одна секунда пройдет после изменения любого документа. И установите 'timer.setRepeats (false)', поэтому действие происходит только один раз –