2017-05-21 2 views
0

Ich entwickle eine Desktop-Anwendung in Netbeans, in der ich eine Editor-Klasse habe, die eine Unterklasse einer Klasse ist, die eine JScrollPane hat. (JScrollPane hat zwei JScrollBars: horizontal & vertikal.) Alles funktioniert wie erwartet einschließlich Scrollen mit dem Mausrad sowohl vertikal (keine Modifikatoren) und horizontal (mit dem Shift Modifier). Eine andere Superklasse (zwischen meiner Klasse und der Klasse JScrollPane) implementiert das Zoomen (was gut funktioniert (einschließlich Scrollen), indem ich meinen Vergrößerungsfaktor über Menübefehle einstellt). Was ich will, ist in der Lage zu vergrößern/verkleinern mit dem Mausrad, wenn die alt (Option) Taste gedrückt ist (isAltDown() ist wahr) und Fallback auf die Standard-Scroll (H & V) Verhalten sonst. Hier ist ein Teil meiner Klasse Setup-Code:Java - Scrollen und zoomen mit dem Mausrad?

  JScrollPane scrollPane = getPanelScrollPane(); 
      JScrollBar hsb = scrollPane.getHorizontalScrollBar(); 
      JScrollBar vsb = scrollPane.getVerticalScrollBar(); 

      MouseWheelListener mwl = new MouseWheelListener() { 
       @Override 
       public void mouseWheelMoved(MouseWheelEvent e) { 
        if (e.isAltDown()) { 
         double oldZoom = getZoom(); 
         double amount = Math.pow(1.1, e.getScrollAmount()); 
         if (e.getWheelRotation() > 0) { 
          //zoom in (amount) 
          setZoom(oldZoom * amount); 
         } else { 
          //zoom out (amount) 
          setZoom(oldZoom/amount); 
         } 
        } else { 
         // pass the event on to the scroll pane 
         getParent().dispatchEvent(e); 
        } 
       } 
      }; 

      // add mouse-wheel support 
      hsb.addMouseWheelListener(mwl); 
      vsb.addMouseWheelListener(mwl); 

Dieses Setup-Code wird immer genannt, aber die mouseWheelMoved Methode nie aufgerufen wird, wenn ich das Mausrad bewegen (wenn der Cursor über meine Ansicht ist); Die Ansicht scrollt normalerweise weiter (H & V).

Ich habe auch versucht, „implements MouseWheelListener“ und eine mouseWheelMoved Methode zu meiner Klasse hinzufügen:

@Override 
public void mouseWheelMoved(MouseWheelEvent e) { 
    // (same as mouseWheelMoved above) 
} 

noch kein Glück ... Was bin ich? (Bearbeiten: Bonus Fragen über propagierende Rad Ereignisse entfernt: beantwortet hier: < How to implement MouseWheelListener for JPanel without breaking its default implementation?>).

Antwort

0

es heraus ... Der Code Setup sollte sein: In meiner Klasse

// add mouse-wheel support 
    JScrollPane scrollPane = getPanelScrollPane(); 
    scrollPane.addMouseWheelListener(this); 

Dann fügen Sie implements MouseWheelListener und diese mouseWheelMoved Methode:

@Override 
    public void mouseWheelMoved(MouseWheelEvent e) { 
     if (e.isAltDown()) { 
      double oldZoom = getZoom(); 
      double amount = Math.pow(1.1, e.getScrollAmount()); 
      if (e.getWheelRotation() > 0) { 
       //zoom in (amount) 
       setZoom(oldZoom * amount); 
      } else { 
       //zoom out (amount) 
       setZoom(oldZoom/amount); 
      } 
     } else { 
      // if alt isn't down then propagate event to scrollPane 
      JScrollPane scrollPane = getPanelScrollPane(); 
      scrollPane.getParent().dispatchEvent(e); 
     } 
    } 

Jetzt ist alles funktioniert! Mit Alt (Option) nach unten zoomt das Mausrad hinein/heraus und damit nicht nach unten scrollt das Panel!

Verwandte Themen