简体   繁体   English

"java - 如何检测用户正在使用触控板而不是Java swing中的鼠标?"

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

I hava a Java swing application that use a 'pan-able' JComponent to display large data.我有一个 Java swing 应用程序,它使用“可平移”JComponent 来显示大数据。 When the user move the mouse wheel, I listen to these events, and update the content of the JComponent from the scrolled amount.当用户移动鼠标滚轮时,我会监听这些事件,并根据滚动量更新 JComponent 的内容。

I would like to have a different behavior depending on whether the user is我想根据用户是否有不同的行为

  • using a classical mouse使用经典鼠标<\/li>
  • using a touchpad, as the ones that can be found on modern Mac laptops.使用触摸板,就像在现代 Mac 笔记本电脑上可以找到的那样。<\/li><\/ul>

    How could I detect that the user is using the mouse wheel vs the trackpad to generate the scroll event?我如何检测到用户正在使用鼠标滚轮与触控板来生成滚动事件? I am relying in java 1.6 swing, si I cannot go to javaFX.我依赖于 java 1.6 swing,我不能去 javaFX。

    Story behind the question: I just wanted to add a cool inertia feel to the scrolling event when the user use the mouse wheel.问题背后的故事:我只是想在用户使用鼠标滚轮时为滚动事件添加一种很酷的惯性感觉。 But of course, on MacOSX, the trackpad has its own inertia stuff builtin.但当然,在 MacOSX 上,触控板内置了自己的惯性功能。 So I wanted to decide whether I should generate the inertial movement or not.所以我想决定是否应该产生惯性运动。

    "

Java Swing is an old technology, it supports the traditional mouse wheel rotation events. Java Swing是一项老技术,它支持传统的鼠标滚轮旋转事件。

When you use the old wheel mouse, or wheel track-pad, it will read the rotation of the hardware wheel. 当您使用旧的滚轮鼠标或滚轮轨迹板时,它将读取硬件滚轮的旋转。

When you use a modern laser mouse, the mouse movement will be translated to rotation motion. 当您使用现代激光鼠标时,鼠标移动将转换为旋转运动。

When you use a touch track-pad like the one in modern Mac laptops, the scroll gesture will be translated into rotation motion, single & double touch as left and right click (based on OS mouse-pad configuration). 当你使用像现代Mac笔记本电脑那样的触控式跑道时,滚动手势将被转换为旋转动作,单击和双击如左右键(基于OS鼠标垫配置)。

You can use libraries to check the input devices in detail, in case your mouse or track-pad is connected to your computer through USB, you can try J-USB library . 您可以使用库来详细检查输入设备,如果您的鼠标或触控板通过USB连接到您的计算机,您可以尝试J-USB库

As for internal hardware, you first have to identify the type of OS, and based on that you can get information on system and hardware in Java . 至于内部硬件,首先必须确定操作系统的类型,并在此基础上获取有关Java系统和硬件的信息

Finally, if your application interacts with a user, I suggest asking the user what type of mouse they're using, and store that in configuration file or something. 最后,如果您的应用程序与用户交互,我建议询问用户他们使用的鼠标类型,并将其存储在配置文件中。

Try this code 试试这个代码

  1. MetaDown is used for Right Click MetaDown用于右键单击

  2. AltDown is used for Mouse wheel 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);
        }
    }   
}

Also try this: 也试试这个:

you can determine which of the Mouse buttons is pressed,by these three methods from SwingUtilities: 您可以通过SwingUtilities中的这三种方法确定按下哪个鼠标按钮:

isLeftMouseButton isLeftMouseButton

isMiddleMouseButton isMiddleMouseButton

isRightMouseButton isRightMouseButton

The Mouse Wheel Listener API 鼠标滚轮监听器API

Although MouseWheelListener has only one method, it has the corresponding adapter class — MouseAdapter . 虽然MouseWheelListener只有一个方法,但它有相应的适配器类 - 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: 对于使用鼠标滚轮的单位增量的系统,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

For MacOS you can get all the touchpad events in Java, I'd been searching myself for a while and just answered my own question.对于 MacOS,您可以在 Java 中获取所有触摸板事件,我已经搜索了一段时间,只是回答了我自己的问题。 Leaving this here in case anyone else starts down the same rabbit hole把这个留在这里,以防其他人从同一个兔子洞开始

What replaces GestureUtilities in Java 9<\/a> 什么取代了 Java 9 中的 GestureUtilities<\/a>

"

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM