2015-06-03 29 views
19

Mam na przykład aplikację Java swing, która wykorzystuje JComponent typu "pan-able" do wyświetlania dużych danych. Kiedy użytkownik porusza kółkiem myszy, słucham tych zdarzeń i aktualizuję zawartość JComponentu z przewijanej ilości.Jak wykrywać użytkownika za pomocą gładzika, a nie myszy w Java swing?

chciałbym mieć różne zachowania w zależności od tego, czy użytkownik jest

  • stosując klasyczną myszkę
  • za pomocą touchpada, jak te, które można znaleźć na nowoczesnych laptopów Mac.

W jaki sposób mogę wykryć, że użytkownik używa koła myszy względem gładzika do generowania zdarzenia przewijania? Jestem powołując się na java 1.6 swing, si nie mogę przejść do javaFX.

Historia za pytaniem: Po prostu chciałem dodać wrażenie "bezwładności" do zdarzenia przewijania, gdy użytkownik korzysta z kółka myszy. Ale oczywiście na MacOSX trackpad ma wbudowaną własną inercję. Chciałem więc zdecydować, czy powinienem wygenerować ruch inercyjny, czy nie.

Odpowiedz

5

Java Swing to stara technologia, obsługuje tradycyjne obracanie kółka myszy.

Podczas używania starej myszy na kółkach lub podkładki koła odczytuje obrót koła ze sprzętem.

Podczas korzystania z nowoczesnej myszy laserowej ruch myszy zostanie przeniesiony na ruch obrotowy.

Podczas korzystania z dotykowego panelu śledzenia podobnego do tego w nowoczesnych laptopach Mac, gest przewijania zostanie przetłumaczony na ruch obrotowy, pojedynczy & podwójne dotknięcie jako lewe i prawe kliknięcie (w oparciu o konfigurację myszki na OS).

Możesz użyć bibliotek do szczegółowego sprawdzenia urządzeń wejściowych, na wypadek gdyby mysz lub trackpad był podłączony do komputera przez USB, możesz spróbować J-USB library.

Jeśli chodzi o wewnętrzny sprzęt, najpierw trzeba określić typ systemu operacyjnego i na tej podstawie można uzyskać information on system and hardware in Java.

Wreszcie, jeśli twoja aplikacja wchodzi w interakcję z użytkownikiem, proponuję zapytać użytkownika, jakiego rodzaju myszy używają i zapisać w pliku konfiguracyjnym lub coś takiego.

+1

OK, tego się obawiałem. Jasne, mówisz mi, że nie ma sposobu, by wiedzieć z Swingiem, prawda? –

+0

@ Jean-Yves tak, Swing nie może ci powiedzieć tej informacji –

+1

@ Jean-Yves Wiem, że minęło trochę czasu, ale dodałem do odpowiedzi klauzulę ** Finally **. –

0

Spróbuj kod

  1. MetaDown służy do Right Click

  2. AltDown służy do kółka myszki

.

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

spróbować również:

można ustalić, który z przycisków myszy jest wciśnięty, przez tych trzech metod z SwingUtilities:

isLeftMouseButton

isMiddleMouseButton

isRightMouseButton

+0

Więcej informacji: http://docs.oracle.com/javase/6/docs/api/javax/swing/SwingUtilities.html#isMiddleMouseButton%28java.awt.event.MouseEvent%29 – Programmer

+0

Dzięki! Ale faktycznie byłem zainteresowany poznaniem, czy zdarzenia kółka myszy są generowane przez gładzik, czy przez rzeczywistą mysz. –

0

Mysz Koło Listener API

Chociaż MouseWheelListener ma tylko jedną metodę, ma odpowiedniej klasy adaptera - MouseAdapter. Ta możliwość umożliwia aplikacji tylko jedno wystąpienie klasy adaptera dla komponentu do zarządzania wszystkimi typami zdarzeń za pomocą wskaźnika myszy.

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

Poniższy fragment kodu jest związany z obsługą zdarzeń myszy koła:

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

Wyjście z MouseWheelEventDemo na system, który wykorzystuje przyrosty jednostkowe za kółkiem myszy może wyglądać następująco:

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 
+0

Pełne wyjaśnienie - https://docs.oracle.com/javase/tutorial/uiswing/events/mousewheellistener.html –

+0

Dzięki! Ale także to nie jest pytanie. Chciałem tylko wiedzieć, czy istnieje sposób sprawdzenia, czy zdarzenia te są uruchamiane przez mysz lub touchpad. –