我有一个应用程序,有时会在后台线程中启动一个长时间运行的进程。 如果它是从主应用程序执行此操作,我将等待光标设置为:
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设置它,但这也不起作用。
有没有办法让这个工作?
答案 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());
}