圈不动

时间:2014-10-30 23:32:18

标签: java

没有错误,但是当我按下任何按钮时,我的椭圆/圆圈根本不移动?有人可以帮忙吗?我一直在查看代码大约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 个答案:

答案 0 :(得分:2)

  1. 您永远不会在repaint方法
  2. 中致电Move
  3. Thread t1 = new Thread();不会做太多,因为它永远不会调用任何可运行的代码,事实上它几乎会立即启动和终止,但是...... ...
  4. Swing不是线程安全的,你不应该在事件调度线程之外修改UI或UI所依赖的任何东西,这一点尤为重要,因为绘制周期可能随时发生。有关详细信息,请参阅Concurrency in Swing
  5. 你覆盖顶级容器的paint方法(JFrame),然后打破画颜链... paint是复杂的一系列方法调用链接在一起产生最终结果,你应该始终先调用super.paint,但正如您可能知道的那样,JFrame不是双缓冲的。因此,您应该创建另一个从JPanel扩展的类并覆盖它的paintComponent方法来执行实际绘制(事实上,在大多数情况下,它应该几乎取代功能当前JFrame正在做什么)...默认情况下,Swing组件是双缓冲的......
  6. repaint方法中调用paint ...这是个坏消息,这将立即安排另一个绘制周期,这会变得如此之快,以至于它消耗所有CPU周期,直到您的计算机静止不动
  7. 使用KeyListenerKeyListener因出现问题而臭名昭着,特别是如果它注册的组件是FOCUSABLE且HAS FOCUS,它只会触发一个关键事件。 JFrame由物理窗口JRootPane组成,其中包含内容窗格(以及一些其他组件),所有这些都可能妨碍实际获得焦点的帧。相反,使用前面提到的JPanel,使用键绑定API,它将允许控制触发键事件所需的焦点级别。有关详细信息,请参阅How to Use Key Bindings
  8. 您还应该看看......