Пользовательский курсор в Swing JDialog - PullRequest
4 голосов
/ 24 ноября 2008

У меня есть приложение Java Swing, разработанное в Mac OS X 10.5 с использованием Java 1.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);
    }
}

Ответы [ 2 ]

4 голосов
/ 24 ноября 2008

Похоже, что это ошибка в Java 1.5: я впервые попробовал с Java 1.6.0_07, и он работал как ожидалось (на Windows XP). Затем я перекомпилировал с Java 1.5.0_06, и курсор действительно остался в состоянии по умолчанию.

Зная о трудностях Java 1.6 на MacOS, я вижу, что это будет трудно исправить ...

Идентификатор ошибки: 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 и системой.

2 голосов
/ 24 ноября 2008

Спасибо, 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);
    }
}
...