【问题标题】:keylistener and runnable not workingkeylistener 和 runnable 不起作用
【发布时间】:2016-04-18 17:01:00
【问题描述】:

你能看出问题所在吗?线程运行良好,但砖块不想响应关键侦听器。我尝试测试keylistener 是否最终获得了一个事件,但它甚至没有执行system.out.println

import java.awt.*;//imports
import java.util.*;
import java.applet.*;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;

public class Start extends Applet implements Runnable, KeyListener// where i put the keylistener in
{

    DrawBackground dbg = new DrawBackground();
    Brick brick = new Brick();
    Thread gameLoop;

    public void init() {
        addKeyListener(this);// i add the key listener
    }

    public void start() {
        Thread gameLoop = new Thread(this);
        gameLoop.start();
    }

    public void run() {
        while (true) {

            brick.update(1);
            repaint();
            try {
                Thread.sleep(17);
            }
            catch (InterruptedException e) {
            }

        }
    }

    public void stop() {

    }

    public void paint(Graphics g)// with out any paint it works if im changing
                                 // somthing like a lable
    {
        dbg.paint(g, this);
        brick.paint(g, this);
    }

    public void keyPressed(KeyEvent e)// test to see if it works
    {
        System.out.println("why");
        if (e.getKeyCode() == 37) {
            brick.left();
        }
    }

    public void keyTyped(KeyEvent e) {
    }

    public void keyReleased(KeyEvent e) {

    }
}

这是我要移动的 Brick 类

import java.awt.*;
import java.util.*;
import java.applet.*;

public class Brick {

    public int dy = 40;
    public int yStart = -20;
    public int time = 0;
    public int dx = 0;
    public int xStart = 0;
    public int start = 1;

    public void paint(Graphics g, Start sp) {
        Dimension screenSize = sp.getSize();
        int sheight = screenSize.height;
        int swidth = screenSize.width;
        if (start == 1) {
            xStart = swidth - (int) (swidth / 2.5);
            start = 0;
        }
        int bWidth = swidth / 15;
        int bHeight = swidth / 15;
        int time = 0;
        g.setColor(Color.red);
        g.fillRect(xStart, yStart, bWidth, bHeight);
    }

    public void update(int x) {
        if (time == 60) {
            time = 0;
            yStart += dy;
        }
        else {
            time += x;
        }
    }

    public void left() {
        xStart -= dx;
    }
}

【问题讨论】:

  • 那个线程有必要吗?它有什么作用?
  • 是的,它使块向下移动
  • 它的俄罗斯方块是我准备制作的游戏
  • 我找不到问题
  • 我已经学习了你的 Start 课程并删除了一些不必要的东西,看看 KeyListener 是否真的在这里工作:gist.github.com/dshields1/7653136。这对我来说运行良好,并且 KeyListener 有效。如果它对您不起作用,那么您运行小程序的方式可能存在问题。如果它确实有效,您可以尝试逐段添加代码,看看是什么部分导致了问题。

标签: java keylistener runnable


【解决方案1】:

您似乎没有设置键盘焦点。见this question.

在添加 keyListener 后我一直使用setFocusable(true),它对我有用,但该问题的答案有更好的解决方案。

【讨论】:

  • 我尝试添加它,但它没有做任何事情,我在 jpanel 上做了 doin git
猜你喜欢
  • 2013-06-14
  • 1970-01-01
  • 1970-01-01
  • 2013-08-12
  • 1970-01-01
  • 1970-01-01
  • 2015-02-14
  • 2012-01-28
相关资源
最近更新 更多