如何使用KeyListener在JFrame中移动矩形?

时间:2015-01-30 02:05:04

标签: java swing jframe keylistener

当我按下键盘上的给定键时,我试图让JFrame中的矩形移动,但我似乎很难做到这一点。这是我的代码:

package TestPackage;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JComponent;

public class Mainframe extends JComponent implements KeyListener
{
    private static final long serialVersionUID = 1L;

    int x = 350;
    int y = 250;

    public static void main (String[] args)
    {
        JFrame frame = new JFrame ("Mainframe");
        frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
        frame.setSize (800, 600);
        frame.setFocusable (true);
        frame.getContentPane().setBackground (Color.WHITE);
        frame.getContentPane().add (new Mainframe());
        frame.addKeyListener (new Mainframe());
        frame.setVisible (true);
    }

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

    public void keyPressed (KeyEvent event)
    {
        if (event.getKeyCode() == KeyEvent.VK_A)
        {
            x++;
            repaint();
        }
        else if (event.getKeyCode() == KeyEvent.VK_D)
        {
            y++;
            repaint();
        }
    }

    public void keyReleased (KeyEvent event) {}
    public void keyTyped (KeyEvent event) {}
}

我确定这是我的KeyListener的一个问题,因为其他一切都很完美。有人知道我做错了什么吗?感谢。

2 个答案:

答案 0 :(得分:1)

  1. 您正在创建两个MainFrame个实例,一个添加到框架中,另一个用作JFrame KeyListener,这意味着{{1}实例使用KeyListener值,UI上的实例不会看到
  2. 不要使用x/y,它有太多与焦点相关的问题,请使用旨在克服这些问题的Key Bindings API。请参阅How to Use Key Bindings
  3. 请勿覆盖KeyListener(特别是如果您不打算致电paint),则应覆盖super.paint方法(并致电paintComponent )。有关详细信息,请参阅Painting in AWT and SwingPerforming Custom Painting
  4. 确保仅在事件调度线程的上下文中创建和修改UI,有关详细信息,请参阅Initial Threads
  5. 例如......

    super.paintComponent

答案 1 :(得分:0)

使你的主要像这样,它将工作

 public static void main (String[] args)
    {
        JFrame frame = new JFrame ("Mainframe");
        JComponent test = new Mainframe();
        frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
        frame.setSize (800, 600);
        frame.setFocusable (true);
        frame.getContentPane().setBackground (Color.WHITE);
        frame.getContentPane().add (test);
        frame.addKeyListener ((KeyListener) test);
        frame.setVisible (true);
    }