2011-07-14 16 views
6

I zostały wdrożone niektóre skróty klawiszowe dla aplikacji Swing z InputMap jakJak złapać zdarzenie CTRL + mouseWheel z InputMap

getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_A, Event.CTRL_MASK), "selectAll"); 
getActionMap().put("selectAll", new SelectAllAction()); 

to działa dobrze. Teraz, w jaki sposób mogę zrobić to samo, jeśli chcę złapać

CTRL + MouseWheelUp

Próbowałem kilka kombinacji takich jak

getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(MouseEvent.MOUSE_WHEEL, Event.CTRL_MASK), "zoom"); 

bez powodzenia

Dzięki

Odpowiedz

6

Do tego nie można użyć mapy wejściowej/akcji. Musisz użyć MouseWheelListener. Odbiornik może następnie uzyskać dostęp do niestandardowej akcji z ActionMapy. Oto prosty przykład, który korzysta z „Control 1” za naciśnięciem klawisza:

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class MouseWheelTest extends JPanel implements MouseWheelListener { 
    private final static String SOME_ACTION = "control 1"; 

    public MouseWheelTest() { 
     super(new BorderLayout()); 

     JTextArea textArea = new JTextArea(10, 40); 
     JScrollPane scrollPane = new JScrollPane(textArea); 
     add(scrollPane, BorderLayout.CENTER); 
     textArea.addMouseWheelListener(this); 

     Action someAction = new AbstractAction() { 
      public void actionPerformed(ActionEvent e) { 
       System.out.println("do some action"); 
      } 
     }; 

     // Control A is used by a text area so try a different key 
     textArea.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW) 
      .put(KeyStroke.getKeyStroke(SOME_ACTION), SOME_ACTION); 
     textArea.getActionMap().put(SOME_ACTION, someAction); 
    } 

    public void mouseWheelMoved(MouseWheelEvent e) { 
     if (e.isControlDown()) { 
      if (e.getWheelRotation() < 0) { 
       JComponent component = (JComponent)e.getComponent(); 
       Action action = component.getActionMap().get(SOME_ACTION); 
       if (action != null) 
        action.actionPerformed(null); 
      } else { 
       System.out.println("scrolled down"); 
      } 
     } 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       createAndShowGUI(); 
      } 
     }); 
    } 

    private static void createAndShowGUI() { 
     JFrame frame = new JFrame("MouseWheelTest"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new MouseWheelTest()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 
+0

Dzięki za to +1 – mKorbel

0

Wypróbuj InputEvent.CTRL_DOWN_MASK zamiast Event.CTRL _MASKA. Zgodnie z JavaDoc: "Zaleca się użycie CTRL_DOWN_MASK."

+0

próbowałem go, samo – outellou

1

W moim przypadku, chcę słuchać JPanel tak łatwo było użyć MouseWheelListener.

Oto mój kod:

@Override 
public void mouseWheelMoved(MouseWheelEvent e) {  
    if (e.isControlDown()) { 
     if (e.getWheelRotation() < 0) {    
      System.out.println("Zoom-in when scrolling up"); 
     } else { 
      System.out.println("Zoom-out when scrolling down");    
     } 
    }  
} 

Dzięki

+0

Dzięki, jest to najlepsza odpowiedź tutaj. –

Powiązane problemy