Java 按键时改变球的方向

Java 按键时改变球的方向,java,swing,paintcomponent,keylistener,frames,Java,Swing,Paintcomponent,Keylistener,Frames,我一直试图让球在按下任何键时改变方向。如果球在按下键时向侧面移动,球将开始向下移动,当球触到底部时,球会以向上的位置向后移动…我想我写的代码是正确的,我找不到任何错误。 有人能告诉我这个代码有什么问题吗 import java.awt.BorderLayout; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.KeyEvent; import ja

我一直试图让球在按下任何键时改变方向。如果球在按下键时向侧面移动,球将开始向下移动,当球触到底部时,球会以向上的位置向后移动…我想我写的代码是正确的,我找不到任何错误。 有人能告诉我这个代码有什么问题吗

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.geom.Ellipse2D;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ASS2 extends JFrame {

    public static void main(String args[]) {
        ASS2 g = new ASS2();
        g.setLayout(new BorderLayout());
        g.setSize(500, 500);
        MyPanel mp = new MyPanel();
        g.add(mp);
        mp.setSize(500, 500);
        mp.setBackground(Color.black);
//mp.addKeyListener(mp);
        g.setVisible(true);
        g.setDefaultCloseOperation(EXIT_ON_CLOSE);

    }
}

class MyPanel extends JPanel implements KeyListener {

    {
        addKeyListener(this);
    }
    int xpos = 20, ypos = 200;
    int xtop = 15, ytop = 15;
    int xtemp = 250, ytemp = 250;
    int xbot = 450, ybot = 400;
    int flag = 1, flag1 = 1;

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        g2d.setColor(Color.white);
        g2d.fill(new Ellipse2D.Double(xpos, ypos, 50, 50));
        if (xpos < xbot && flag == 1) {
            xpos++;
            if (xpos == xbot) {
                flag = 0;
            }
        } else if (xpos > xtop && flag == 0) {
            xpos--;
            if (xpos == xtop) {
                flag = 1;
            }
        }

        try {
            Thread.sleep(05);
        } catch (Exception e) {
        }
        repaint(1000);

    }

    public void keyPressed(KeyEvent ae) {

    }

    public void keyReleased(KeyEvent ae) {
        Object t = ae.getKeyCode();
        if (t.equals(KeyEvent.VK_DOWN)) {
            if (ypos < ybot && flag1 == 1) {
                ypos++;
                if (ypos == ybot) {
                    flag1 = 0;
                }
            } else if (ypos > ytop && flag1 == 0) {
                ypos--;
                if (ypos == ytop) {
                    flag1 = 1;
                }
            }
            repaint();
        } else if (t.equals(KeyEvent.VK_RIGHT)) {
            if (xpos < xbot && flag == 1) {
                xpos++;
                if (xpos == xbot) {
                    flag = 0;
                }
            } else if (xpos > xtop && flag == 0) {
                xpos--;
                if (xpos == xtop) {
                    flag = 0;
                }
            }
            repaint();
        }

    }
}
导入java.awt.BorderLayout;
导入java.awt.Color;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.event.KeyEvent;
导入java.awt.event.KeyListener;
导入java.awt.geom.Ellipse2D;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
公共类ASS2扩展了JFrame{
公共静态void main(字符串参数[]){
ASS2 g=新ASS2();
g、 setLayout(新的BorderLayout());
g、 设置大小(500500);
MyPanel mp=新的MyPanel();
g、 添加(mp);
mp.设置尺寸(500500);
mp.挫折背景(颜色:黑色);
//mp.addKeyListener(mp);
g、 setVisible(真);
g、 setDefaultCloseOperation(关闭时退出);
}
}
类MyPanel扩展JPanel实现KeyListener{
{
addKeyListener(此);
}
int xpos=20,ypos=200;
int-xtop=15,ytop=15;
int xtemp=250,ytemp=250;
int xbot=450,ybot=400;
int flag=1,flag1=1;
公共组件(图形g){
超级组件(g);
Graphics2D g2d=(Graphics2D)g;
g2d.setColor(Color.white);
g2d.fill(新的Ellipse2D.Double(xpos,ypos,50,50));
如果(xposxtop&&flag==0){
xpos--;
如果(xpos==xtop){
flag=1;
}
}
试一试{
睡眠(05);
}捕获(例外e){
}
重新油漆(1000);
}
按下公共无效键(按键事件ae){
}
公开无效密钥已释放(密钥事件ae){
对象t=ae.getKeyCode();
if(t.equals(KeyEvent.VK_DOWN)){
if(yposytop&&flag1==0){
ypos--;
如果(ypos==ytop){
flag1=1;
}
}
重新油漆();
}else if(t.equals(KeyEvent.VK_RIGHT)){
如果(xposxtop&&flag==0){
xpos--;
如果(xpos==xtop){
flag=0;
}
}
重新油漆();
}
}
}

欢迎来到“为什么你不应该使用
KeyListener
s”的奇妙世界

基本上,
KeyListener
仅在侦听器所连接的组件可聚焦且具有焦点时才会引发事件

相反,您应该使用它来控制它们触发关键事件的焦点级别


  • 不要在EDT中调用的任何方法中使用
    Thread.sleep
    ,尤其是
    paint
    方法
  • 不要调用
    repaint(1000)
    在任何绘制方法内,或调用任何可能从
    绘制
    方法内触发
    重新绘制
    的方法
  • 不要在
    paint
    methods、
    paint
    methods paint中修改状态,仅此而已
  • 使用某种“更新”线程/进程,负责更新游戏模型并请求更新视图
    java.swing.Timer
    是一个很好的简单选择。看
  • 当Swing
    计时器
    对您尝试执行的操作进行限制,并且您开始探索
    线程
    的使用时,不要修改EDT之外的任何UI组件。有关更多详细信息,请参阅
  • 始终从EDT上下文中启动程序,有关更多详细信息,请参阅

不要在EDT内调用的任何方法中使用
Thread.sleep
,尤其是
paint
方法。不要调用
repaint(1000)
在任何
绘制
方法中,或者调用任何可能触发
重新绘制
的方法,从
绘制
方法中调用。问题是我必须使用keyListener,因为我的教授这么说,我希望球先从左向右移动,然后当我按下键时,它应该改变方向问题是你的教授是。。。键绑定已经过时了,在过去的5-8年中一直在使用…在键侦听器能够工作之前,您需要使面板可聚焦并在窗口中请求聚焦