KeyPressed不起作用

时间:2014-07-07 18:45:30

标签: java swing paintcomponent keylistener

我正在尝试使用箭头键上下移动图像。我使用ASCII值来检查按下了哪个键,但keyPressed的处理程序没有被调用。我通过应用断点检查但没有任何反应。

package com.google.play;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.border.EmptyBorder;

public class ShootingBubble extends JPanel implements ActionListener,KeyListener {

    int y=250;
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        g.setColor(Color.GRAY);
        g.drawRect(0, 200, 300, 400);
        g.fillRect(0, 200, 300, 400);

        g.setColor(Color.GRAY);
        g.drawRect(800, 200, 300, 400);
        g.fillRect(800, 200, 300, 400);

        g.setColor(Color.BLACK);
        g.drawLine(1000,200, 350, 200);

        g.setColor(Color.BLACK);
        g.drawOval(295, 190, 20, 20);
        g.fillOval(295, 190, 20, 20);

        g.setColor(Color.BLACK);
        g.drawLine(0,190, 300, 190);


        g.setColor(Color.BLACK);
        g.drawLine(310,190, 310, y);

        ImageIcon ic=new ImageIcon("C:\\Users\\acer\\Desktop\\mario.gif");
        ic.paintIcon(this, g, 295, y);//moving image with help of y variable
        ic.paintIcon(this, g, 0, 150);
        ic.paintIcon(this, g, 40, 150);
        ic.paintIcon(this, g, 80, 150);
        ic.paintIcon(this, g, 120, 150);

        ImageIcon ic1=new ImageIcon("C:\\Users\\acer\\Desktop\\index.jpg");
        ic1.paintIcon(this, g, 320, 130);





    }

    public ShootingBubble() {
        setBackground(Color.WHITE);
        setFocusTraversalKeysEnabled(false);


    }


    void init(){

    }

    @Override
    public void keyReleased(KeyEvent e) {
        System.out.println("c");

    }

    @Override
    public void keyTyped(KeyEvent e) {
        System.out.println("d");

    }

    public static void main(String[] args) {
        ShootingBubble st=new ShootingBubble();
        JFrame jf=new JFrame();
        jf.setSize(1000, 600);
        jf.setVisible(true);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.getContentPane().add(st);
    }
    @Override
    public void actionPerformed(ActionEvent arg0) {

        }





    @Override
    public void keyPressed(KeyEvent arg0) {

        if(arg0.getKeyCode()==38){

            y-=2;//updating image position in vertically upward direction
        }
        if(arg0.getKeyCode()==40)
        {
            y=y+2;//updating image position in vertically downward direction
        }


        System.out.println("Key Pressed "+arg0.getKeyCode()+ " "+arg0.getKeyChar());
        repaint();;

    }



}

2 个答案:

答案 0 :(得分:3)

几个问题,并非都与KeyListener相关:

  1. 不要在paintComponent()方法中执行I / O.绘画方法仅用于绘画。 Swing将确定何时需要重新绘制组件并且您不想一遍又一遍地连续读取图像。阅读构造函数中的图像。

  2. 在调用frame.setVisible(...)方法之前,应将所有组件添加到框架中。这将确保在所有组件上调用布局管理器。

  3. 不要使用"魔术数字"。我不知道" 38"和" 40"是。你怎么知道它们是什么?如果您从教程中复制了该代码,则转储教程!相反,您应该使用KeyEvent.VK_???

  4. 即使您将KeyListener添加到框架中,代码也可能无法正常工作,因为KeyEvents仅被调度到具有焦点的组件,我不知道框架将始终具有焦点。实际上,面板应该具有焦点,因为它是绘画的组件。

  5. 不要使用KeyListener。 Swing旨在与Key Bindings一起使用。有关更多信息和示例,请参阅Motion With the Keyboard

答案 1 :(得分:1)

你必须注册keylistener。

jf.addKeyListener(this);添加到您的主要方法。