圆圈不移动

问题描述:

没有错误,但是当我按下任何按钮时,我的椭圆/圆圈根本不移动?谁能帮忙?我一直在查看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(); 
    } 
} 
+1

您是否尝试过使用调试器来检查哪些你的代码实际上被调用了吗? – 2014-10-30 23:38:08

+2

'Thread t1 = new Thread(); t1.start();'看起来不像完成任何事情。你在哪里告诉't1'线程运行什么代码? – ajb 2014-10-30 23:42:59

  1. 你永远不会调用从repaintMove方法中
  2. Thread t1 = new Thread();不会做太多,因为它永远不会调用任何运行的代码,实际上它会启动并终止几乎立即,怎么过。 ..
  3. Swing不是线程安全的,您不应该修改UI或UI从事件派发线程以外依赖的任何东西,这一点尤其重要,因为任何时候都可能出现绘制循环。见Concurrency in Swing更多细节
  4. 你重写一个顶层容器(JFrame)的paint方法再破漆链...油漆是复杂的一系列链接在一​​起,产生最终结果的方法调用,你应该总是调用super.paint首先,但你可能知道,JFrame没有双缓冲。相反,您应该创建另一个类,它的范围从JPanel开始,并覆盖它的paintComponent方法来执行实际绘制(实际上,大部分它应该几乎取代当前JFrame正在执行的功能)... Swing组件是默认双缓冲...
  5. paint方法调用repaint ...这是一个坏消息,这将立即安排另一个绘画周期,这将变得如此之快,它会消耗您所有的CPU周期,直到您的电脑仍然静止
  6. 使用KeyListenerKeyListener因存在问题而臭名昭着,特别是,如果它注册到的组件是FOCUSABLE和HOCOCOC,它只会触发一个关键事件。 A JFrame由物理窗口JRootPane组成,该窗口包含内容窗格(以及其他一些组件),所有这些都可以影响实际获得焦点的框架。相反,使用前面提到的JPanel,使用键绑定API,这将允许控制触发键事件所需的焦点级别。见How to Use Key Bindings更多细节

你也应该看看......