我有一个JTable,当用户点击列标题时,它将从数据库重新加载已排序的数据。 MainView(JFrame)包含将创建新SwingWorker并启动它的GUI元素。 SwingWorker的doInBackGround()函数将MainView的光标更改为等待光标。然后当doInBackground()函数完成它的工作并在它离开doBackground函数之前,它将光标更改回默认光标。
有时光标会显示但过了一会儿它会在每次点击标题时停止显示光标。它可能在前几次工作,看起来很随意。
为什么光标有时显示,而其他光标显示?有没有特别的方法我应该设置等待光标?我应该从SwingWorker线程还是从MainView GUI线程设置等待光标?
答案 0 :(得分:1)
您应该在doinbackground之前设置等待光标。我已经在工作线程类的构造函数中或者在调用execute之前完成了。您需要在done方法中将光标设置回正常状态。这可能就是你的问题所在。 done方法在事件派发线程上运行,该线程必须用于UI更新。
不要从doinbackground方法更新任何gui组件,否则您将看到此类行为。我不知道你做了同样的事情。这可能令人困惑。
答案 1 :(得分:0)
您可能希望让jtable对数据进行排序,而不是再次调用数据库。这很容易设置。 table sorting
答案 2 :(得分:0)
来自Oracle's Swing Concurrency page:
Swing事件处理代码在称为事件的特殊线程上运行 派遣线程。大多数调用Swing方法的代码也会运行 这个帖子。这是必要的,因为大多数Swing对象方法都是 不是“线程安全”:从多个线程调用它们冒险线程 干扰或内存一致性错误。
SwingWorker API页面报告了doInBackground()
方法:
计算结果,如果无法执行,则抛出异常。
然后从工作者处使用它来执行某些任务,在工作线程上执行。
以及done()
方法:
在doInBackground方法之后在Event Dispatch Thread上执行 完了。默认实现什么都不做。子类可以 覆盖此方法以对事件执行完成操作 派遣线程。请注意,您可以查询内部的状态 执行此方法以确定此任务的结果或 是否已取消此任务。
通常,它用于在doInBackground()
完成其工作后显示最终结果。
然后,我认为您应该将光标设置在doInBackground()
SwingWorker方法上
使用如下代码:
public Void doInBackground() {
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
...
}
并在done()
SwingWorker方法上停用它,并使用:
public void done() {
setCursor(Cursor.getDefaultCursor());
...
}
您可以在Cursor类API上找到有关这些游标方法的其他信息。