在glasspane上设置waitcursor在Dialog中不起作用

时间:2012-05-10 21:52:30

标签: java swing jdialog glasspane busy-cursor

我有一个应用程序,有时会在后台线程中启动一个长时间运行的进程。 如果它是从主应用程序执行此操作,我将等待光标设置为:

oldCursor = App.getInstance().getGlassPane().getCursor();
App.getInstance().getGlassPane().setVisible(true);
App.getInstance().getGlassPane().setCursor(waitCursor);

这很有效,我按照这样关闭光标:

App.getInstance().getGlassPane().setCursor(oldCursor);
App.getInstance().getGlassPane().setVisible(false);

所以,现在我有时会从JDialog执行一项长期运行的任务。 (它有setModal(true)) 在JDialog中执行此操作永远不会更改光标:

oldCursor = getGlassPane().getCursor();
getGlassPane().setVisible(true);
getGlassPane().setCursor(waitCursor);

所以,我尝试为App设置它,但这也不起作用。

有没有办法让这个工作?

1 个答案:

答案 0 :(得分:0)

我知道这个问题太老了。但是,我有一个相同的问题,在找到解决方案之前,我花了一段时间搜索许多网站上的旧线程。将其发布在这里可以帮助我(可能还有其他人)在将来找到它。

供参考,https://www.javaspecialists.eu/archive/Issue065-Wait-Cursor-Wait.html解释了OP的代码为什么不起作用。不幸的是,该文章中提出的解决方案并不理想(例如,在对话框打开之前设置光标,然后在对话框关闭之后再更改)。

但是,由于JDialog是顶层的Swing容器,因此您可以直接在其上调用GetRootPane()来访问更改光标的权限:

getRootPane().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
// long running code here
getRootPane().setCursor(Cursor.getDefaultCursor());

另一项改进是将等待光标设置在try块中,并将默认光标还原到finally块中,因此,如果有异常,则不会留下永远的等待光标:

try {
    getRootPane().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
    // long running code here
} finally {
    getRootPane().setCursor(Cursor.getDefaultCursor());
}