我有一个普通的JTable和一个ListSelectionListener。我想,它可以正常工作,但有一个问题:
这会产生明显的延迟。
我能改变事件的顺序吗?我想先要蓝色背景,然后再做http请求。在valueChanged方法中插入睡眠计时器使所选内容等待计时器完成。
发布于 2018-01-25 18:41:54
您可能应该在后台线程上执行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交互。
为了得到完整的答案,在列表选择事件开始时执行以下操作可能会有效:
jlist.paintImmediately(0, 0, jlist.getWidth(), jlist.getHeight());至少在指定paintImmediately来执行隐含的操作时,这是这样的:
立即绘制此组件中的指定区域及其与该区域重叠的所有子区域。..。如果在分派当前事件时需要更新显示,则此方法非常有用。
我不建议使用它的原因是,没有特殊的理由需要在我们自己的侦听器之前更新JList,这样列表实际上就会绘制新的选择。
还有一个问题是,像HTTP请求这样的繁重任务通常不应该在Swing线程上执行,因为它会冻结UI。即使在希望用户等待一段时间的情况下,也不会直接在Swing线程上执行任务。您可以在后台线程中这样做,并弹出一个模态对话框,可能会给用户提前取消任务的选项。
https://stackoverflow.com/questions/48449494
复制相似问题