Pergunta

Eu tenho um aplicativo Java Swing, desenvolvido no Mac OS X 10.5 usando Java 1.5.

Eu estou tentando fazer um costume cursor aparecer quando o usuário move o mouse sobre algum texto em um diálogo. O cursor nunca muda, no entanto.

Quando eu não usar um JFrame em vez de um JDialog, o cursor muda. Mas então eu vou ter que escrever todo o código de diálogo mim mesmo.

Como posso obter o cursor para aparecer?

Aqui está o código mais simples que poderia criar para demonstrar o 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);
    }
}
Foi útil?

Solução

Parece que ele é um bug em Java 1.5: Eu tentei primeiro com Java 1.6.0_07 e funcionou como esperado (no Windows XP). Então eu recompilados com Java 1.5.0_06 e de fato os restos de cursor no estado padrão.

Sabendo das dificuldades de Java 1.6 no MacOS, eu vejo que vai ser difícil de corrigir isso ...

Bug

ID: 5079694 JDialog não respeita setCursor
Eles dão uma solução alternativa ...

[EDIT] solução Testado:

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 bem com o meu JDK & sistema.

Outras dicas

Graças PhiLho, que o relatório de bug Sun me deu a solução. O proprietário (quadro pai) deve ser não nulo e exibição. Para o registro, aqui está uma versão modificada do meu exemplo de código que faz mostrar um cursor mão.

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top