首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ListSelectionListener事件的延迟

ListSelectionListener事件的延迟
EN

Stack Overflow用户
提问于 2018-01-25 18:21:52
回答 1查看 111关注 0票数 0

我有一个普通的JTable和一个ListSelectionListener。我想,它可以正常工作,但有一个问题:

  1. 我单击表行
  2. 事件触发( valueChanged启动方法)
  3. 在valueChanged内部,我启动一个http请求(需要几个ms)
  4. 表行明显地被选中(蓝色背景)

这会产生明显的延迟。

我能改变事件的顺序吗?我想先要蓝色背景,然后再做http请求。在valueChanged方法中插入睡眠计时器使所选内容等待计时器完成。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-25 18:41:54

您可能应该在后台线程上执行HTTP请求。如果需要异常长的时间,这也将具有保持UI响应性的优点。

您最终会得到类似这样的代码,具体取决于您的实际需求:

代码语言:javascript
复制
private static class HttpWorker extends SwingWorker<Void, Void> {
    private final String url;
    private HttpWorker(String url) {
        this.url = Objects.requireNonNull(url);
    }
    @Override
    protected Void doInBackground() {
        // do request, possibly producing some result
    }
    @Override
    protected void done() {
        if (!isCancelled()) {
            // update UI
        }
    }
}

private HttpWorker worker;

@Override
public void valueChanged(ListSelectionEvent e) {
    if (worker != null) {
        // preserve apparent order of operations if
        // the user selects something different while
        // a background task is already running
        worker.cancel(true);
        worker = null;
    }
    worker = new HttpWorker(...);
    worker.execute();
}

doInBackground通常可以采取任何行动,只要您不从它与Swing UI交互。

还请参阅教程文档

为了得到完整的答案,在列表选择事件开始时执行以下操作可能会有效:

代码语言:javascript
复制
jlist.paintImmediately(0, 0, jlist.getWidth(), jlist.getHeight());

至少在指定paintImmediately来执行隐含的操作时,这是这样的:

立即绘制此组件中的指定区域及其与该区域重叠的所有子区域。..。如果在分派当前事件时需要更新显示,则此方法非常有用。

我不建议使用它的原因是,没有特殊的理由需要在我们自己的侦听器之前更新JList,这样列表实际上就会绘制新的选择。

还有一个问题是,像HTTP请求这样的繁重任务通常不应该在Swing线程上执行,因为它会冻结UI。即使在希望用户等待一段时间的情况下,也不会直接在Swing线程上执行任务。您可以在后台线程中这样做,并弹出一个模态对话框,可能会给用户提前取消任务的选项。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48449494

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档