Как определить, что пользователь использует трекпад, а не мышь в Java Swing?

У меня есть Java-приложение, которое использует JComponent с возможностью панорамирования для отображения больших данных. Когда пользователь перемещает колесо мыши, я прослушиваю эти события и обновляю содержимое JComponent из прокручиваемой суммы.

Я хотел бы иметь другое поведение в зависимости от того, является ли пользователь

  • используя классическую мышь
  • используя тачпад, как те, которые можно найти на современных ноутбуках Mac.

Как я могу определить, что пользователь использует колесо мыши против трекпада для генерации события прокрутки? Я полагаюсь на java 1.6 swing, так что я не могу перейти на javaFX.

История вопроса: я просто хотел добавить ощущение крутой инерции к событию прокрутки, когда пользователь использует колесо мыши. Но, конечно же, в MacOSX трекпад имеет встроенную инерцию. Поэтому я хотел решить, должен ли я генерировать инерционное движение или нет.

4 ответа

Решение

Java Swing - это старая технология, которая поддерживает традиционные события вращения колесика мыши.

Когда вы используете старую колесную мышь или колесную трекпад, она будет считывать вращение аппаратного колеса.

Когда вы используете современную лазерную мышь, движение мыши будет переведено в вращательное движение.

Когда вы используете сенсорную сенсорную панель, как в современных ноутбуках Mac, жест прокрутки преобразуется во вращательное движение, одиночное и двойное касание при щелчке левой и правой кнопкой мыши (в зависимости от конфигурации коврика для мыши ОС).

Вы можете использовать библиотеки для детальной проверки устройств ввода, если ваша мышь или трекпад подключены к вашему компьютеру через USB, вы можете попробовать библиотеку J-USB.

Что касается внутреннего оборудования, вы должны сначала определить тип ОС, и на основе этого вы можете получить информацию о системе и оборудовании в Java.

Наконец, если ваше приложение взаимодействует с пользователем, я предлагаю спросить пользователя, какой тип мыши он использует, и сохранить его в файле конфигурации или в другом месте.

Для MacOS вы можете получить все события сенсорной панели на Java, я некоторое время искал себя и только что ответил на свой вопрос. Оставьте это здесь на случай, если кто-то еще начнет лезть в ту же кроличью нору

Что заменяет GestureUtilities в Java 9

API Wheel Wheel Listener

Хотя MouseWheelListener имеет только один метод, у него есть соответствующий класс адаптера - MouseAdapter, Эта возможность позволяет приложению иметь только один экземпляр класса адаптера для компонента для управления всеми типами событий с помощью указателя мыши.

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

Следующий фрагмент кода связан с обработкой события колеса мыши:

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

Вывод MouseWheelEventDemo для системы, которая использует приращения единиц для своего колеса мыши, может выглядеть следующим образом:

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

Попробуйте этот код

  1. MetaDown используется для правого клика

  2. AltDown используется для колеса мыши

,

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

Также попробуйте это:

Вы можете определить, какая из кнопок мыши нажата, этими тремя методами из SwingUtilities:

isLeftMouseButton

isMiddleMouseButton

isRightMouseButton

Другие вопросы по тегам