Domanda

Ho un'applicazione Java Swing, sviluppata su Mac OS X 10.5 usando Java 1.5.

Sto cercando di far apparire un cursore personalizzato quando l'utente sposta il mouse su del testo in una finestra di dialogo. Tuttavia, il cursore non cambia mai.

Quando non uso un JFrame invece di un JDialog, il cursore cambia. Ma poi dovrò scrivere tutto il codice del dialogo da solo.

Come posso visualizzare il cursore?

Ecco il codice più semplice che potrei creare per dimostrare il 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);
    }
}
È stato utile?

Soluzione

Sembra che sia un bug in Java 1.5: ho provato per la prima volta con Java 1.6.0_07 e ha funzionato come previsto (su Windows XP). Quindi ho ricompilato con Java 1.5.0_06 e in effetti il ??cursore rimane nello stato predefinito.

Conoscendo le difficoltà di Java 1.6 su MacOS, vedo che sarà difficile risolverlo ...

Bug ID: 5079694 JDialog non rispetta setCursor
Danno una soluzione alternativa ...

[EDIT] Soluzione alternativa testata:

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

Funziona bene con il mio JDK & amp; sistema.

Altri suggerimenti

Grazie a PhiLho, la segnalazione di bug di Sun mi ha dato la soluzione. Il proprietario (frame principale) deve essere non null e mostrare. Per la cronaca, ecco una versione modificata del mio codice di esempio che mostra un cursore a 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);
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top