2016-04-29 32 views
1

I ctrl + Verschiebung + Numpad 7 auf eine Aktion Karte zuordnen möchten. Im Grunde versuche ich, meine Aktionen an Tastaturkürzel zu binden und möchte das gleiche Verhalten wie die von oben gedrückten Zifferntasten oder die von den richtigen Tastaturnummern gedrückten Zifferntasten.Wie Strg + Shift + Numpad Tasten zur Unterstützung mit java.awt

Ich bin in der Lage

im.put(KeyStroke.getKeyStroke(KeyEvent.VK_A, KeyEvent.CTRL_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK), "Ctrl+4"); 

zur Karte aber

im.put(KeyStroke.getKeyStroke(KeyEvent.VK_NUMPAD2, KeyEvent.CTRL_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK), "Ctrl+4"); 

hier nicht abbilden kann, ist der Code, den ich auszuführen versuche:

package testmaik; 

import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.GridBagLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.KeyEvent; 
import javax.swing.AbstractAction; 
import javax.swing.ActionMap; 
import javax.swing.InputMap; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.KeyStroke; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class KeyBindingsTest { 

public static void main(String[] args) { 
    new KeyBindingsTest(); 
} 

public KeyBindingsTest() { 
    EventQueue.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      try { 
       UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
      } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       ex.printStackTrace(); 
      } 

      JFrame frame = new JFrame("Testing"); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.add(new TestPane()); 
      frame.pack(); 
      frame.setLocationRelativeTo(null); 
      frame.setVisible(true); 
     } 
    }); 
} 

public class TestPane extends JPanel { 

    private JLabel state; 

    /** 
    * 
    */ 
    public TestPane() { 
     setLayout(new GridBagLayout()); 
     state = new JLabel("Nothing here"); 
     add(state); 

     InputMap im = getInputMap(WHEN_IN_FOCUSED_WINDOW); 
     im.put(KeyStroke.getKeyStroke(KeyEvent.VK_1, KeyEvent.CTRL_DOWN_MASK), "Ctrl+1"); 
     im.put(KeyStroke.getKeyStroke(KeyEvent.VK_2, KeyEvent.CTRL_DOWN_MASK), "Ctrl+2"); 
     im.put(KeyStroke.getKeyStroke(KeyEvent.VK_NUMPAD1, KeyEvent.CTRL_DOWN_MASK), "Ctrl+1"); 
     im.put(KeyStroke.getKeyStroke(KeyEvent.VK_NUMPAD2, KeyEvent.CTRL_DOWN_MASK), "Ctrl+2"); 
     im.put(KeyStroke.getKeyStroke("ctrl 7"), "ctrl+7"); 
     im.put(KeyStroke.getKeyStroke("ctrl shift 7"), "Ctrl+3"); 
     im.put(KeyStroke.getKeyStroke(KeyEvent.VK_NUMPAD2, KeyEvent.CTRL_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK), "Ctrl+4"); 

     ActionMap am = getActionMap(); 
     am.put("Ctrl+1", new MessageAction("Ctrl+1")); 
     am.put("Ctrl+2", new MessageAction("Ctrl+2")); 
     am.put("Ctrl+3", new MessageAction("Ctrl+3")); 
     am.put("ctrl+7", new MessageAction("ctrl+7")); 
     am.put("Ctrl+4", new MessageAction("Ctrl+4")); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(200, 200); 
    } 

    public class MessageAction extends AbstractAction { 

     private String message; 

     public MessageAction(String message) { 
      this.message = message; 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      state.setText(message); 
     } 

    } 

} 

} 

Bitte helfen.

+0

Ich habe anscheinend keine Probleme, wenn ich 'KeyEvent.VK_1' registriere, antwortet der Nummernblock 1 auch. Welche OS- und Java-Version verwenden Sie? – MadProgrammer

+0

Ich verwende Windows 7 und Java 7. VK_1 und VK_NUMPAD1 haben beide unterschiedliche Ereigniscodes. Es kann nicht automatisch ohne Code-Entwicklung registriert werden. Bitte teilen Sie es wenn es so ist. – Bhavin

+0

Ich fand auch, dass Verschiebung und Nummernblock nicht zusammen arbeiten. Wenn shift mit Numpad-Tasten verwendet wird, wird es so gelesen, als würden die Pfeiltasten gedrückt. Wenn wir die Shift-Taste wie Pfeil-Bewegungstasten deaktivieren, können wir die Verschiebung mit anderen Tasten verknüpfen, als ich die Zuordnung von Strg Alt und Numpad7 überprüft habe – Bhavin

Antwort

1

Eine alternative Lösung: Versuchen Sie, diese im Ihre TestPane Klasse und Sie können das Ereignis fangen sich:

getRootPane().getContentPane().getToolkit().addAWTEventListener(new AWTEventListener() { 

     public void eventDispatched(final AWTEvent event) { 
      if (event.getID() == KeyEvent.KEY_PRESSED) { 
       final KeyEvent keyEvent = (KeyEvent) event; 
       switch (keyEvent.getKeyCode()) { 
        case KeyEvent.VK_NUMPAD7: 
         if(keyEvent.isControlDown() && keyEvent.isShiftDown()) { 
          //do Stuff 
         } 
         break; 
       } 
      } 
     } 

    }, AWTEvent.KEY_EVENT_MASK); 

Ich bin nicht sicher, was mit Ihrer Event Karte falsch ist.

+0

Ich habe versucht, die Lösung mit der INPUT MAP und ACTION MAP zu finden. Wir können das wahrscheinlich verwenden, aber wenn wir nur Eingabekarten und Aktionskarten haben, wie sollen wir das umsetzen? – Bhavin

+0

Entschuldigung, ich habe vorher noch nie mit diesen Karten gearbeitet und der Code sieht gut aus und scheint zu den Dokumenten zu passen: - \ – huellif