为什么在JTable中更新数据时有时候我的等待光标没有显示?

时间:2012-02-18 00:16:22

标签: java swing swingworker mouse-cursor

我有一个JTable,当用户点击列标题时,它将从数据库重新加载已排序的数据。 MainView(JFrame)包含将创建新SwingWorker并启动它的GUI元素。 SwingWorker的doInBackGround()函数将MainView的光标更改为等待光标。然后当doInBackground()函数完成它的工作并在它离开doBackground函数之前,它将光标更改回默认光标。

有时光标会显示但过了一会儿它会在每次点击标题时停止显示光标。它可能在前几次工作,看起来很随意。

为什么光标有时显示,而其他光标显示?有没有特别的方法我应该设置等待光标?我应该从SwingWorker线程还是从MainView GUI线程设置等待光标?

3 个答案:

答案 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上找到有关这些游标方法的其他信息。

Here一个包含一些繁忙游标代码示例的页面,here一个与游标相关的SO问题。