正如我的评论中已经提到的那样:重新/设置游标并不是一件容易的事,甚至对于单个组件也不是很简单的:-)基本问题(在递归游标设置中等待)是假设所有组件 都
具有默认值光标。
如表头所示,这种假设是不正确的:在该组件上,“默认”是defaultCursor或resizeCursor,具体取决于鼠标的位置。另外,内部光标切换不是很聪明:它不检查状态(从我的头顶看,前一阵子被这个事实击中了:-)
不能完全确定要达到的目标,因此没有具体解决方案,除了完全删除递归设置外,很难正确地做到这一点。选项可能是
- 使(框架根窗格的)glassPane可见,并在其上设置waitCursor
- 在较小的区域上使用JLayer(jdk7)或JXLayer(jdk6),然后在该区域上设置waitCursor
- 在某个地方使用JProgressBar或JXBusyLabel(在SwingX项目中)使用较少干扰的可视化
附录 (@mKorbel :-)
这个问题很容易重现,只需对OP
SSCCE稍作更改(谢谢!):如下更改addButton方法,然后单击按钮,在显示等待光标的同时,将鼠标移到标题中,然后另一列(跨列边界)。这样做多次将导致标题上出现不可预测的游标…
private void addButton() { button = new JButton("Click Me"); final ActionListener off = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { setDefaultCursor(); button.setEnabled(true); } }; button.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent ae) { setWaitCursor(); button.setEnabled(false); Timer timer = new Timer(2000, off); timer.setRepeats(false); timer.start(); } }); add(button, BorderLayout.NORTH);}


