在AWT忙着等待

时间:2013-10-08 09:08:04

标签: java graphics focus awt keylistener

这是我的问题。当我尝试处理KB事件时,我的程序什么都不做。有些人认为这是因为忙碌的等待(与主线程争斗的新线程)。我该如何解决?

public class GameCanvas extends Canvas {
    int myX = 250;
    int myY = 0;
    int speedValue = 15;
    int bottom = 480;

    GameCanvas() {
        addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent event) {
                switch (event.getKeyCode()) {
                    case KeyEvent.VK_LEFT:
                        if (myX > 5) myX -= 5;
                        break;
                    case KeyEvent.VK_RIGHT:
                        if (myX < 480) myX += 5;
                        break;
                }
                repaint();
            }
        });

        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    setGameSpeed(speedValue);
                    if (myY < bottom) {
                        myY += 5;
                    } else {
                        bottom -= 20;
                        myY = 0;
                    }
                    repaint();
                }
            }
        }).start();
    }

    public void setGameSpeed(int value) {
        try {
            sleep(value);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void paint(Graphics g) {
        g.setColor(Color.darkGray);
        g.fillRect(myX, myY - 5, 25, 25);
        buildGameBottom(g);
    }

    void buildGameBottom(Graphics g){
        g.setColor(Color.WHITE);
        g.fillRect(0, bottom + 20, 500, bottom + 20);
    }

    public static void main(String[] args) throws InterruptedException {
        JFrame frame = new JFrame();
        GameCanvas gameCanvas = new GameCanvas();
        gameCanvas.setSize(new Dimension(500, 500));
        gameCanvas.setBackground(Color.LIGHT_GRAY);
        gameCanvas.requestFocus();
        frame.add(gameCanvas);
        frame.pack();
        frame.setResizable(false);
        frame.setVisible(true);
    }
}

1 个答案:

答案 0 :(得分:2)

这里的问题不是忙着等待(你这里没有忙着等待)。

唯一的问题是KeyListener已连接到Canvas,但Frame具有输入焦点。尝试点击Canvas即可。

此外,如果您正在使用重绘循环,则无需在KeyListener中调用重绘。

并且,请使用SwingUtilities.invokeLater从不同的线程调用Swing / AWT函数。

在将框架设置为可见之后移动requestFocus调用可以解决您的问题(因为您无法提供尚未显示的焦点)。