Comment détecter l'utilisateur utilise le Trackpad et non la souris dans Java swing?

j'ai une application Java swing qui utilise un JComponent 'pan-able' pour afficher de grandes données. Lorsque l'utilisateur déplace la molette de la souris, j'écoute ces événements, et je mets à jour le contenu du JComponent à partir de la quantité déroulée.

je voudrais avoir un comportement différent selon que l'utilisateur est

  • utilisant une souris classique
  • en utilisant un touchpad, comme ceux qui peuvent être trouvés sur les ordinateurs portables Mac modernes.

Comment pourrais-je détecter que l'utilisateur utilise la roue de la souris vs le trackpad pour générer l'événement de défilement? Je me fie à java 1.6 swing, si je ne peux pas aller à javaFX.

Histoire derrière la question: Je voulais juste ajouter une sensation d'inertie fraîche à l'événement de défilement lorsque l'utilisateur utilise la roue de la souris. Mais bien sûr, sur MacOSX, le trackpad a son propre système d'inertie. Je voulais donc décider si je devais générer le mouvement inertiel ou non.

19
demandé sur Jean-Yves 2015-06-03 11:07:09

3 réponses

Java Swing est une ancienne technologie, elle prend en charge les évènements traditionnels de rotation des roues de souris.

lorsque vous utilisez l'ancienne souris de roue, ou tapis de piste de roue, il lira la rotation de la roue de quincaillerie.

lorsque vous utilisez une souris laser moderne, le mouvement de la souris sera traduit en mouvement de rotation.

lorsque vous utilisez un pavé tactile comme celui des ordinateurs portables Mac modernes, le geste du rouleau sera traduit en mouvement de rotation, simple et double touche comme clic gauche et droit (basé sur la configuration de la souris OS-pad).

vous pouvez utiliser les bibliothèques pour vérifier les périphériques d'entrée en détail, dans le cas où votre souris ou piste-pad est connecté à votre ordinateur par USB, vous pouvez essayer j-USB library.

en ce qui concerne le matériel interne, vous devez d'abord identifier le type D'OS, et basé sur ce que vous pouvez obtenir informations sur le système et le matériel en Java.

Enfin, si votre application interagit avec un utilisateur, je suggère de demander à l'utilisateur quel type de souris ils utilisent, et de stocker cela dans le fichier de configuration ou quelque chose.

5
répondu Khaled.K 2017-05-23 12:10:44

essayez ce code

  1. MetaDown est utilisé pour le clic droit

  2. AltDown est utilisé pour la roue de la souris

.

public class Exp extends JFrame {

    private String string;
    private JLabel l;

    public Exp() {
        super("Title");    
        l = new JLabel("Status");
        add(l, BorderLayout.SOUTH);
        addMouseListener(new MouseClass());         
    }

    private class MouseClass extends MouseAdapter {
        public void mouseClicked(MouseEvent e) {                
            string = String.format("Clicked %d Times", e.getClickCount());              
            if(e.isMetaDown())
                string += " With Right Mouse Button";
            else if(e.isAltDown())
                string += " With Centre Mouse Button";
            else
                string += " With Left Mouse Button";                
            l.setText(string);
        }
    }   
}

essayez aussi ceci:

vous pouvez déterminer lequel des boutons de la Souris est pressé,par ces trois méthodes de SwingUtilities:

isLeftMouseButton

isMiddleMouseButton

isRightMouseButton

0
répondu Programmer 2015-06-03 10:57:37

L'API D'écoute des roues de souris

bien que MouseWheelListener n'a qu'une méthode, il a la classe d'adaptateur correspondante - MouseAdapter. Cette capacité permet à une application de n'avoir qu'une seule instance de classe adaptateur pour le composant pour gérer tous les types d'événements à partir du pointeur de la souris.

mouseWheelMoved(MouseWheelEvent)    //Called when the mouse wheel is rotated.

L'extrait de code suivant est liée à la molette de la souris avec la gestion des événements:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;

import javax.swing.*;

public class MouseWheelEventDemo extends JPanel
        implements MouseWheelListener {
    JTextArea textArea;
    JScrollPane scrollPane;
    static final String NEWLINE = System.getProperty("line.separator");

    public static void main(String[] args) {
        /* Use an appropriate Look and Feel */
        try {
            //UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
            //UIManager.setLookAndFeel("com.sun.java.swing.plaf.gtk.GTKLookAndFeel");
            UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
        } catch (UnsupportedLookAndFeelException ex) {
            ex.printStackTrace();
        } catch (IllegalAccessException ex) {
            ex.printStackTrace();
        } catch (InstantiationException ex) {
            ex.printStackTrace();
        } catch (ClassNotFoundException ex) {
            ex.printStackTrace();
        }
        /* Turn off metal's use of bold fonts */
        UIManager.put("swing.boldMetal", Boolean.FALSE);

        //Schedule a job for the event dispatch thread:
        //creating and showing this application's GUI.
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }

    /**
     * Create the GUI and show it.  For thread safety,
     * this method should be invoked from the
     * event dispatch thread.
     */
    private static void createAndShowGUI() {
        //Create and set up the window.
        JFrame frame = new JFrame("MouseWheelEventDemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //Create and set up the content pane.
        JComponent newContentPane = new MouseWheelEventDemo();
        newContentPane.setOpaque(true); //content panes must be opaque
        frame.setContentPane(newContentPane);

        //Display the window.
        frame.pack();
        frame.setVisible(true);
    }

    public MouseWheelEventDemo() {
        super(new BorderLayout());

        textArea = new JTextArea();
        textArea.setEditable(false);
        scrollPane = new JScrollPane(textArea);
        scrollPane.setVerticalScrollBarPolicy(
                JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        scrollPane.setPreferredSize(new Dimension(400, 250));
        add(scrollPane, BorderLayout.CENTER);
        textArea.append("This text area displays information "
                + "about its mouse wheel events."
                + NEWLINE);

        //Register for mouse-wheel events on the text area.
        textArea.addMouseWheelListener(this);

        setPreferredSize(new Dimension(450, 350));
        setBorder(BorderFactory.createEmptyBorder(20,20,20,20));
    }

    //Append to the text area and make sure the new text is visible.
    void eventOutput(String eventDescription, MouseWheelEvent e) {
        textArea.append(e.getComponent().getClass().getName()
        + ": "
                + eventDescription);
        textArea.setCaretPosition(textArea.getDocument().getLength());
    }

    public void mouseWheelMoved(MouseWheelEvent e) {
        String message;
        int notches = e.getWheelRotation();
        if (notches < 0) {
            message = "Mouse wheel moved UP "
                    + -notches + " notch(es)" + NEWLINE;
        } else {
            message = "Mouse wheel moved DOWN "         
                    + notches + " notch(es)" + NEWLINE;
        }
        if (e.getScrollType() == MouseWheelEvent.WHEEL_UNIT_SCROLL) {
            message += "    Scroll type: WHEEL_UNIT_SCROLL" + NEWLINE;
            message += "    Scroll amount: " + e.getScrollAmount()
            + " unit increments per notch" + NEWLINE;
            message += "    Units to scroll: " + e.getUnitsToScroll()
            + " unit increments" + NEWLINE;
            message += "    Vertical unit increment: "
                    + scrollPane.getVerticalScrollBar().getUnitIncrement(1)
                    + " pixels" + NEWLINE;
        } else { //scroll type == MouseWheelEvent.WHEEL_BLOCK_SCROLL
            message += "    Scroll type: WHEEL_BLOCK_SCROLL" + NEWLINE;
            message += "    Vertical block increment: "
                    + scrollPane.getVerticalScrollBar().getBlockIncrement(1)
                    + " pixels" + NEWLINE;
        }
        eventOutput(message, e);
    }
}

la sortie de MouseWheelEventDemo pour un système qui utilise des incréments d'unité pour sa roue de souris pourrait ressembler à ce qui suit:

javax.swing.JTextArea: Mouse wheel moved UP 1 notch(es)
    Scroll type: WHEEL_UNIT_SCROLL
    Scroll amount: 3 unit increments per notch
    Units to scroll: -3 unit increments
    Vertical unit increment: 16 pixels
0
répondu Saket Mittal 2015-06-13 12:14:27