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