Rumah  >  Artikel  >  Java  >  Mengapa Kursor Tunggu Java Saya Tidak Muncul Di Atas Kursor Tersuai?

Mengapa Kursor Tunggu Java Saya Tidak Muncul Di Atas Kursor Tersuai?

Linda Hamilton
Linda Hamiltonasal
2024-11-24 19:31:13831semak imbas

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

Masalah dengan Paparan Kursor Tunggu Java

Isu:

Apabila memaparkan kursor tunggu dalam aplikasi Java, kursor tidak muncul jika tetikus berada di atas panel yang mentakrifkan kursornya sendiri. Isu ini ditunjukkan dalam Sample Self-Contained Executable (SSCE) yang disediakan.

Punca:

Pelaksanaan lalai kursor tunggu Java hanya mempengaruhi kursor yang ditetapkan secara langsung komponen tersebut. Panel dengan kursor tersuai diutamakan, mengatasi kursor tunggu.

Penyelesaian:

Untuk membetulkannya, kursor tunggu hendaklah ditetapkan pada kaca kaca JFrame yang mengandungi komponen yang ingin dipaparkan ia.

Pelaksanaan:

  1. Buat pendengar tindakan yang:

    • Jadualkan tugas untuk menetapkan penantian kursor selepas kelewatan yang ditentukan.
    • Melaksanakan pendengar tindakan asal selepas kelewatan.
  2. Apabila pendengar tindakan dicetuskan:

    • Tetapkan kursor tunggu pada kaca kaca JFrame.
    • Tambahkan penyesuai tetikus ke kaca kaca untuk mengelakkan peristiwa tetikus daripada mencapai dasar komponen.
    • Jadikan kaca kaca kelihatan.
  3. Apabila tugas pemasa selesai:

    • Pulihkan kursor asal kepada JFrame .
    • Alih keluar penyesuai tetikus daripada kaca.
    • Sembunyikan kaca.

SSCE yang diubah suai:

SSCE yang diubah suai menggabungkan perubahan ini untuk memastikan kursor tunggu dipaparkan walaupun panel mempunyai kursor tersuai:

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

Atas ialah kandungan terperinci Mengapa Kursor Tunggu Java Saya Tidak Muncul Di Atas Kursor Tersuai?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn