Maison  >  Article  >  Java  >  Comment utiliser efficacement MouseMotionListener dans Java Swing avec des composants imbriqués ?

Comment utiliser efficacement MouseMotionListener dans Java Swing avec des composants imbriqués ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-30 21:56:02244parcourir

How to Effectively Use MouseMotionListener in Java Swing with Nested Components?

MouseMotionListener dans Java Swing : surmonter l'interception des composants

En développant une interface utilisateur tactile dans Swing, on peut rencontrer le défi d'utiliser efficacement l'interface MouseMotionListener lorsque des composants imbriqués obstruent propagation des événements.

Les MouseMovedEvent et MouseDraggedEvent sont destinés à se propager dans la hiérarchie de l'interface graphique, mais ils peuvent être bloqués par des composants à l'intérieur du conteneur. Par exemple, lors de l'ajout d'un JButton à un JScrollPane, des événements peuvent déclencher le MouseMotionListener du JScrollPane.

Pour surmonter ce problème, nous présentons une approche ad hoc qui utilise le module intégré du JScrollPane. actions, généralement utilisées pour les raccourcis clavier. En ajustant la variable N pour l'aligner sur votre implémentation, cette solution permet la propagation des événements sans avoir besoin d'un transfert manuel approfondi des événements.

Voici un exemple fonctionnel :

<code class="java">import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
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.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JViewport;
import javax.swing.Timer;

public class ScrollAction extends JFrame {

    private static final int TILE = 64;
    private static final int DELTA = 16;

    public ScrollAction() {
        setupAndDisplay();
    }

    private void setupAndDisplay() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        JPanel panel = new JPanel() {
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                g.setColor(Color.lightGray);
                int w = this.getWidth() / TILE + 1;
                int h = this.getHeight() / TILE + 1;
                for (int row = 0; row < h; row++) {
                    for (int col = 0; col < w; col++) {
                        if ((row + col) % 2 == 0) {
                            g.fillRect(col * TILE, row * TILE, TILE, TILE);
                        }
                    }
                }
            }
        };
        panel.setOpaque(false);
        panel.setFocusable(true);
        panel.setPreferredSize(new Dimension(50 * TILE, 50 * TILE));

        final JScrollPane scrollPane = new JScrollPane(panel);
        final JViewport viewport = scrollPane.getViewport();
        viewport.addMouseMotionListener(new MouseAdapter() {
            @Override
            public void mouseMoved(MouseEvent e) {
                handleMouseMovement(scrollPane, e);
            }
        });
        
        add(scrollPane);            
    }
    
    private static final class ScrollTimer implements ActionListener {

        private static int N = 10;
        private static int DELAY = 100;
        private String cmd;
        private Timer timer;
        private Action action;
        private JScrollPane scrollPane;
        private int count;

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

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

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

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

    private void handleMouseMovement(JScrollPane scrollPane, MouseEvent e) {
        final ScrollTimer left = new ScrollTimer(scrollPane, "scrollLeft");
        final ScrollTimer right = new ScrollTimer(scrollPane, "scrollRight");
        final ScrollTimer up = new ScrollTimer(scrollPane, "scrollUp");
        final ScrollTimer down = new ScrollTimer(scrollPane, "scrollDown");

        left.stop();
        if (e.getX() < DELTA) {
            left.start();
        }
        right.stop();
        if (e.getX() > viewport.getWidth() - DELTA) {
            right.start();
        }
        up.stop();
        if (e.getY() < DELTA) {
            up.start();
        }
        down.stop();
        if (e.getY() > viewport.getHeight() - DELTA) {
            down.start();
        }
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new ScrollAction().setVisible(true);
                pack();
            }
        });
    }
}</code>

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn