当前位置: 首页 > 知识库问答 >
问题:

类的Java KeyListener未扩展jpanel或其他内容

潘安平
2023-03-14

我正在尝试在一种名为Player的新数据类型中创建一个keylister,它实现了KeyListner。我怎样才能在不进一步实现或扩展任何内容的情况下使播放器成为自己的KeyListener(即this.addKeyListner(this))呢?如果这是不可能的,我希望Player扩展/实现什么来避免类中的无关方法

编辑:为了澄清一下,我不是在问如何在没有keyR几号键释放、键按下和键键入方法的情况下实现KeyListener。例如,我在问如何让Player将自己添加为KeyListener而不使其成为JBoard。

共有2个答案

陈修诚
2023-03-14
  • 创建一个扩展JPanel的类,比如MyJPanel
  • JPanel类应该提供修改其属性的方法
  • 创建一个单独的类来实现KeyListener,比如Player
  • 向JPanel类添加Player的对象
  • 在关键事件上从Player类调用JPanel方法,然后重新绘制
public class MyJPanel extends JPanel {

    private int x = 0;
    private int y = 0;

    public MyJPanel() {
        addKeyListener(new Player(this));
        setFocusable(true);
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.GREEN);
        g.fillRect(x, y, 100, 100);
    }

    public static void main(String[] args) {
        MyJPanel player = new MyJPanel();
        player.setSize(200, 200);
        JFrame frame = new JFrame();
        frame.add(player);
        frame.setLayout(null);
        frame.setTitle("Key listener example");
        frame.setSize(500, 500);
        frame.setVisible(true);
        frame.setResizable(false);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }

    void incrementX() {
        x++;
        if (x > 500)
            x = 500;
    }

    void decrementX() {
        x--;
        if (x < 0)
            x = 0;
    }

    void incrementY() {
        y++;
        if (y > 500)
            y = 500;
    }

    void decrementY() {
        y--;
        if (y < 0)
            y = 0;
    }
}
public class Player implements KeyListener {
    MyJPanel panel;

    public Player(MyJPanel myJPanel) {
        this.panel = myJPanel;
    }

    @Override
    public void keyPressed(KeyEvent pKeyEvent) {
        int key = pKeyEvent.getKeyCode();
        if (key == KeyEvent.VK_LEFT) {
            panel.decrementX();
        } else if (key == KeyEvent.VK_RIGHT) {
            panel.incrementX();
        } else if (key == KeyEvent.VK_UP) {
            panel.decrementY();
        } else if (key == KeyEvent.VK_DOWN) {
            panel.incrementY();

        }
        panel.repaint();
    }

    @Override
    public void keyReleased(KeyEvent pKeyEvent) {
    }

    @Override
    public void keyTyped(KeyEvent pKeyEvent) {
    }
}
曾航
2023-03-14

如果实现KeyListener(假设没有抽象的实例),那么必须实现这3种方法。它们与接口无关,因为这是一个键可能发生的三件事,它们可能与您无关,但实现它们只需要几行代码。

void keyPressed(KeyEvent e)

当按键时调用。

void keyReleased(KeyEvent e)

释放密钥时调用。

void keyTyped(KeyEvent e)

键入键时调用

只有3个,这是接口的本质。

 类似资料:
  • 说明 这个 API 通常可以与其他所有包一起工作,然而,一些特殊的与 Laravel 融合很深,利用 Laravel 的路由提供某些功能的包,可能和 API 冲突。这一页列表其他的包与 API 冲突,以及一些必要的步骤使两个包正常工作。 目前还没有冲突的包.

  • 内建的类,例如 Array,Map 等也都是可以扩展的(extendable)。 例如,这里有一个继承自原生 Array 的类 PowerArray: // 给 PowerArray 新增了一个方法(可以增加更多) class PowerArray extends Array { isEmpty() { return this.length === 0; } } let arr

  • 当数据类扩展包含非抽象open val属性的密封类时,生成的子数据类包含与父类的私有字段重复的私有字段。 的输出:

  • 问题内容: 我有这些嵌套的div,我需要主容器扩展(在高度上)以容纳内部的DIV CSS是这样的: 我的问题是无法拉伸以容纳所有内部div,结果它们一直在后台运行。 考虑到以上情况,如何解决此问题? 问题答案: 您需要在div关闭之前强制输入a 。我可能会将其移入div并将CSS设置为: 更新: 这个问题仍然有相当多的流量,所以我想使用CSS3中称为“弹性框”或“弹性框”的新布局模式,以一种现代的

  • 我正在Django上做类似ERP的小项目,其中包含不同的应用程序(产品、销售、采购、会计、MRP、...)。其中一些有依赖关系(例如,销售应用程序需要产品应用程序)。 继承或抽象类似乎也是不合适的,因为我不是试图为子产品创建模型,而是在表中现有信息(条目)的基础上进行增长或扩展。 实现这一点的最佳方法是什么?我应该考虑编写自定义迁移操作吗?否则,还有更好的办法吗?谢谢!

  • 问题内容: 我试图在这样的泛型类中创建一个常规的RuntimeException: 这段代码使我对这个词的错误说法。 这个RuntimeException与我的类通用有什么关系? 问题答案: Java不允许Throwable的通用子类。而且,非静态内部类可以通过其外部类的类型参数有效地进行参数化(请参见Oracle JDK Bug 5086027 )。例如,在您的示例中,内部类的实例具有form类