Pregunta

Tengo una aplicación Java Swing, desarrollada en Mac OS X 10.5 con Java 1.5.

Estoy tratando de hacer que aparezca un cursor personalizado cuando el usuario mueve el mouse sobre algún texto en un cuadro de diálogo. Sin embargo, el cursor nunca cambia.

Cuando no uso un JFrame en lugar de un JDialog, el cursor cambia. Pero luego tendré que escribir todo el código de diálogo yo mismo.

¿Cómo puedo hacer que aparezca el cursor?

Aquí está el código más simple que podría crear para demostrar el problema:

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);
    }
}
¿Fue útil?

Solución

Parece que es un error en Java 1.5: probé por primera vez con Java 1.6.0_07 y funcionó como se esperaba (en Windows XP). Luego recompilé con Java 1.5.0_06 y, de hecho, el cursor permanece en el estado predeterminado.

Conociendo las dificultades de Java 1.6 en MacOS, veo que será difícil arreglar eso ...

Error ID: 5079694 JDialog no respeta setCursor
Dan una solución ...

[EDIT] Solución probada:

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

Funciona bien con mi JDK & amp; sistema.

Otros consejos

Gracias PhiLho, ese informe de error de Sun me dio la solución. El propietario (marco principal) no debe ser nulo y debe mostrarse. Para el registro, aquí hay una versión modificada de mi código de ejemplo que muestra un cursor de mano.

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);
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top