4

Java 1.5 を使用して Mac OS X 10.5 で開発された Java Swing アプリケーションがあります。

ユーザーがダイアログ内のテキストの上にマウスを移動すると、カスタム カーソルが表示されるようにしようとしています。ただし、カーソルは決して変化しません。

JDialog の代わりに JFrame を使用しないと、カーソルが変わります。しかし、その場合、すべてのダイアログ コードを自分で作成する必要があります。

カーソルを表示するにはどうすればよいですか?

問題を示すために作成できる最も単純なコードを次に示します。

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 で再コンパイルしましたが、実際にカーソルはデフォルト状態のままです。

MacOS での Java 1.6 の難しさを知っているので、それを修正するのは難しいと思います...

バグ 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 のバグ レポートが解決策を教えてくれました。所有者 (親フレーム) は null ではなく、表示されている必要があります。記録として、ハンド カーソルを表示するサンプル コードの修正版を次に示します。

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 に答える