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.
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.
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.
Daripada penyebaran manual, penyelesaian yang lebih cekap terletak pada memanfaatkan tindakan sedia ada yang dikaitkan dengan JScrollPane. Tindakan ini biasanya digunakan untuk pengikatan kunci.
<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>
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!