【问题标题】:Java Applet - Moving a ball over the screenJava Applet - 在屏幕上移动球
【发布时间】:2012-01-17 06:41:55
【问题描述】:

好的,我如何使用 Applet 从键盘移动球?

到目前为止,我有这段代码,它什么也没做。

import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class KeyboardGame extends Applet implements KeyListener
{

    private static final long serialVersionUID = 1L;
    private static boolean keyboadrRightPressed = false;

    public void init()
    {
         addKeyListener(this);
    }

    public void keyPressed(KeyEvent e) 
    {
        int keyCode = e.getKeyCode();
        if(keyCode == KeyEvent.VK_RIGHT)
        {
            keyboadrRightPressed = true;
        }
        else
        {
            keyboadrRightPressed = false;
        }
    }

    public void keyReleased(KeyEvent e) {

    }

    public void keyTyped(KeyEvent e) {
    }

    public void paint(Graphics g)
    {
        g.fillOval(20,20,20,20);
        g.drawString("String :"+keyboadrRightPressed,20,30);
    }

}

而且我还必须了解它是如何工作的。我不明白为什么我的动作监听器不起作用,我需要一个

while(true)

还是线程?

【问题讨论】:

    标签: java applet


    【解决方案1】:

    您的动作侦听器实际上可能工作正常,但是您需要在按下键时重新绘制小程序,以便您的字符串实际出现。尝试将 keyPressed 更改为:

    public void keyPressed(KeyEvent e) 
    {
        int keyCode = e.getKeyCode();
        if(keyCode == KeyEvent.VK_RIGHT)
        {
            keyboadrRightPressed = true;
        }
        else
        {
            keyboadrRightPressed = false;
        }
        repaint();
    }
    

    实际移动球会因您希望球的实际移动方式而异。我猜你希望它在按住键的同时继续向右移动,所以我要做的是实现一个计时器或其他形式的线程,每隔 0.25 秒(或你想要的时间)检查一次 keyboardRightPressed 并会如果它是真的,将球向右移动。然后在代码的 keyReleased 部分中,您还应该添加逻辑以在您松开按键时将 keyboardRightPressed 设置回 false。

    【讨论】:

    • 我这样做了,我实际上看到它在开始时有一点点,球移动 1 个像素并等待 0.5 秒直到连续移动,我应该使用线程来解决我的问题吗?
    • 那里的暂停是因为键盘事件的工作方式。当您考虑在文本编辑器中输入时,如果您按住“a”键,它将输入一个 a,暂停片刻,然后开始添加一堆 a。所以是的,我会使用一个可以以一致的时间间隔执行的线程,这样你就不会得到那么小的延迟。您还需要将 repaint() 函数调用移动到实际移动球的线程中,以便在移动球时而不是在检测到按键时重新绘制。
    • 好的,我做了很多事情,包括线程一,但我不知道如何从键盘平滑地在屏幕上移动球,它有那个延迟......
    • 所以在 keyPressed 中你有一些类似的东西: if(keyCode == KeyEvent.VK_RIGHT) { keyboadrRightPressed = true;在 keyReleased 你有类似的东西: if(keyCode == KeyEvent.VK_RIGHT) { keyboadrRightPressed = false;在线程中你有类似的东西: while (true) { if (keyboadrRightPressed == true) { ball.x+=5;重绘(); } 线程.sleep(250); } 这就是你所拥有的吗?
    • 是的,这些是 Main.java text-upload.com/read.php?id=265553&c=8441812 和 KeyThread.java text-upload.com/read.php?id=265557&c=1157960 的代码,如果你能修复它们,我会非常感谢你
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-21
    相关资源
    最近更新 更多