gpt4 book ai didi

java - ListSelectionListener 事件延迟

转载 作者:行者123 更新时间:2023-12-02 11:42:29 26 4
gpt4 key购买 nike

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

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

这会产生明显的延迟。

我可以更改 Activity 的顺序吗?我想先有蓝色背景,然后进行http请求。在 valueChanged 方法中插休眠眠计时器会使选择等待,直到计时器完成。

最佳答案

您可能应该在后台线程上执行 HTTP 请求。如果需要异常长时间,这还有一个优点是可以保持 UI 响应。

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

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 交互即可。

另请参阅the SwingWorker tutorialsdocumentation .

<小时/>

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

jlist.paintImmediately(0, 0, jlist.getWidth(), jlist.getHeight());

至少是 paintImmediately被指定执行隐含的操作:

Paints the specified region in this component and all of its descendants that overlap the region, immediately. [...] This method is useful if one needs to update the display while the current event is being dispatched.

我不建议使用它的原因是,没有特殊原因需要在我们自己的监听器之前更新 JList ,以便列表实际上绘制新的选择。

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

关于java - ListSelectionListener 事件延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48449494/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com