首頁 >Java >java教程 >為什麼我的 Java 等待遊標沒有出現在自訂遊標之上?

為什麼我的 Java 等待遊標沒有出現在自訂遊標之上?

Linda Hamilton
Linda Hamilton原創
2024-11-24 19:31:13844瀏覽

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

Java 等待遊標顯示問題

問題:

在中顯示等待光標時顯示等待光標時顯示等待光標時在中顯示等待光標時顯示等待光標時顯示等待光標時在中顯示等待光標時顯示等待光標時顯示等待光標時在中顯示等待光標時顯示等待光標時顯示等待光標時在中顯示等待光標時顯示等待光標時顯示等待光標時顯示等待遊標時在中顯示等待遊標時顯示等待光標時顯示等待遊標時顯示等待遊標時在中Java 應用程式中,如果滑鼠位於定義了自己的遊標的面板上,則遊標不會出現。此問題在提供的範例自包含可執行檔 (SSCE) 中進行了演示。

原因:

Java 等待遊標的預設實作僅影響直接設定在元件。具有自訂遊標的面板優先,覆蓋等待遊標。

解決方案:

要解決此問題,應將等待遊標設定在包含的 JFrame的玻璃窗格上尋求顯示的組件

實作:

  1. 建立一個動作監聽器:

    • 建立一個動作監聽器:
    • 安排一個任務來設定等待指定延遲後的遊標。
  2. 在延遲。
    • 觸發動作偵聽器時:
    • 將等待遊標設定在 JFrame 的玻璃窗格上。
    • 新增一個將滑鼠轉接器連接到 glasspane,以防止滑鼠事件到達底層組件。
  3. 製作 glasspane可見。
    • 定時器任務完成時:
    • 將原始遊標還原為 JFrame。
    • 移除滑鼠轉接器從玻璃板上。
  4. 隱藏glasspane。

修改後的SSCE:

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)
}
修改後的SSCE 合併了這些更改,以確保即使面板有自定義,也確保會顯示等待遊標遊標:

以上是為什麼我的 Java 等待遊標沒有出現在自訂遊標之上?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn