Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

Ответ 2

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

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

  • 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

Ответ 3

API-интерфейс прослушивателя мыши

Хотя 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 use of bold fonts */
        UIManager.put("swing.boldMetal", Boolean.FALSE);

        //Schedule a job for the event dispatch thread:
        //creating and showing this application 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