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:
Erstellen Sie einen Aktions-Listener, der:
Wenn der Aktions-Listener ausgelöst wird:
Wenn die Timer-Aufgabe abgeschlossen ist:
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!