没有错误,但是当我按下任何按钮时,我的椭圆/圆圈根本不移动?有人可以帮忙吗?我一直在查看代码大约20分钟,看看我输错了什么或把东西放错了地方。我不知道这是否与我移动它或我的线程有关。
package com.badfitz66.mainpackage;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
public class Main extends JFrame implements Runnable
{
int x, y, xDirection, yDirection;
private Image dbImage;
private Graphics dbG;
Font font = new Font("Black Caps", Font.ITALIC | Font.BOLD, 30);
public void run()
{
try
{
while(true)
{
Move();
Thread.sleep(5);
}
}
catch(Exception e){
System.out.println("Error");
}
}
public void Move()
{
x += xDirection;
y += yDirection;
if (x <= 0)
x = 0;
if(x >= 500)
x = 500;
if (y <= 50)
y = 50;
if (y >= 250)
y = 250;
}
public void setXDir(int xdir)
{
xDirection = xdir;
}
public void setYDir(int ydir)
{
yDirection = ydir;
}
public class AL extends KeyAdapter
{
public void keyPressed(KeyEvent e)
{
int keyCode = e.getKeyCode();
if(keyCode == e.VK_D)
{
setXDir(+1);
}
if(keyCode == e.VK_A)
{
setXDir(-1);
}
if(keyCode == e.VK_W)
{
setYDir(-1);
}
if(keyCode == e.VK_S)
{
setYDir(+1);
}
}
public void keyReleased(KeyEvent e)
{
int keyCode = e.getKeyCode();
if(keyCode == e.VK_D)
{
setXDir(0);
}
if(keyCode == e.VK_A)
{
setXDir(0);
}
if(keyCode == e.VK_W)
{
setYDir(0);
}
if(keyCode == e.VK_S)
{
setYDir(0);
}
}
}
public Main()
{
addKeyListener(new AL());
setTitle("Java game testing");
setResizable(false);
setVisible(true);
setSize(500, 500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBackground(Color.green);
x = 150;
y = 150;
}
public void paint(Graphics g)
{
dbImage = createImage(getWidth(),getHeight());
dbG = dbImage.getGraphics();
paintComponent(dbG);
g.drawImage(dbImage, 0, 0, this);
}
public void paintComponent(Graphics g)
{
g.setFont(font);
g.drawString("Hello world", 125, 50);
g.setColor(Color.cyan);
g.fillOval(x, y, 15, 15);
repaint();
}
public static void main(String[] args)
{
Main jg = new Main();
//Threads
Thread t1 = new Thread();
t1.start();
}
}
答案 0 :(得分:2)
repaint
方法Move
Thread t1 = new Thread();
不会做太多,因为它永远不会调用任何可运行的代码,事实上它几乎会立即启动和终止,但是...... ... paint
方法(JFrame
),然后打破画颜链... paint是复杂的一系列方法调用链接在一起产生最终结果,你应该始终先调用super.paint
,但正如您可能知道的那样,JFrame
不是双缓冲的。因此,您应该创建另一个从JPanel
扩展的类并覆盖它的paintComponent
方法来执行实际绘制(事实上,在大多数情况下,它应该几乎取代功能当前JFrame
正在做什么)...默认情况下,Swing组件是双缓冲的...... repaint
方法中调用paint
...这是个坏消息,这将立即安排另一个绘制周期,这会变得如此之快,以至于它消耗所有CPU周期,直到您的计算机静止不动KeyListener
。 KeyListener
因出现问题而臭名昭着,特别是如果它注册的组件是FOCUSABLE且HAS FOCUS,它只会触发一个关键事件。 JFrame
由物理窗口JRootPane
组成,其中包含内容窗格(以及一些其他组件),所有这些都可能妨碍实际获得焦点的帧。相反,使用前面提到的JPanel
,使用键绑定API,它将允许控制触发键事件所需的焦点级别。有关详细信息,请参阅How to Use Key Bindings 您还应该看看......