2009-07-31 4 views
3

ich mehrere Navigationstasten neu zuordnen bin versucht:Neuzuordnung Tastatur-Navigation mit Jython/Swing

  • ENTER: wie Standard-TAB-Verhalten (Fokus zur nächsten Kontrolle)
  • SHIFT arbeiten + ENTER: arbeiten SHIFT + TAB-Verhalten (Fokus zur vorherige Kontrolle)
  • UP/DOWN Pfeile: vorherige/nächste Steuer
  • etc

ich habe versucht, mit einem paar aber Optionen ohne Glück:

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

sehen neue Antwort. – Jack

+0

Sie haben diese Zeile dann verpasst: self.textfield1.setNextFocusableComponent (self.textfield2) – Jack

Antwort

1

Ich habe einen neuen Beitrag zur Lesbarkeit gemacht.

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) 

dann in Ihren Event-Handler:

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() 

sollte es tun.

+0

@Jack: Zunächst einmal, vielen Dank für Ihre Hilfe. Ich versuche, den Code, den Sie geschrieben, aber entweder gotFocus.nextFocusableComponent und gotFocus.getNextFocusableComponent() return Keine. TIA, Pablo – PabloG

+0

hast du NextFocusableComponent wie ich in meinem ersten Block ?? – Jack

+0

... weil der obige Code für mich mit jython 2.5 funktioniert – Jack

0

In der Schaukel zuständigen KeyPressed, dass Sie für den Tastendruck hören möchten auf

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

myOnKey kann alles in diesem Verfahren genannt werden so etwas wie:

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... 

Dann sollten Sie nur in der Lage sein, mit dem Druck str zu spielen, um (eve nt) Befehl, um alle gewünschten Tastencodes zu erhalten.

+0

Ok bis jetzt, aber wie kann ich (generisch) das nächste fokussierbare Steuerelement bekommen? Ich versuchte mit self.nextFocusableComponent, aber es ist auf keine gesetzt. – PabloG

1

verwendet Schließlich Teil Antwort von Jacks (das keyPressed Ereignis), aber ohne manuelle Einstellung setNextFocusableComponent:

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

Cool. Ich bin froh, dass du es verstanden hast. Danke für das Posten. – Jack

Verwandte Themen