Frage

Ich habe eine Java-Swing-Anwendung, entwickelt auf Mac OS X 10.5 mit Java 1.5.

Ich versuche, eine benutzerdefinierte Cursor erscheinen zu lassen, wenn der Benutzer mit der Maus über einen Text in einem Dialog bewegt. Der Cursor ändert sich nie, though.

Wenn ich anstelle eines JDialog keine JFrame verwenden, wird der Cursor sich ändert. Aber dann werde ich mich um alle Dialog Code zu schreiben.

Wie kann ich die Cursor angezeigt werden?

Hier ist der einfachste Code könnte ich schaffen, das Problem zu demonstrieren:

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);
    }
}
War es hilfreich?

Lösung

Sieht aus wie es ein Fehler in Java 1.5 ist: Ich habe versucht, zuerst mit Java 1.6.0_07 und es funktionierte wie erwartet (unter Windows XP). Dann habe ich mit Java 1.5.0_06 neu kompiliert und in der Tat der Cursor bleibt in Auslieferungszustand.

die Schwierigkeiten von Java 1.6 auf MacOS Zu wissen, ich sehe es wird schwer sein, das zu reparieren ...

Bug ID: 5079694 JDialog nicht respektiert setCursor
Sie geben eine Abhilfe ...

[EDIT] Getestet Abhilfe:

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

Adaequat mit meinem JDK & System.

Andere Tipps

Danke PhiLho, dass Sun Bug-Report gab mir die Lösung. Der Besitzer (Mutterrahmen) müssen nicht leer ist und zeigt sein. Für die Aufzeichnung, hier ist eine modifizierte Version von meinem Beispiel-Code, der nicht eine Hand Cursor zeigen.

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);
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top