2014-10-30 6 views
1

У меня есть JTextFieldbarcodeTextField, который принимает символы от отсканированного штрих-кода с помощью сканера штрих-кода. Из того, что я знаю, сканирование штрих-кода похоже на типизацию символов очень быстро или копирование символов в текстовое поле. barcodeTextField также используется для отображения предложений и заполнения других полей информацией (так же, как поиск в Google, где предложения отображаются по мере ввода).Выполните действие после завершения сканирования штрих-кода на JTextField

До сих пор я осуществил это с помощью DocumentListener:

barcodeTextField.getDocument().addDocumentListener(new DocumentListener() { 
    public void set() { 
    System.out.println("Pass"); 
    // Do a lot of things here like DB CRUD operations. 
    } 

    @Override 
    public void removeUpdate(DocumentEvent arg0) { 
    set(); 
    } 

    @Override 
    public void insertUpdate(DocumentEvent arg0) { 
    set(); 
    } 

    @Override 
    public void changedUpdate(DocumentEvent arg0) { 
    set(); 
    } 
}); 

Проблема в том случае, если штрих-код сканируется имеет 13 символов, set() выполняется 13 раз, и поэтому с операциями DB. То же самое происходит, когда я набираю «123» для отображения списка предложений, set() выполняется 3 раза.

Я хотел set(), чтобы получить выполнение, когда пользователь перестает печатать на barcodeTextField. В Javascript/JQuery это можно сделать с использованием события keyup() и с использованием метода setTimeout() внутри, clearTimeout(), когда пользователь все еще печатает.

Как реализовать это поведение для JTextField в Java?

+0

я сделал. Некоторые из них используют библиотеки, которые мне не нужны, поскольку моя проблема заключается не только в сканировании штрих-кодов, но также включает список предложений в качестве типов пользователей. Есть ли способ получить строку, введенную на 'JTextField', когда пользователь перестает печатать? –

+0

Точно так же, Javascript имеет таймаут, Swing имеет таймер. Так что, если вы ищете в Javscript, используя его «таймер» fucntionality, вы можете увидеть, можете ли вы заставить его работать с [Swing Timers] (http://docs.oracle.com/javase/tutorial/uiswing/ разное/таймер.html) –

+1

Например, 'Timer' имеет' restart'. Таким образом, вы можете установить задержку на таймере, например, 1000 миллисекунд. Запустите таймер при первом изменении. Следующий изменяется, проверяйте 'if (timer.isRunning())' и 'timer.restart()', else 'timer.start()'. Действие для таймера будет происходить только в том случае, если одна секунда пройдет после изменения любого документа. И установите 'timer.setRepeats (false)', поэтому действие происходит только один раз –

ответ

1

«Есть ли способ, чтобы получить строку введенную на 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

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(); 
      } 
     } 
    } 
} 
+1

В течение короткого промежутка времени вы сделали полный рабочий пример качения. :) Благодаря! –

 Смежные вопросы

  • Нет связанных вопросов^_^