Comment détecter l'utilisateur utilise le Trackpad et non la souris dans Java swing?
j'ai une application Java swing qui utilise un JComponent 'pan-able' pour afficher de grandes données. Lorsque l'utilisateur déplace la molette de la souris, j'écoute ces événements, et je mets à jour le contenu du JComponent à partir de la quantité déroulée.
je voudrais avoir un comportement différent selon que l'utilisateur est
- utilisant une souris classique
- en utilisant un touchpad, comme ceux qui peuvent être trouvés sur les ordinateurs portables Mac modernes.
Comment pourrais-je détecter que l'utilisateur utilise la roue de la souris vs le trackpad pour générer l'événement de défilement? Je me fie à java 1.6 swing, si je ne peux pas aller à javaFX.
Histoire derrière la question: Je voulais juste ajouter une sensation d'inertie fraîche à l'événement de défilement lorsque l'utilisateur utilise la roue de la souris. Mais bien sûr, sur MacOSX, le trackpad a son propre système d'inertie. Je voulais donc décider si je devais générer le mouvement inertiel ou non.
3 réponses
Java Swing est une ancienne technologie, elle prend en charge les évènements traditionnels de rotation des roues de souris.
lorsque vous utilisez l'ancienne souris de roue, ou tapis de piste de roue, il lira la rotation de la roue de quincaillerie.
lorsque vous utilisez une souris laser moderne, le mouvement de la souris sera traduit en mouvement de rotation.
lorsque vous utilisez un pavé tactile comme celui des ordinateurs portables Mac modernes, le geste du rouleau sera traduit en mouvement de rotation, simple et double touche comme clic gauche et droit (basé sur la configuration de la souris OS-pad).
vous pouvez utiliser les bibliothèques pour vérifier les périphériques d'entrée en détail, dans le cas où votre souris ou piste-pad est connecté à votre ordinateur par USB, vous pouvez essayer j-USB library.
en ce qui concerne le matériel interne, vous devez d'abord identifier le type D'OS, et basé sur ce que vous pouvez obtenir informations sur le système et le matériel en Java.
Enfin, si votre application interagit avec un utilisateur, je suggère de demander à l'utilisateur quel type de souris ils utilisent, et de stocker cela dans le fichier de configuration ou quelque chose.
essayez ce code
MetaDown est utilisé pour le clic droit
AltDown est utilisé pour la roue de la souris
.
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);
}
}
}
essayez aussi ceci:
vous pouvez déterminer lequel des boutons de la Souris est pressé,par ces trois méthodes de SwingUtilities:
isLeftMouseButton
isMiddleMouseButton
isRightMouseButton
L'API D'écoute des roues de souris
bien que MouseWheelListener
n'a qu'une méthode, il a la classe d'adaptateur correspondante - MouseAdapter
. Cette capacité permet à une application de n'avoir qu'une seule instance de classe adaptateur pour le composant pour gérer tous les types d'événements à partir du pointeur de la souris.
mouseWheelMoved(MouseWheelEvent) //Called when the mouse wheel is rotated.
L'extrait de code suivant est liée à la molette de la souris avec la gestion des événements:
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);
}
}
la sortie de MouseWheelEventDemo pour un système qui utilise des incréments d'unité pour sa roue de souris pourrait ressembler à ce qui suit:
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