gpt4 book ai didi

java - 为什么在下面的示例中,KeyBindings(而不是 KeyListeners)检测到 ActionEvents?

转载 作者:行者123 更新时间:2023-12-01 11:23:59 26 4
gpt4 key购买 nike

我从一本 Java 教科书中复制了一个程序,该程序允许用户使用箭头键在屏幕上移动文本正文。该程序只能在非 OSX 操作系统上运行(我用我的 mac 确认了这一点,并且大概它在 java 教科书作者的计算机上运行)。我找到了解决此差异的解决方案( Java KeyEvents on Mac ),它建议我使用 KeyBindings 而不是 ActionListeners 来处理事件的触发和监听,其模糊的理由是

Note: To define special reactions to particular keys, use key bindings instead of a key listener.

虽然我的代码现在可以运行,但我仍然不明白该决议的基本原理。为什么 KeyBindings 而不是 KeyListeners 检测到 Mac 箭头键命令?箭头键命令不是涉及多个键的“特殊 react ”(如 Shift + a + b)。

这是我复制的一段内容,使用 KeyListener 的代码

addKeyListener(new KeyListener()
{

@Override
public void keyReleased(KeyEvent e) {

switch (e.getKeyCode())
{
case KeyEvent.VK_DOWN:
y -= 10;
break;
case KeyEvent.VK_UP:
y += 10;
break;

//.... more code

还有一个带有 KeyBindings 的片段

 class DownAction extends AbstractAction
{

@Override
public void actionPerformed(ActionEvent e) {
y += 10;
repaint();
}
}

class UpAction extends AbstractAction
{

@Override
public void actionPerformed(ActionEvent e) {
y -= 10;
repaint();
}
}
this.getInputMap().put(KeyStroke.getKeyStroke("DOWN"),"down");
this.getActionMap().put("down", new DownAction ());
this.getInputMap().put(KeyStroke.getKeyStroke("UP"),"up");
this.getActionMap().put("up", new UpAction ());

// this segment is within a class that extends JPane

最佳答案

带有key listener ,“组件必须具有键盘焦点。”相比之下,key bindings “考虑收容等级。”您可能在如何搜索包含层次结构或如何 focus subsystem 方面遇到了特定于平台的变幻莫测的情况。有效。

举个具体的例子,LinePanel包含一个 ControlPanel,其中包含许多 MoveButton 实例。每个 MoveButton 都有一个用于移动线条的 Action。封闭的 ControlPanel 获取一个 WHEN_IN_FOCUSED_WINDOW 映射条目,该条目将匹配的箭头键绑定(bind)到单击相应的 Action按钮。这样,即使另一个按钮具有焦点,特定的箭头按钮也会显示视觉反馈。

关于java - 为什么在下面的示例中,KeyBindings(而不是 KeyListeners)检测到 ActionEvents?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30969239/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com