2

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

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);

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

有没有办法让这个工作?

4

1 回答 1

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());
}
于 2020-10-28T21:50:12.027 回答