2014-10-30 46 views
1

我有一個JTextFieldbarcodeTextField接受來自使用條形碼掃描器掃描的條形碼字符。據我所知,條形碼掃描就像非常快速地輸入字符或在文本字段上覆制粘貼字符。 barcodeTextField也用於顯示的建議,並填寫了信息,外人田(就像在谷歌推薦內容顯示爲您鍵入搜索)。執行條形碼掃描完成時動作的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次,所以與數據庫操作。當我輸入「123」來顯示建議列表時,同樣去,set()被執行3次。

我想set()當用戶停止對barcodeTextField打字得到執行。在Javascript/JQuery,這可以通過使用keyup()事件和具有setTimeout()方法內,clearTimeout()當用戶仍在鍵入來進行。

如何實現這一行爲在Java JTextField

+0

我做到了。其中一些使用我不需要的庫,因爲我的問題不僅僅是條形碼掃描,還包括用戶鍵入的建議列表。有什麼方法可以在用戶停止輸入時獲得在'JTextField'上輸入的字符串? – 2014-10-31 04:59:20

+0

同樣,Javascript有超時,Swing有一個Timer。因此,如果您正在尋找的是使用其「定時器」功能在Javscript中實現的,您可以看看您是否可以使用[Swing Timers](http://docs.oracle.com/javase/tutorial/uiswing/)雜項/定時器。html) – 2014-10-31 05:06:22

+1

例如'Timer'有一個'restart'。所以你可以在計時器上設置一個延遲,例如1000毫秒。第一次更改時啓動計時器。下一個改變,檢查'if(timer.isRunning())'和'timer.restart()',否則'timer.start()'。只有在任何文檔更改後經過一秒時,定時器的動作纔會發生。並設置'timer.setRepeats(false)'這樣的動作只發生一次 – 2014-10-31 05:10:26

回答

1

「有什麼辦法來獲取JTextField中輸入的字符串當用戶停止鍵入」

用同樣的方法,JavaScript有超時,擺有一個定時器。所以,如果你要尋找一個使用它的「計時器」 fucntionality在Javscript實現,你可以看到,如果你能得到它與Swing Timers

工作例如Timerrestart。所以你可以在計時器上設置一個延遲,例如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毫秒。對於文檔中的每個更改,計時器都會重新啓動。

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

您在短時間內完成了一個完整的工作示例。 :) 謝謝! – 2014-10-31 05:48:52