Rumah  >  Artikel  >  Java  >  Bagaimana untuk Melaksanakan Tatal Seret Tetikus untuk JScrollPane dengan Komponen Bersarang dalam Java Swing?

Bagaimana untuk Melaksanakan Tatal Seret Tetikus untuk JScrollPane dengan Komponen Bersarang dalam Java Swing?

Patricia Arquette
Patricia Arquetteasal
2024-10-26 11:19:29897semak imbas

How to Implement Mouse Drag Scrolling for a JScrollPane with Nested Components in Java Swing?

MouseMotionEvent dalam Java Swing: Cara Berinteraksi dengan Komponen Bersarang

Cabaran Hierarki Komponen

Apabila mereka bentuk GUI berasaskan Swing, pembangun sering menghadapi cabaran semasa mengendalikan acara tetikus dalam komponen bersarang. Secara lalai, peristiwa tetikus disebarkan ke atas hierarki komponen, berakhir di bekas peringkat atas. Ini boleh mengganggu pengendalian acara untuk komponen tertentu dalam struktur bersarang.

Isu: Peristiwa Tetikus Tidak Mencapai Komponen Dalaman

Satu senario sedemikian ditunjukkan dalam soalan yang dikemukakan. Matlamatnya adalah untuk melaksanakan paparan boleh tatal menggunakan JScrollPane yang bertindak balas kepada seretan tetikus. Walau bagaimanapun, apabila menambahkan komponen tambahan pada JScrollPane, peristiwa gerakan tetikus disekat daripada mencapai anak tetingkap skrol.

Menyebarkan Acara Tetikus Secara Manual: Pendekatan Tidak Cekap

Pemaju pada mulanya mempertimbangkan penyebaran peristiwa tetikus secara manual dengan menambahkan pendengar pada setiap komponen bersarang dan memajukan acara kepada induk. Walau bagaimanapun, pendekatan ini menimbulkan pelaburan masa yang tidak praktikal.

Penyelesaian Alternatif: Memanfaatkan Tindakan JScrollPane

Daripada penyebaran manual, penyelesaian yang lebih cekap terletak pada memanfaatkan tindakan sedia ada yang dikaitkan dengan JScrollPane. Tindakan ini biasanya digunakan untuk pengikatan kunci.

Melaksanakan Penyelesaian:

  1. Buat tindakan pengikatan kunci tersuai yang meniru tindakan tatal.
  2. Lampirkan tindakan ini pada Contoh JScrollPane.
  3. Gunakan pemasa untuk terus mencetuskan tindakan tatal yang diingini, seperti kiri, kanan, atas atau bawah, berdasarkan pergerakan tetikus dalam port pandangan.

Kod Java :

<code class="java">import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.Action;
import javax.swing.JViewport;
import javax.swing.JScrollPane;
import javax.swing.Timer;

class ScrollTimer implements ActionListener {

    private Timer timer;
    private Action action;
    private JScrollPane scrollPane;
    private int count;

    public ScrollTimer(JScrollPane scrollPane, String action) {
        this.action = scrollPane.getActionMap().get(action);
        this.scrollPane = scrollPane;
        timer = new Timer(100, this);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (count++ < 10) {
            action.actionPerformed(new ActionEvent(scrollPane, 0, action.getValue(Action.NAME)));
        } else {
            timer.stop();
        }
    }

    public void start() {
        count = 0;
        timer.start();
    }

    public void stop() {
        timer.stop();
        count = 0;
    }
}

class MouseEventHandler extends MouseAdapter {

    private ScrollTimer left, right, up, down;

    public MouseEventHandler(JScrollPane scrollPane) {
        left = new ScrollTimer(scrollPane, "scrollLeft");
        right = new ScrollTimer(scrollPane, "scrollRight");
        up = new ScrollTimer(scrollPane, "scrollUp");
        down = new ScrollTimer(scrollPane, "scrollDown");
        JViewport viewPort = scrollPane.getViewport();
        viewPort.addMouseMotionListener(this);
    }

    @Override
    public void mouseMoved(MouseEvent e) {
        left.stop();
        if (e.getX() < 16) {
            left.start();
        }
        right.stop();
        if (e.getX() > viewPort.getWidth() - 16) {
            right.start();
        }
        up.stop();
        if (e.getY() < 16) {
            up.start();
        }
        down.stop();
        if (e.getY() > viewPort.getHeight() - 16) {
            down.start();
        }
    }
}

// ... (rest of the code)</code>

Kesimpulan

Pendekatan alternatif ini berkesan menyelesaikan isu yang dihadapi oleh soalan asal. Dengan memanfaatkan tindakan tatal terbina dalam JScrollPane, pembangun boleh menyebarkan peristiwa gerakan tetikus ke anak tetingkap tatal, membolehkan tatal lancar dan responsif walaupun dalam struktur komponen bersarang.

Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan Tatal Seret Tetikus untuk JScrollPane dengan Komponen Bersarang dalam Java Swing?. 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