How to detect the user is using the Trackpad and not the mouse in Java swing?

后端 未结 3 943
清歌不尽
清歌不尽 2021-01-04 00:37

I hava a Java swing application that use a \'pan-able\' JComponent to display large data. When the user move the mouse wheel, I listen to these events, and update the conten

3条回答
  •  失恋的感觉
    2021-01-04 01:15

    The Mouse Wheel Listener API

    Although MouseWheelListener has only one method, it has the corresponding adapter class — MouseAdapter. This capability enables an application to have only one adapter class instance for the component to manage all types of events from the mouse pointer.

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

    The following code snippet is related to the mouse-wheel event handling:

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

    The output from MouseWheelEventDemo for a system that uses unit increments for its mouse wheel might look as follows:

    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
    

提交回复
热议问题