gpt4 book ai didi

java - 让图形随着关键事件而移动

转载 作者:行者123 更新时间:2023-12-01 16:52:26 25 4
gpt4 key购买 nike

我试图制作一个圆圈,当按下“i,j,k,l”键(如箭头键)时能够移动,并在释放时停止。尝试创建一个计时器,以便在再次移动之前等待一秒钟,以便动画效果明显,但由于我创建了“while(!quit)”循环,因此没有图形移动或显示。您能指出我的错误吗?

代码:

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();
}
}

}

最佳答案

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

  1. 不要扩展 Canvas。相反,自定义绘画是通过扩展 JPanel 来完成的
  2. 不要覆盖paint(...)。自定义绘画是通过重写paintComponent(...)来完成的
  3. 不要使用 TimerTask。请改用 Swing 计时器。
  4. 不要使用 getGraphics() 方法。参见第 2 点。
  5. 不要调用 update(...)。您只需在组件上调用 repaint(),它就会自行绘制。
  6. 不要使用 while 循环。这就是使用 Swing Timer 的原因。
  7. 变量名不要以大写字符开头。遵循 Java 命名约定。
  8. 不要使用 KeyListener。 Swing 被设计为与键绑定(bind)一起使用。

查看 Custom Painting 上的 Swing 教程了解基本绘画示例以帮助您入门。

查看Motion Using the Keyboard键盘动画示例解决了其中许多问题。

关于java - 让图形随着关键事件而移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37354457/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com