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

KeyListener问题

禹正阳
2023-03-14

我正在尝试实现一个简单的keylistener,用左键箭头绘制椭圆形移动的图形。在使用系统进行测试后,椭圆形不会移动,甚至不会读取按键。出来普林顿。任何帮助都将不胜感激。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;

public class Game extends JFrame implements KeyListener{

  int x = 450;
  int y = 600;

  public Game() {
    setTitle("Game");
    setSize(1024, 768);
    setVisible(true);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
  }

  public void paint(Graphics g) {
    g.setColor(Color.BLACK);
    g.fillOval(x, y, 100, 100); 
  }

  public void keyPressed(KeyEvent e) {
    if (e.getKeyCode() == KeyEvent.VK_LEFT) {
      x = x + 20;
      System.out.println("works");
    }
  }
    public void keyReleased(KeyEvent e) {}
    public void keyTyped(KeyEvent e) {}


  public static void main(String[] args) {
    Game game = new Game();
  }
}

共有3个答案

岳昊空
2023-03-14

让我们从KeyListener问题开始KeyListener因不响应键输入而广为人知,并且仅当组件可聚焦且具有焦点时才会生成KeyEvents。

相反,您应该使用密钥绑定API

接下来,您应该避免覆盖顶级容器(如JFrame)的paint,有关详细信息,请查看

  • 我怎么能置身其中?
  • 标题栏中的图形渲染
  • 如何获得屏幕的精确中间,即使调整大小

一般来说,您应该避免扩展JFrame,而是更喜欢使用JPanel之类的方法,并覆盖它的paintComponent方法。

另外请记住,Swing中的绘画是由一系列链式方法调用组成的,除非你真的,真的,真的知道你在做什么,否则在执行任何CSOMT绘画之前,你应该总是调用超级绘画方法。

有关更多详细信息,请参见AWT和Swing中的绘制和执行自定义绘制

巫培
2023-03-14

您误解了KeyListener的目的和用法。您的类实现了该接口,但只有实际注册在生成事件的组件上的实现才会接收该事件。即使组件本身是适当类型的侦听器,这种情况仍然存在。因此,也许您需要

game.addKeyListener(game);

还要注意,您可能需要处理线程问题。要正确同步,GUI初始化代码通常需要在EDT上运行,这可以通过SwingUtilities来实现。invokeAndWait()SwingUtilities。invokeLater()

隆飞宇
2023-03-14

椭圆形不会移动,甚至不会阅读按键后测试与system.out.println.任何帮助将不胜感激

据我所知,你没有添加你的听众,因此当你按下这个键时,什么都不会发生。

如果您要添加到当前的Game类,您可以这样做:

this.addKeyListener(this);

如果要在当前Game类之外添加侦听器,则:

gameInstance.addKeyListener(gameInstance);

代码的其他问题:

  • 您可能希望使用KeyBindings而不是KeyListener。
  • 不要重写油漆(g)。而要重写油漆组件(g)。我们几乎没有理由重写油漆(g)
  • 通常我们不会创建自定义的JFrame。您可以考虑创建一个JPanel(无论是否自定义)并将其添加到您的JFrame中。
  • 将JPanel(一个容器)添加到您的JFrame后,您可以pack()您的框架,它将能够确定自己的preferredsize
 类似资料:
  • 处理KeyEvent的类应该实现此接口。该类的对象必须在组件中注册。 可以使用addKeyListener()方法注册该对象。 接口声明 以下是java.awt.event.KeyListener接口的声明: public interface KeyListener extends EventListener 接口方法 (Interface methods) SN 方法和描述 1 void

  • 处理KeyEvent的类应该实现此接口。 该类的对象必须在组件中注册。 可以使用addKeyListener()方法注册该对象。 接口声明 (Interface Declaration) 以下是java.awt.event.KeyListener接口的声明 - public interface KeyListener extends EventListener 接口方法 Sr.No. 方法

  • 问题内容: 对于我的应用程序,我需要空格键才能在应用程序中的任何位置(但仅在根据选项卡打开的情况下)调用独立于焦点小部件的函数。我发现可以向显示添加过滤器,如下所示: 在大多数情况下,这种方法都能正常工作,但是如果我通过“选项卡”或“移位选项卡”为按钮提供焦点,则有点奇怪- 空格键将激活“按下的按钮”,就好像单击该按钮时鼠标。我现在有点卡住了,我不知道该如何避免…对于按钮,我已经实现了Select

  • 问题内容: 我有一个JTextField(JT)在我尽快要按照用户类型,例如在里面,这个词被自动JTextField中写入。 我使用代码: 但这会在按下e时给出!有任何想法吗?非常感谢 问题答案: 不要在文本组件上使用,存在一系列问题(未通知,突变异常,当用户将某些内容粘贴到字段时未通知),相反,您应该使用 例如…

  • 问题内容: 我想以这种方式通过keyListener的实现使用unicode : 但它写入字符与字符。如何只获取手写的字符 问题答案: 无论您当前遇到什么问题,都不应在JTextField中使用KeyListener。请改用DocumentListener或DocumentFilter。给定您的代码,我猜测您需要的是DocumentFilter,因为您希望在输入JTextField并在显示之前更改