java - 键盘输入: perform request with delay between symbols

标签 java input timer delay timertask

为了减少搜索时服务器的过载,我将提供键盘输入延迟。

用例:
1.用户输入符号
2.如果输入符号之间有延迟<1秒,则搜索不会立即执行,并在最后输入符号后的延迟为时等待> 1秒
3.如果输入符号之间的延迟>1秒,则搜索立即执行

JSE 或移动 Java(Blackberry)是否有最佳实践?

看起来我应该使用TimerTaskTimer适合这种情况的 API。是吗?

最佳答案

根据Java并发圣经'Java concurrency in practice '

... Timer has some drawbacks, and ScheduledThreadPoolExecutor should be thought of as its replacement.

因此,我会做类似这个例子的事情:

public class DelayedSearch extends JFrame {
    public DelayedSearch() {
        final JPanel panel = new JPanel(new BorderLayout());
        final JTextField field = new JTextField(30);
        panel.add(field, BorderLayout.NORTH);
        final JLabel status = new JLabel(" ");
        panel.add(status, BorderLayout.SOUTH);
        this.add(panel);
        this.pack();
        final ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
        field.addKeyListener(new KeyAdapter() {
            private ScheduledFuture<?> scheduled;
            @Override
            public void keyTyped(KeyEvent e) {
                if (scheduled != null) scheduled.cancel(false);
                scheduled = executor.schedule(new Runnable() {
                    @Override
                    public void run() { // Perform search here. Just set status for demo.
                        status.setText("Search: " + field.getText());
                    }
                }, 1, TimeUnit.SECONDS);
            }
        });
    }
    public static void main(String[] args) {
        new DelayedSearch().setVisible(true);
    }
}

注意:我正在从 EDT 以外的线程更新状态,这是非法的,但您明白了。

编辑:基于下面的精彩评论(谢谢!)Timer将在这个简单的情况下工作,并且它使得使用守护线程变得容易(尽管它确实存在抛出异常的任务问题) ,如书中所述)。为此,请替换上面的执行器和监听器,如下所示:

        ...
        final Timer timer = new Timer(true); // use daemon thread.
        field.addKeyListener(new KeyAdapter() {
            private TimerTask task;
            @Override
            public void keyTyped(KeyEvent e) {
                if(task != null)task.cancel();
                task = new TimerTask() {
                    @Override
                    public void run() {
                        status.setText("Search: " + field.getText());
                    }
                };
                timer.schedule(task, 1000);
            }
        });

关于java - 键盘输入: perform request with delay between symbols,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10163425/

相关文章:

java - Spring Security 是如何跨 Web 应用请求在一个线程中管理 SecurityContext 的?

Java EE : NoClassDefFoundError org. joda.time.DateTime 与 IntelliJ 和 Maven

java - 使用 Apache Commons Net 下载后 FTP 文件损坏

Javascript:如何检查输入是否正确

java - 不幸的是音频已停止

javascript - 没有正则表达式的字符串中的数字?

java - Java:数组操作函数中的错误

batch-file - 在cmd中关闭程序的计时器

Java 同时淡入和淡出两个 JPanel

java - 如何在java中点击按钮时使用计时器