2014-10-30 47 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