2011-07-14 137 views
6

我已经实现了一些快捷键与InputMap的Swing应用程序一样如何捕捉CTRL +鼠标滚轮事件与InputMap的

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

它的正常工作。现在,我该怎么做同样的事情,如果我想赶上

CTRL + MouseWheelUp

我已经尝试了一些组合,如

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

没有运气

谢谢

回答

6

对此,您无法使用InputMap/ActionMap。您需要使用MouseWheelListener。侦听器可以从ActionMap中访问自定义Action。下面是一个使用“控制1”击键一个简单的例子:

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

感谢为+1 – mKorbel

0

尝试InputEvent.CTRL_DOWN_MASK而不是Event.CTRL _面具。根据JavaDoc:“建议使用CTRL_DOWN_MASK来代替。”

+0

我试了一下,同样的事情 – outellou

1

在我的情况,我想听听JPanel所以很容易使用MouseWheelListener

这里是我的代码:

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

感谢

+0

谢谢,这是这里最好的答案。 –