Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.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 使图形在关键事件上移动_Java_Swing_Graphics_Timer_Keylistener - Fatal编程技术网

Java 使图形在关键事件上移动

Java 使图形在关键事件上移动,java,swing,graphics,timer,keylistener,Java,Swing,Graphics,Timer,Keylistener,我试着在按下“I,j,k,l”键(如箭头键)时做一个能够移动的圆圈,松开后停止。尝试创建一个计时器,以便在再次移动之前等待一秒钟,以便动画可以欣赏,但由于我创建了“while(!quit)”循环,因此没有图形移动或显示。你能指出我的错误吗 代码: 您的问题是关于Swing(而非AWT)的,因此: 不要扩展画布。相反,自定义绘制是通过扩展JPanel来完成的 不要覆盖绘制(…)。自定义绘制通过覆盖paintComponent(…)完成 不要使用计时器任务。而是使用一个摆动计时器 不要使用getGr

我试着在按下“I,j,k,l”键(如箭头键)时做一个能够移动的圆圈,松开后停止。尝试创建一个计时器,以便在再次移动之前等待一秒钟,以便动画可以欣赏,但由于我创建了“while(!quit)”循环,因此没有图形移动或显示。你能指出我的错误吗

代码:


您的问题是关于Swing(而非AWT)的,因此:

  • 不要扩展画布。相反,自定义绘制是通过扩展JPanel来完成的
  • 不要覆盖绘制(…)。自定义绘制通过覆盖paintComponent(…)完成
  • 不要使用计时器任务。而是使用一个摆动计时器
  • 不要使用getGraphics()方法。见第2点
  • 不调用更新(…)。您只需在组件上调用repaint(),它就会绘制iself
  • 不要使用while循环。这就是使用摆动计时器的原因
  • 不要以大写字符开头变量名。遵循Java命名约定
  • 不要使用KeyListener。Swing设计用于键绑定
  • 查看上的Swing教程,获取基本的绘画示例,以开始学习


    退房。
    键盘动画
    示例解决了许多问题。

    您的问题是关于Swing(而非AWT),因此:

  • 不要扩展画布。相反,自定义绘制是通过扩展JPanel来完成的
  • 不要覆盖绘制(…)。自定义绘制通过覆盖paintComponent(…)完成
  • 不要使用计时器任务。而是使用一个摆动计时器
  • 不要使用getGraphics()方法。见第2点
  • 不调用更新(…)。您只需在组件上调用repaint(),它就会绘制iself
  • 不要使用while循环。这就是使用摆动计时器的原因
  • 不要以大写字符开头变量名。遵循Java命名约定
  • 不要使用KeyListener。Swing设计用于键绑定
  • 查看上的Swing教程,获取基本的绘画示例,以开始学习


    退房。
    键盘动画
    示例解决了许多问题。

    而循环可能会消耗所有CPU。试着放一个
    线程。最后是sleep(16)
    。如果这不起作用,程序在运行时是否仍然有响应?根据camickr的回答,甚至不要使用while循环——使用Swing计时器。while循环可能会占用所有CPU。试着放一个
    线程。最后是sleep(16)
    。如果这不起作用,程序在运行时是否仍然有响应?根据camickr的回答,甚至不要使用while循环——使用Swing计时器。很抱歉回复了这么长时间。非常感谢你的回答,你提供的最后一个链接真的帮了我很多。很抱歉回复了这么长时间。非常感谢你的回答,你提供的最后一个链接真的帮了我很多。
    import java.awt.*;
    import java.awt.Color.*;
    import javax.swing.*;
    import java.awt.event.*;
    import java.util.Timer;
    import java.util.TimerTask;
    
    
    public class Event_test{
        public static void main(String args[])
        {
            boolean quit = false;
    
            JFrame Window = new JFrame("Event_test");
            MyCanvas WCanvas = new MyCanvas();
            KeyCatcher k = new KeyCatcher();
    
            WCanvas.addKeyListener(k);
    
    
            Window.getContentPane().add(WCanvas);
            Window.setSize(640, 360);
            Window.setVisible(true);
            Window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            new Notification(1);
    
            while(!quit)
            {
                WCanvas.update(WCanvas.getGraphics());
    
                if(!Notification.flag)
                {
                    continue;
                }
                else
                {
                    Notification.flag = false;
                    System.out.println("tic");
                    /*
                    CONTROLS:
                    */
    
                    if(KeyCatcher.KEYS[0])
                    {
                        MyCanvas.x--;
                    }
                    if(KeyCatcher.KEYS[1])
                    {
                        MyCanvas.y++;
                    }
                    if(KeyCatcher.KEYS[2])
                    {
                        MyCanvas.x++;
                    }
                    if(KeyCatcher.KEYS[3])
                    {
                        MyCanvas.y--;
                    }
                    if(KeyCatcher.KEYS[4])
                    {
                        quit = true;
                    }
    
                    new Notification(1);
                }
    
    
            }
        }
    }
    
    class MyCanvas extends Canvas
    {
        static int x, y;
    
        public void paint(Graphics g)
        {
            g = this.getGraphics();
            MyClass.drawSomething(g, x, y);
        }
    }
    
    class MyClass
    {
    
        public static void drawSomething(Graphics g, int x, int y)
        {
            g.setColor(Color.RED);
            g.drawOval(x, y, 10, 10);
        }
    }
    
    class KeyCatcher implements KeyListener
    {
    
        static boolean KEYS[] = new boolean[5];
    
    
        public void keyPressed(KeyEvent e)
        {
            if(e.getKeyChar() == 'j'/*IZQ*/)
            {
                KEYS[0] = true;
            }
    
            if(e.getKeyChar() == 'i'/*ARR*/)
            {
                KEYS[1] = true;
            }
    
            if(e.getKeyChar() == 'l'/*DER*/)
            {
                KEYS[2] = true;
            }
    
            if(e.getKeyChar() == 'k'/*ABA*/)
            {
                KEYS[3] = true;
            }
    
            if(e.getKeyChar() == 'q'/*QUIT*/)
            {
                KEYS[4] = true;
            }
        }
    
        public void keyReleased(KeyEvent e)
        {
            if(e.getKeyChar() == 'j'/*IZQ*/)
            {
                KEYS[0] = false;
            }
    
            if(e.getKeyChar() == 'i'/*ARR*/)
            {
                KEYS[1] = false;
            }
    
            if(e.getKeyChar() == 'l'/*DER*/)
            {
                KEYS[2] = false;
            }
    
            if(e.getKeyChar() == 'k'/*ABA*/)
            {
                KEYS[3] = false;
            }
    
            if(e.getKeyChar() == 'q'/*QUIT*/)
            {
                KEYS[4] = false;
            }
        }
    
        public void keyTyped(KeyEvent e){
    
        }
    }
    
    class Notification{
        static boolean flag = false;
        Timer timer;
    
        Notification(int seconds)
        {
            timer = new Timer();
            timer.schedule(new Task(), seconds*1000);
        }
    
        class Task extends TimerTask
        {
            public void run()
            {
                //What task does:
                flag = true;
                timer.cancel();
            }
        }
    
    }