Heim  >  Artikel  >  Java  >  Warum wird mein Java-Wartecursor nicht über benutzerdefinierten Cursorn angezeigt?

Warum wird mein Java-Wartecursor nicht über benutzerdefinierten Cursorn angezeigt?

Linda Hamilton
Linda HamiltonOriginal
2024-11-24 19:31:13831Durchsuche

Why Doesn't My Java Wait Cursor Appear Over Custom Cursors?

Problem mit der Java-Wartecursor-Anzeige

Problem:

Bei der Anzeige eines Wartecursors in Bei einer Java-Anwendung wird der Cursor nicht angezeigt, wenn sich die Maus über einem Bereich befindet, der seinen eigenen Cursor definiert. Dieses Problem wird in der bereitgestellten Sample Self-Contained Executable (SSCE) demonstriert.

Ursache:

Die Standardimplementierung des Java-Wartecursors betrifft nur den Cursor, der direkt aktiviert ist die Komponente. Panels mit benutzerdefinierten Cursorn haben Vorrang und überschreiben den Wartecursor.

Lösung:

Um dies zu beheben, sollte der Wartecursor auf die Glasscheibe des JFrame gesetzt werden, der enthält die Komponente, die angezeigt werden soll it.

Implementierung:

  1. Erstellen Sie einen Aktions-Listener, der:

    • Plant eine Aufgabe, um die Wartezeit festzulegen Cursor nach einer angegebenen Verzögerung.
    • Führt den ursprünglichen Aktions-Listener nach dem aus Verzögerung.
  2. Wenn der Aktions-Listener ausgelöst wird:

    • Setzen Sie den Wartecursor auf die Glasscheibe des JFrame.
    • Fügen Sie eine hinzu Mausadapter an die Glasscheibe an, um zu verhindern, dass Mausereignisse darunter liegende Komponenten erreichen.
    • Machen Sie die Glasscheibe sichtbar.
  3. Wenn die Timer-Aufgabe abgeschlossen ist:

    • Stellen Sie den ursprünglichen Cursor auf dem JFrame wieder her.
    • Entfernen Sie den Mausadapter von der Glasscheibe.
    • Verstecken Sie die glasspane.

Modifiziertes SSCE:

Das modifizierte SSCE enthält diese Änderungen, um sicherzustellen, dass der Wartecursor auch dann angezeigt wird, wenn die Panels benutzerdefinierte sind Cursor:

public class BusyCursorTest extends javax.swing.JFrame {

    private javax.swing.JPanel cursorPanel = null;

    // ... (remaining code)

    public static void main(String[] args) {
        new BusyCursorTest();
    }

    public static java.awt.event.ActionListener getActionListener(final javax.swing.JFrame frame,
        final java.awt.event.ActionListener originalActionListener) {

        java.awt.event.ActionListener actionListener = new java.awt.event.ActionListener() {

            public void actionPerformed(final java.awt.event.ActionEvent e) {

                java.util.TimerTask timerTask = new java.util.TimerTask() {

                    public void run() {
                        originalCursor = frame.getCursor();
                        startWaitCursor(frame);
                    }

                };
                java.util.Timer timer = new java.util.Timer();

                try {
                    timer.schedule(timerTask, DELAY_MS);
                    originalActionListener.actionPerformed(e);
                } finally {
                    timer.cancel();
                    stopWaitCursor(frame);
                }
            }

        };
        return actionListener;
    }

    private static void startWaitCursor(javax.swing.JFrame frame) {
        frame.getGlassPane().setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.WAIT_CURSOR));
        frame.getGlassPane().addMouseListener(mouseAdapter);
        frame.getGlassPane().setVisible(true);
    }

    private static void stopWaitCursor(javax.swing.JFrame frame) {
        frame.getGlassPane().setCursor(originalCursor);
        frame.getGlassPane().removeMouseListener(mouseAdapter);
        frame.getGlassPane().setVisible(false);
    }

    // ... (remaining code)
}

Das obige ist der detaillierte Inhalt vonWarum wird mein Java-Wartecursor nicht über benutzerdefinierten Cursorn angezeigt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn