我需要绑定所有箭头键以执行相同的功能,但是每次获取按下哪个键时。目前我只有通过以下方式按下向右箭头键时才有
DoneImg.getInputMap(JLabel.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), "UpArrow");
Action MvRight = new AbstractAction()
{
public void actionPerformed(ActionEvent e)
{
//Do whatever here
}
};
DoneImg.getActionMap().put("RightArrow", MvRight);
但是我需要这样的东西
DoneImg.getInputMap(JLabel.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), "RightArrow");
DoneImg.getInputMap(JLabel.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0), "LeftArrow");
DoneImg.getInputMap(JLabel.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0), "DownArrow");
DoneImg.getInputMap(JLabel.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), "UpArrow");
Action MvAll = new AbstractAction()
{
public void actionPerformed(ActionEvent e)
{
if (e.keypressed == "LeftArrow")
{System.out.println("The left arrow was pressed!");}
if (e.keypressed == "RightArrow")
{System.out.println("The right arrow was pressed!");}
//and so forth
}
};
DoneImg.getActionMap().put("RightArrow", MvAll);
DoneImg.getActionMap().put("LeftArrow", MvAll);
DoneImg.getActionMap().put("UpArrow", MvAll);
DoneImg.getActionMap().put("DownArrow", MvAll);
您要问的实际上是违反直觉的,并且违背了键绑定API的设计。
目的是为每个按键提供单个工作单元。在我看来,这建议您应为每个箭头键分别执行操作。
它使您更容易遵循逻辑,进行更改,根据需要规避操作。
但是我是谁呢?
如果看不到它,一种简单的方法就是为每个动作分配一个“命令”,然后在actionPerformed
触发该动作时可以进行询问。
public TestKeyBindings02() {
JPanel panel = new JPanel();
InputMap im = panel.getInputMap(JPanel.WHEN_IN_FOCUSED_WINDOW);
ActionMap am = panel.getActionMap();
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), "RightArrow");
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0), "LeftArrow");
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), "UpArrow");
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0), "DownArrow");
am.put("RightArrow", new ArrowAction("RightArrow"));
am.put("LeftArrow", new ArrowAction("LeftArrow"));
am.put("UpArrow", new ArrowAction("UpArrow"));
am.put("DownArrow", new ArrowAction("DownArrow"));
}
public class ArrowAction extends AbstractAction {
private String cmd;
public ArrowAction(String cmd) {
this.cmd = cmd;
}
@Override
public void actionPerformed(ActionEvent e) {
if (cmd.equalsIgnoreCase("LeftArrow")) {
System.out.println("The left arrow was pressed!");
} else if (cmd.equalsIgnoreCase("RightArrow")) {
System.out.println("The right arrow was pressed!");
} else if (cmd.equalsIgnoreCase("UpArrow")) {
System.out.println("The up arrow was pressed!");
} else if (cmd.equalsIgnoreCase("DownArrow")) {
System.out.println("The down arrow was pressed!");
}
}
}
问题内容: 我试图写一个计算器,有一个问题。我已经为所有按钮制作了动作监听器,现在我希望可以从键盘输入数据。我是否需要对KeyListener或Keybinding进行全部操作,还是有其他方法可以使单击按钮后将其发送到actionlistener中的说明?还有更好的方法:Keylistener或Keybinding 问题答案: 一般而言,在您的键输入集有限的情况下,键绑定是一个更好的选择。 遭受与
问题内容: 我正在尝试在JPanel上的Java中进行键绑定。我希望在按下“ w”按钮时执行某些操作。我遵循Java教程进行绑定,但是actionPerformed方法不执行(即,没有文本打印出来)。以下是我的测试GUI的全部代码,并突出显示了相关部分: 永远不会打印文本“ test”。我已经尝试了很多次,使用了许多不同的变体,不同的键,并且确保面板聚焦,但没有运气。我究竟做错了什么? 问题答案:
问题内容: 我是Java图形和线程的新手,我正在尝试制作一个游戏(特别是Pong)。这个想法是两个人可以在同一个键盘上玩(即,有两个通过不同键控制的拨盘)。目前,两个玩家都无法同时移动其球拍。 有针对这个的解决方法吗?单独的线程是答案吗? 如果可能的话,我希望这些拨片能够同时(至少在表面上)移动。 更新:似乎使用存储按下的键是最好的选择。我已经做到了(并且可以正常工作),但是我想知道是否其中的任何
问题内容: 我想在我的应用程序中的任何位置(Control + S)触发保存操作。我已经添加了必要的键绑定,并且该操作将按预期触发。但是,如果我在JTable上尝试Control + S,则该表将启动我的自定义操作并激活该表单元格以进行编辑。我想我已经在表格的输入映射中禁用了编辑操作。我在这里想念什么? 问题答案: 像@Guillaume一样,我运行您的代码没问题。您可能会在这里讨论过无意中失败的
问题内容: 为什么我只能使用通配符而不使用类型参数? 例如,在界面中,为什么方法不是这样写的 问题答案: super绑定命名类型参数(例如)而不是通配符(例如)是非法的,这仅仅是因为即使允许,它也不会执行你希望的操作,因为既然这是所有引用类型的最终值,一切是,实际上有没有约束。 在你的特定示例中,由于任何引用类型的数组都是(通过Java数组协方差),因此可以在编译时用作(如果这样的绑定是合法的)自
问题内容: 我在代码(游戏或其他方式)中使用s作为屏幕对象对用户键输入做出反应的方式。这是我的代码: 我的响应能力有问题: 我需要单击该对象才能使其工作。 我对按下其中一个键的反应不是我希望它如何工作-反应太灵敏或反应迟钝。 为什么会发生这种情况,我该如何解决? 问题答案: 该答案说明并演示了如何使用键绑定代替键侦听器来进行教学。它不是 如何用Java编写游戏。 良好的代码编写外观应该如何(例如可