什么是首选的Java AWT键盘输入方式?

3

我在互联网上看到了很多关于如何处理awt和swing输入的矛盾建议,包括这里,而且有几个人已经修改了我的代码,它现在变得一团糟。

选项

  • 实现KeyListener或扩展KeyAdapter
  • ^在应用程序的主类中使用匿名类、使用私有类或使用外部输入管理类。
  • 将事件对象发送给需要知道输入的每个对象,发送按下的键数组,或使每个类成为监听器并将其添加到主类中。

所以我可以有

public class Board extends JPanel implements KeyListener{
    public Board(){addKeyListener(this);}}

或者

public Board(){addKeyListener( new KeyListener(){...});}

或者

public class Board extends JPanel {
    private class PrivateListener implements KeyListener{...} 
    public Board(){addKeyListener(new PrivateListener());

或者

public class PublicListener implements KeyAdapter{...}
public class Board extends JPanel {
    public Board(){addKeyListener(new PublicListener());

或者

addKeyListener(this);
addKeyListener(obj1);
addKeyListener(obj2);

implements KeyListener可以用extends KeyAdapter 来替代,但我不会这样做,因为Java只允许一个父类。

然后还有一个问题:我不知道这是怎么进入我的代码的。

private boolean [] keys = new boolean[256];
public void keyPressed(KeyEvent e) {keys[e.getKeyCode()] = true;}
public void keyReleased(KeyEvent e) {keys[e.getKeyCode()] = false;}
public boolean isKeyDown(int k) {return keys[k];}

或者

public void keyPressed(KeyEvent e) {
    obj1.keyPressed(e);
    obj2.keyPressed(e);
}

实际上,最好的awt键盘输入实现是什么?


"实现KeyListener..." 你在这些搜索中没有看到任何关于Key Bindings的内容吗? - Andrew Thompson
顺便问一下,这段代码使用AWT组件吗?如果是的话,为什么要使用AWT而不是Swing?请参考Swing extras over AWT中的答案,了解放弃使用AWT组件的许多好理由。如果您需要支持旧的基于AWT的API,请参阅Mixing Heavyweight and Lightweight Components - Andrew Thompson
@AndrewThompson 我正在开发一个基于2D AWT的游戏。在这个过程中,我发现了很多控制方式。问题在于如何以最佳方式使用AWT进行输入(同时当涉及到爱好时,生活是令人沮丧的)。 - Old Badman Grey
1个回答

0

这是一个非常“因情况而异”的情况,这个答案可以引起很多学术讨论。

我的观点:

这只是我的个人意见,但我建议与您的编码人员进行沟通并就两件事达成一致。根据答案做出决定,并将其放在代码底部的README中:

  1. 使用匿名类,还是不使用?
  2. 使用大型类,还是不使用?

假设喜欢小型、命名良好的类,我会选择以下方案。

public class PublicListener implements KeyAdapter{...}
public class Board extends JPanel {
    public Board(){addKeyListener(new PublicListener());

使用KeyAdapter,您只需要覆盖您关心的函数,其他程序员可以很容易地看到这是输入处理的位置,因为它在自己的类中。 简而言之 首先,想要使用低级别的类是一个有效的愿望。在生产代码中,我不建议这样做,但AWT仍然是Swing的基础,想要学习并不应该受到阻碍!如果没有人学习低级别的东西,那么有一天开源社区将面临一个大问题,即构建在没有人学习的代码之上。
虽然Swing和Key Bindings的评论是正确的,在Swing Key Bindings的文档中,有如下引用:
“与键绑定的替代方法是使用键侦听器。键侦听器作为键盘输入的低级接口有其存在的价值,但对于响应单个键,键绑定更合适,并且往往会导致更易于维护的代码。因此,如果您想学习一些低级别的东西,请去尝试,但请注意可维护性的警告!”
其余部分归结为两个主要点。编码风格和应用程序架构。 编码风格:

代码库的一致性通常比完美实现更重要,因此如果您有一个具有现有风格的代码库,则应坚持该风格。例如,如果您的代码库已经在其他地方使用了很多匿名类进行其他操作,则添加new KeyListener(){...}是可以接受的。尽管如此,在我的个人项目中,我避免使用匿名类,因为这是个人偏好...

编码风格中选择(我所说的)Mega和Mini类也很重要。非常明确的建议是首选小型(Mini)类,具有特定的角色。这将支持实现扩展KeyAdapter的专用类。小型类很少会出现多重继承问题,允许您依赖默认实现(如KeyAdapter),进一步减少代码复杂性。未来的编码人员可以很容易地看到该类的用途。Mega类将所有代码集中到一个Java文件中,但随之而来的就是要实现大量的接口,并且还要为所有内容提供默认实现。将KeyListener与KeyAdapter进行比较,这意味着实现三个函数而不是覆盖一个函数。

Mega类由于多重继承而有其存在的地方。"Player"可以是一个人类、"PositionProvider"、一个"Drawable"等等。但是,说句实话,这并不推荐。

架构:

提到游戏编程,这也是一个重要的考虑因素。游戏的架构可能与桌面GUI应用程序非常不同。您需要选择一种架构,并编写符合它的代码。例如,您是否计划让几个组件监听AWT事件并独立操作(实体),还是计划拥有一个单独的“InputManager”类,该类将输入从键盘和手柄等设备中抽象出来?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接