Почему мой keyListener не работает при запуске потока? - PullRequest
0 голосов
/ 11 июля 2019

Я пытаюсь сделать автомобильную игру. Перед созданием потока монет мой keyListener отлично работает в главном потоке, но при запуске потока монет работает только добавленная кнопка (Coin), но не keyListener.

Как я могу запустить оба потока без проблем, пожалуйста, помогите?

  • Я создал основной класс для добавления движения игрока
  • Еще один класс потоков монет для создания любого количества монет во время выполнения.

// Мой код Java показан ниже [Eclips]

class Coin implements Runnable
{
    int coinX=120,coinY=0;
    JFrame frame;
    JLabel coin;
    JButton btn;
    Coin(JFrame frame)
    {
        this.frame=frame;
        btn=new JButton("COIN");
        //coin=new JLabel();
        //coin.setIcon(new ImageIcon("coin_view.png"));
        frame.add(btn);
    }

    public void run() {
        try {
            for (int i=0;i<300;i=i+5)
            {
                btn.setBounds(coinX,i,120,120);
                Thread.sleep(200);
            }
            //System.out.println("coin over");
        } catch (Exception e) {}

    }
}


public class Main extends JFrame implements KeyListener{

    JLabel enemy,player;
    JPanel panel;
    int playerXLoc=90,playerYLoc=470,playerWidth=120,playerHeight=120;
    int enemyXLoc=120;
    Main()
    {
        setLayout(null);
        player=new JLabel();
        player.setIcon(new ImageIcon("player_car.png"));

        setTitle("Score : 100 , Lifes : 3");

        player.setBounds(playerXLoc, playerYLoc, playerWidth, playerHeight);

        JLabel background = new JLabel(new ImageIcon("road.png"));

        Coin coinObj=new Coin(this);
        Thread startTherad=new Thread(coinObj);
        startTherad.start();

        addKeyListener(this);
        add(player);

        this.setSize(400,650);
        setVisible(true);
    }


    public static void main(String[] args) 
    {
        Main start=new Main();
    }
    @Override
    public void keyTyped(KeyEvent e) {  }

    public void keyPressed(KeyEvent e) {
        if(e.getKeyCode()==KeyEvent.VK_LEFT)
        {
            if(playerXLoc>90)
            {
                playerXLoc -=80;
                player.setBounds(playerXLoc, playerYLoc, playerWidth, playerHeight);
            }

        }
        if(e.getKeyCode()==KeyEvent.VK_RIGHT)
        {
            if(playerXLoc<250)
            {
                playerXLoc+=80;
                player.setBounds(playerXLoc, playerYLoc, playerWidth, playerHeight);
            }
        }
        System.out.println("new x: "+playerXLoc);
    }

    public void keyReleased(KeyEvent e) { }
}

Я хочу вывод как.

* Обе (игрок и монета) нити должны работать нормально с кейлистом.

...