Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 玩家控制的JPanel对象卡在JFrame的某些角落_Java_Swing_Jframe_Jpanel_Keyevent - Fatal编程技术网

Java 玩家控制的JPanel对象卡在JFrame的某些角落

Java 玩家控制的JPanel对象卡在JFrame的某些角落,java,swing,jframe,jpanel,keyevent,Java,Swing,Jframe,Jpanel,Keyevent,我目前正在尝试制作一个基于java的平台,作为自学java Swing的试玩方式。我目前在JFrame中有一个JPanel,它由w-a-s-d控制。我目前正在记事本中编写代码,并使用命令行运行和监视脚本。(我知道,没有IDE是愚蠢的,只是现在不能被打扰) import java.awt.*; 导入java.awt.event.*; 导入javax.swing.*; 公共类示例{ 私人int dx; 私家侦探; 私有静态javax.swing.Timer t; 布尔值x1=假; 布尔x2=假; 布

我目前正在尝试制作一个基于java的平台,作为自学java Swing的试玩方式。我目前在JFrame中有一个JPanel,它由w-a-s-d控制。我目前正在记事本中编写代码,并使用命令行运行和监视脚本。(我知道,没有IDE是愚蠢的,只是现在不能被打扰)

import java.awt.*;
导入java.awt.event.*;
导入javax.swing.*;
公共类示例{
私人int dx;
私家侦探;
私有静态javax.swing.Timer t;
布尔值x1=假;
布尔x2=假;
布尔y1=假;
布尔y2=假;
PanelExample(){
JFrame f=新JFrame(“面板示例”);
f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel p=新的JPanel();
p、 立根(50,50,20,20);;
p、 挫折地面(颜色:红色);
f、 加(p);
f、 设置大小(700400);
f、 setLocationRelativeTo(空);
f、 setLayout(空);
f、 setVisible(真);
新计时器(20,新ActionListener(){
已执行的公共无效操作(操作事件arg0){
int bx=p.getLocation().x;
int by=p.getLocation().y;
如果(x1==true){
p、 设置位置(p.getLocation().x+5,p.getLocation().y);
} 
否则{
p、 setLocation(p.getLocation().x,p.getLocation().y);
}
如果(x2==真){
p、 setLocation(p.getLocation().x-5,p.getLocation().y);
} 
否则{
p、 setLocation(p.getLocation().x,p.getLocation().y);
}
如果(y1==真){
p、 设置位置(p.getLocation().x,p.getLocation().y+5);
} 
否则{
p、 setLocation(p.getLocation().x,p.getLocation().y);
}
如果(y2==真){
p、 setLocation(p.getLocation().x,p.getLocation().y-5);
} 
否则{
p、 setLocation(p.getLocation().x,p.getLocation().y);
}
if(bx<0){
p、 setLocation(p.getLocation().x=0,p.getLocation().y);
}
如果(bx>665){
p、 设置位置(p.getLocation().x=665,p.getLocation().y);
}
如果(通过<0){
p、 setLocation(p.getLocation().x,p.getLocation().y=0);
}
如果(通过>340){
p、 设置位置(p.getLocation().x,p.getLocation().y=340);
}
系统输出打印项次(“X值:+bx+”| Y值:+by);
}
}).start();
f、 addKeyListener(新的KeyListener(){
@凌驾
public void keyTyped(KeyEvent e){
}
@凌驾
按下公共无效键(按键事件e){
int ax=e.getKeyCode();
int bx=p.getLocation().x;
int by=p.getLocation().y;
开关(ax)
{
//案例上的数字与w-a-s-d对应
//这是为了让钥匙放下
案例83:
如果(通过<340){
y1=真;
打破
}
//这是d键或右键
案例68:
如果(bx<665){
x1=真;
打破
//这是w或以上的钥匙
}
案例87:
如果(通过>0){
y2=真;
打破
}
//这是a键或左键
案例65:
如果(bx>0){
x2=真;
打破
}
}
}
@凌驾
公共无效密钥已释放(密钥事件e){
System.out.println(“密钥释放代码=“+e.getKeyCode());
int ax=e.getKeyCode();
开关(ax)
{
案例83:
y1=假;
打破
案例68:
x1=假;
打破
案例87:
y2=假;
打破
案例65:
x2=假;
打破
}
}
});
}  
公共静态void main(字符串args[]){
新的PanelExample();
}
}  

我的问题是,当我的对象接触顶部或右侧墙时,有一半的时间分别进入左上角或右上角。发生这种情况时,顶墙的键d停止工作,右墙的键s停止工作。我试着设置if语句,如果它通过边界,就停止所有移动,但这没有帮助。我做错了什么?

首先,你不应该使用“幻数”。例如:

case 83:
API提供了使代码更易于阅读的变量:

case KeyEvent.VK_S:
我的问题是,当我的对象接触顶部或右侧墙时

不确定发生了什么,但我怀疑您有几个问题:

  • 将KeyListener添加到错误的组件。您正在将其添加到框架中,而您应该将其添加到框架的内容窗格中,因为您将红色面板添加到内容窗格中。也就是说,您的红色面板永远不会到达框架顶部,因为标题栏是框架的一部分。因此,当您对0进行测试时,它需要与框架的内容窗格相关

  • case KeyEvent.VK_S:
    Component c = (Component)e.getSource();
    int width = c.getWidth();