@lidiya11

Как связать KeyListener с gui в java?

Я хочу сделать змейку на джаве, но у меня проблема с тем, что бы связать кнопки клавиатуры и движение графики. Я уже и так и сяк эти листенеры кручу, у меня в какой-то момент получилось, но почему-то когда я запустил повторно опять ничего не произошло(или это у меня глюки?). В общем надо заставить двигаться квадрат по экрану на WDSA. Помогите пожалуйста.
package com.company;
import javax.swing.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class Snake extends JComponent {
int x = 350;
int y = 350;
public MyPan drawPanel;
JFrame frame;

public void go() {
frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
drawPanel = new MyPan();
frame.getContentPane().add(drawPanel);
frame.setSize(700, 700);
frame.setVisible(true);
drawPanel=new MyPan();

frame.setFocusable(true);
frame.setFocusTraversalKeysEnabled(false);
System.out.print("начало ");
}
public void moveRight(){
x++;
System.out.print(" метод в пр раб ");
try {
Thread.sleep(20);
} catch (Exception e) {
e.printStackTrace();
}
}
public void moveLeft(){
x--;
try {
Thread.sleep(20);
} catch (Exception e) {
e.printStackTrace();
}
}
public void moveDown(){
y++;
try {
Thread.sleep(20);
} catch (Exception e) {
e.printStackTrace();
}
}
public void moveUp(){
y--;
try {
Thread.sleep(20);
} catch (Exception e) {
e.printStackTrace();
}
}
}

package com.company;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class MyPan extends JPanel {
Snake snake = new Snake();
Timer timer = new Timer(20,new MyKey());
public MyPan(){
timer.start();
addKeyListener(new MyKey());
setFocusable(true);
}
public void paint(Graphics g){
g.setColor(Color.BLACK);
g.fillRect(0, 0, 700, 700);
g.setColor(Color.DARK_GRAY);
g.fillRect(snake.x, snake.y, 50, 50);
}
public class MyKey extends KeyAdapter implements ActionListener{
@Override
public void keyPressed(KeyEvent e) {
System.out.print(" реагирует ");
if (e.getKeyCode() == KeyEvent.VK_D) {
snake.moveRight();
repaint();
}
if (e.getKeyCode() == KeyEvent.VK_W) {
snake.moveUp();
repaint();
}
if (e.getKeyCode() == KeyEvent.VK_A) {
snake.moveLeft();
repaint();
}
if (e.getKeyCode() == KeyEvent.VK_S) {
snake.moveDown();
repaint();
}
}
@Override
public void actionPerformed(ActionEvent e) {
}
}
}
package com.company;

public class Main {

public static void main(String[] args) {
Snake s = new Snake();
s.go();
}
}
  • Вопрос задан
  • 1408 просмотров
Решения вопроса 1
@Che_Bu_Rashka
наверное добавить лисенер на саму форму окна приложения, тогда событие будет обрабатываться во всех случаях, когда окно приложения активно.

frame.addKeyListener(new MyKey());

И нахрена там 2 раза создается
Snake s = new Snake();
в разных местах.

Сделал. Вот так работает

/src/application/Application.java
package application;

public class Application {

    public static Snake s;

    public static void main(String[] args) {
        s = new Snake();
        s.go();
    }
}


/src/application/Snake.java
package application;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import javax.swing.*;
import java.awt.event.KeyEvent;

public class Snake extends JComponent {

    int x = 350;
    int y = 350;
    public MyPan drawPanel;
    JFrame frame;
    Timer timer = new Timer(100, new MyKey());

    public void go() {
        frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        drawPanel = new MyPan(this);
        timer.start();
        frame.getContentPane().add(drawPanel);
        frame.setSize(700, 700);
        frame.setVisible(true);

        frame.setFocusable(true);
        frame.setFocusTraversalKeysEnabled(false);
        frame.addKeyListener(new MyKey());
        frame.setFocusable(true);
    }

    public void moveRight() {
        x += 10;
        try {
            Thread.sleep(20);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void moveLeft() {
        x -= 10;
        try {
            Thread.sleep(20);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void moveDown() {
        y += 10;
        try {
            Thread.sleep(20);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void moveUp() {
        y -= 10;
        try {
            Thread.sleep(20);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public class MyKey extends KeyAdapter implements ActionListener {

        @Override
        public void keyPressed(KeyEvent e) {
            if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
                moveRight();
            }
            if (e.getKeyCode() == KeyEvent.VK_UP) {
                moveUp();
            }
            if (e.getKeyCode() == KeyEvent.VK_LEFT) {
                moveLeft();
            }
            if (e.getKeyCode() == KeyEvent.VK_DOWN) {
                moveDown();
            }
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            drawPanel.repaint();
        }
    }
}


/src/application/MyPan.java
package application;

import javax.swing.*;
import java.awt.*;

public class MyPan extends JPanel {
    //  Snake snake = new Snake();

    private Snake s;

    public MyPan(Snake ss) {
        s = ss;
    }

    public void paint(Graphics g) {
        g.setColor(Color.BLACK);
        g.fillRect(0, 0, 700, 700);
        g.setColor(Color.GREEN);
        g.fillRoundRect(s.x, s.y, 50, 50, 40, 40); 
    }
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
20 нояб. 2024, в 18:14
5000 руб./за проект
20 нояб. 2024, в 17:49
5000 руб./за проект
20 нояб. 2024, в 17:34
20000 руб./за проект