【问题标题】:Busy waiting in AWT在 AWT 中忙于等待
【发布时间】:2013-10-15 03:02:51
【问题描述】:

这是我的问题。当我尝试处理 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);
    }
}

【问题讨论】:

    标签: java graphics focus awt keylistener


    【解决方案1】:

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

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

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

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

    在将框架设置为可见后将 requestFocus 调用移动到应该可以解决您的问题(因为您不能将焦点放在尚不可见的东西上)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-08
      • 1970-01-01
      • 2013-09-29
      • 2015-07-04
      • 2015-03-13
      相关资源
      最近更新 更多