2009-07-31 4 views
3

Je suis en train de remapper plusieurs touches de navigation:navigation du clavier Remap avec Jython/Swing

  • ENTRER: travailler comme comportement standard TAB (mise au point de contrôle suivant)
  • SHIFT + ENTRER: travailler comme SHIFT + TAB comportement (mise au point au contrôle précédent)
  • flèches haut/bas: précédent/suivant contrôle
  • etc

J'ai essayé avec quelques options, mais sans chance:

from javax.swing import * 
from java.awt import * 

class JTextFieldX(JTextField): 

    def __init__(self, *args): 
     # Thanks, Jack!! 
     JTextField.__init__(
      self, 
      focusGained=self.onGotFocus, 
      focusLost=self.onLostFocus, 
      *args) 

    def onGotFocus (self, event): 
     print "onGotFocus " 
     self.selectionStart = 0 
     self.selectionEnd = len(self.text) 

    def onLostFocus (self, event): 
     print "onLostFocus ", self.name 


class Test(JFrame): 
    def __init__(self): 
     JFrame.__init__(self, 
         'JDesktopPane and JInternalFrame Demo', 
         size=(600, 300), 
         defaultCloseOperation=JFrame.EXIT_ON_CLOSE) 

     self.desktop = JDesktopPane() 
     self.contentPane.add(JScrollPane(self.desktop)) # This is the same as self.getContentPane().add(...) 

     frame = JInternalFrame("Frame", 1, 1, 1, 1, size=(400, 400), visible=1) 
     panel = JPanel() 

     self.label = JLabel('Hello from Jython') 
     panel.add(self.label) 

     self.textfield1 = JTextFieldX('Type something here', 15) 
     panel.add(self.textfield1) 

     self.textfield2 = JTextFieldX('and click Copy', 15) 
     panel.add(self.textfield2) 

     panel.add(copyButton) 

     frame.add(panel) 
     frame.pack() 
     self.desktop.add(frame) 

     # ENTER=SPACE remapping for buttons (works ok, but only for buttons) 
#  inputMap = UIManager.getDefaults().get("Button.focusInputMap") 
#  pressedAction = inputMap.get(KeyStroke.getKeyStroke("pressed SPACE")); 
#  releasedAction = inputMap.get(KeyStroke.getKeyStroke("released SPACE")); 
#  # pressedAction = self.noAction 
#  inputMap.put (KeyStroke.getKeyStroke("pressed ENTER"), pressedAction) 
#  inputMap.put (KeyStroke.getKeyStroke("released ENTER"), releasedAction) 

#  # Attemp to remap ENTER=TAB for TextFields (didn't work, no errors) 
#  inputMap = UIManager.getDefaults().get("TextField.focusInputMap") 
#  pressedAction = inputMap.get(KeyStroke.getKeyStroke("pressed TAB")); 
#  releasedAction = inputMap.get(KeyStroke.getKeyStroke("released TAB")); 
#  inputMap.put (KeyStroke.getKeyStroke("pressed W"), pressedAction) 
#  inputMap.put (KeyStroke.getKeyStroke("released W"), releasedAction) 

#  # Attemp to remap ENTER=TAB for all controls (didn't work, no errors) 
#  spaceMap = self.textfield1.getInputMap().get(KeyStroke.getKeyStroke(event.KeyEvent.VK_TAB, 0, True)); 
#  self.textfield1.getInputMap().put(KeyStroke.getKeyStroke(event.KeyEvent.VK_ENTER, 0, True),spaceMap); 

     frame.setSelected(1) 
     frame.moveToFront() 

    def noAction (self, event): 
     print "noAction" 
     pass 

if __name__ == '__main__': 
    test = Test() 
    test.setLocation(100, 100) 
    test.show() 
+0

voir nouvelle réponse. – Jack

+0

vous avez raté cette ligne alors: self.textfield1.setNextFocusableComponent (self.textfield2) – Jack

Répondre

1

J'ai fait un nouveau poste pour la lisibilité.

self.textfield1 = JTextField('Type something here',15,focusGained=self.myOnFocus,keyPressed=self.myOnKey) 

#create textfield2...must be created before can be referenced below. 

self.textfield1.setNextFocusableComponent(self.textfield2) 

puis dans votre gestionnaire d'événements:

def myOnKey(self,event): 
    print str(event) # see all other info you can get. 
    key_code = event.keyCode 
    if key_code == 10: 
     print "you pressed enter" 
     # simulate the "tab" just focus next textbox... 
     gotFocus = event.getComponent() 
     nextToFocus = gotFocus.nextFocusableComponent 
     nextToFocus.requestFocus() 

devrait le faire.

+0

@Jack: tout d'abord, merci pour votre aide. J'essaie le code affiché, mais soit gotFocus.nextFocusableComponent et gotFocus.getNextFocusableComponent() retour Aucun. TIA, Pablo – PabloG

+0

avez-vous définiNextFocusableComponent comme je l'ai fait dans mon premier bloc ??? – Jack

+0

... parce que le code ci-dessus fonctionne pour moi avec jython 2.5 – Jack

0

Ajouter keyPressed à l'oscillation compétent que vous souhaitez écouter la presse touche

self.textfield1 = JTextField('Type something here',15,focusGained=self.myOnFocus,keyPressed=self.myOnKey) 

myOnKey peut être quelque chose nommé dans cette méthode faire quelque chose comme:

def myOnKey(self,event): 
    print str(event) # see all other info you can get. 
    key_code = event.keyCode 
    if key_code == 10: 
     print "you pressed enter" 
     # simulate the "tab" by just focusing the next textbox... 

Ensuite, vous devez simplement être en mesure de jouer avec l'impression str (veille nt) commande pour obtenir tous les keycodes appropriés que vous voulez.

+0

Ok jusqu'ici, mais alors comment puis-je (génériquement) obtenir le prochain contrôle focalisable? J'ai essayé avec self.nextFocusableComponent mais il est défini sur None. – PabloG

1

Enfin utilisé une partie de la réponse de Jack (l'événement keyPressed) mais sans réglage manuel setNextFocusableComponent:

keyFocusMgr = KeyboardFocusManager.getCurrentKeyboardFocusManager() 
keyFocusMgr.focusNextComponent() 
+0

Cool. Content que tu l'aies. Merci d'avoir posté cela. – Jack