Question

Je possède une application Java Swing, développée sous Mac OS X 10.5 avec Java 1.5.

J'essaie de faire apparaître un curseur personnalisé lorsque l'utilisateur déplace la souris sur un texte dans une boîte de dialogue. Le curseur ne change jamais, cependant.

Lorsque je n'utilise pas un JFrame au lieu d'un JDialog, le curseur change. Mais ensuite, je vais devoir écrire tout le code de la boîte de dialogue moi-même.

Comment puis-je faire en sorte que le curseur apparaisse?

Voici le code le plus simple que j'ai pu créer pour illustrer le problème:

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);
    }
}
Était-ce utile?

La solution

On dirait qu’il s’agit d’un bogue dans Java 1.5: j’ai tout d’abord essayé avec Java 1.6.0_07 et cela a fonctionné comme prévu (sous Windows XP). Ensuite, j'ai recompilé avec Java 1.5.0_06 et le curseur reste dans l'état par défaut.

Connaissant les difficultés de Java 1.6 sur MacOS, je vois qu'il sera difficile de résoudre ce problème ...

Bug ID: 5079694 JDialog ne respecte pas setCursor
Ils donnent une solution de contournement ...

[EDIT] Solution de contournement testée:

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();
      }
    });
  }
}

Fonctionne bien avec mon JDK & amp; système.

Autres conseils

Merci, PhiLho, ce rapport de bogue de Sun m’a apporté la solution. Le propriétaire (cadre parent) doit être non nul et affiché. Pour mémoire, voici une version modifiée de mon exemple de code que fait afficher un curseur de main.

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);
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top