使用Jython/Swing重新映射键盘导航

2024-10-01 22:40:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试重新映射几个导航键:

  • 输入:工作方式类似于标准选项卡行为(聚焦到下一个控件)
  • SHIFT+ENTER:工作方式类似于SHIFT+TAB行为(聚焦到上一个控件)
  • 上/下箭头:上一个/下一个控件
  • 等等

我尝试了几个选择,但没有运气:

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

Tags: selfeventaddgetputinitdefframe
3条回答

我写了一篇新的文章以提高可读性。在

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)

然后在事件处理程序中:

^{pr2}$

应该这么做。在

将keypsed添加到您想要监听的swing-pressed

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

myOnKey可以命名为任何一种方法,比如:

^{pr2}$

然后,您应该能够使用print str(event)命令来获得所需的所有正确的键码。在

最后使用了杰克的部分答案(按键事件),但没有手动设置setNextFocusableComponent:

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

相关问题 更多 >

    热门问题