并不总是在Mac上显示等待光标

时间:2015-04-26 08:59:28

标签: java macos swing

我正在实施一个"加载文件"我的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();
      }
    });
  }
}

0 个答案:

没有答案