问题
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 content of the JComponent from the scrolled amount.
I would like to have a different behavior depending on whether the user is
- using a classical mouse
- using a touchpad, as the ones that can be found on modern Mac laptops.
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.
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. So I wanted to decide whether I should generate the inertial movement or not.
回答1:
Java Swing is an old technology, it supports the traditional mouse wheel rotation events.
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).
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.
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.
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.
回答2:
Try this code
MetaDown is used for Right Click
AltDown is used for Mouse wheel
.
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:
isLeftMouseButton
isMiddleMouseButton
isRightMouseButton
回答3:
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
来源:https://stackoverflow.com/questions/30614291/how-to-detect-the-user-is-using-the-trackpad-and-not-the-mouse-in-java-swing