4

我有一个 Java Swing 应用程序,使用 Java 1.5 在 Mac OS X 10.5 上开发。

当用户将鼠标移动到对话框中的某些文本上时,我试图使自定义光标出现。但是,光标永远不会改变。

当我不使用 JFrame 而不是 JDialog 时,光标会发生变化。但是我必须自己编写所有的对话代码。

如何让光标出现?

这是我可以创建来演示问题的最简单的代码:

import javax.swing.*;
import java.awt.*;

public class CursorTest {

    public static void main(String[] args) {
        JLabel label = new JLabel("Move mouse here for hand cursor");
        label.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
        JOptionPane pane = new JOptionPane(label);
        pane.setOptions(new Object[]{"OK"});

        JDialog dialog = pane.createDialog(null, "Test Dialog");
        dialog.setVisible(true);
    }
}
4

2 回答 2

4

看起来这是 Java 1.5 中的一个错误:我首先尝试使用 Java 1.6.0_07,它按预期工作(在 Windows XP 上)。然后我用 Java 1.5.0_06 重新编译,确实光标保持在默认状态。

知道 Java 1.6 在 MacOS 上的困难,我认为很难解决这个问题......

错误 ID:5079694 JDialog 不尊重 setCursor
他们提供了一种解决方法...

[编辑]经过测试的解决方法:

public class CursorTest extends JFrame
{
  private CursorTest()
  {
  }

  private void ShowDialog()
  {
        JLabel label = new JLabel("Move mouse here for hand cursor");
        label.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
        JOptionPane pane = new JOptionPane(label);
        pane.setOptions(new Object[] { "OK" } );

        JDialog dialog = pane.createDialog(this, "Test Dialog");
        dialog.setVisible(true);
  }

  public static void main(String[] args)
  {
    SwingUtilities.invokeLater(new Runnable()
    {
      public void run()
      {
        CursorTest testFrame = new CursorTest();
        testFrame.setTitle("Test GUI");
        testFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        testFrame.setSize(500, 300);
        testFrame.setVisible(true);
        testFrame.ShowDialog();
      }
    });
  }
}

适用于我的 JDK 和系统。

于 2008-11-24T11:55:46.567 回答
2

感谢 PhiLho,Sun 的错误报告给了我解决方案。所有者(父框架)必须为非空且显示。作为记录,这是我的示例代码的修改版本,它确实显示了手形光标。

import javax.swing.*;
import java.awt.*;

public class CursorTest {

    public static void main(String[] args) {
        JLabel label = new JLabel("Move mouse here for hand cursor");
        label.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
        JOptionPane pane = new JOptionPane(label);
        pane.setOptions(new Object[]{"OK"});

        JFrame parent = new JFrame();
        parent.setVisible(true);
        JDialog dialog = pane.createDialog(parent, "Test Dialog");
        dialog.setModal(false);
        dialog.setVisible(true);
    }
}
于 2008-11-24T12:13:54.720 回答