我正在实施一个"加载文件"我的Java应用程序中的功能 - 有时该文件可能位于网络共享上,这可能需要一段时间才能读取。用户选择要加载的文件后,我将鼠标光标更改为Cursor.WAIT_CURSOR
。这在Windows上工作正常,但我在Mac OS 10.9.5上的Java 7u75和8u45上都得到了奇怪的结果。我尝试更改JFrame
组件和GlassPane
上的光标,但我看到的结果相同。
基本上,在Mac OS上,如果鼠标以任何方式与JFileChooser
交互,则光标不会被更改,但如果我使用键盘选择文件,那么它会按预期工作并且光标已更改。
这看起来有点像虫子,但是看看那些可能曾经遇到过这种情况并征服它的人的智慧?我在下面放了一个SSCCE来证明这个问题。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class SSCCE extends JFrame implements ActionListener {
private final SSCCE T = this;
private Component gP = getRootPane().getGlassPane();
private JMenuBar mBar;
private JMenu mFile;
private JMenuItem miLoad;
public SSCCE() {
setTitle("SSCCE");
setSize(960, 640);
setDefaultCloseOperation(EXIT_ON_CLOSE);
mBar = new JMenuBar();
mFile = new JMenu("File");
miLoad = new JMenuItem("Load");
miLoad.addActionListener(this);
mFile.add(miLoad);
mBar.add(mFile);
setJMenuBar(mBar);
setLocationRelativeTo(null);
setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == miLoad) {
JFileChooser fc = new JFileChooser();
fc.showDialog(this, "Test");
updateCursor(Cursor.WAIT_CURSOR);
new SwingWorker<Void, Void>() {
@Override
protected Void doInBackground() {
try {
Thread.sleep(5000);
}
catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected void done() {
updateCursor(Cursor.DEFAULT_CURSOR);
JOptionPane.showMessageDialog(T, "OK", "Status", JOptionPane.PLAIN_MESSAGE);
}
}.execute();
}
}
private void updateCursor(final int c) {
gP.setCursor(Cursor.getPredefinedCursor(c));
gP.setVisible(c != Cursor.DEFAULT_CURSOR);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new SSCCE();
}
});
}
}