圆圈不移动
问题描述:
没有错误,但是当我按下任何按钮时,我的椭圆/圆圈根本不移动?谁能帮忙?我一直在查看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();
}
}
答
- 你永远不会调用从
repaint
您Move
方法中 -
Thread t1 = new Thread();
不会做太多,因为它永远不会调用任何运行的代码,实际上它会启动并终止几乎立即,怎么过。 .. - Swing不是线程安全的,您不应该修改UI或UI从事件派发线程以外依赖的任何东西,这一点尤其重要,因为任何时候都可能出现绘制循环。见Concurrency in Swing更多细节
- 你重写一个顶层容器(
JFrame
)的paint
方法再破漆链...油漆是复杂的一系列链接在一起,产生最终结果的方法调用,你应该总是调用super.paint
首先,但你可能知道,JFrame
没有双缓冲。相反,您应该创建另一个类,它的范围从JPanel
开始,并覆盖它的paintComponent
方法来执行实际绘制(实际上,大部分它应该几乎取代当前JFrame
正在执行的功能)... Swing组件是默认双缓冲... - 从
paint
方法调用repaint
...这是一个坏消息,这将立即安排另一个绘画周期,这将变得如此之快,它会消耗您所有的CPU周期,直到您的电脑仍然静止 - 使用
KeyListener
。KeyListener
因存在问题而臭名昭着,特别是,如果它注册到的组件是FOCUSABLE和HOCOCOC,它只会触发一个关键事件。 AJFrame
由物理窗口JRootPane
组成,该窗口包含内容窗格(以及其他一些组件),所有这些都可以影响实际获得焦点的框架。相反,使用前面提到的JPanel
,使用键绑定API,这将允许控制触发键事件所需的焦点级别。见How to Use Key Bindings更多细节
你也应该看看......
您是否尝试过使用调试器来检查哪些你的代码实际上被调用了吗? – 2014-10-30 23:38:08
'Thread t1 = new Thread(); t1.start();'看起来不像完成任何事情。你在哪里告诉't1'线程运行什么代码? – ajb 2014-10-30 23:42:59