Member 13474025 Ответов: 0

Функция Keylistener не работает, и когда я нажимаю клавиши со стрелками, ничего не происходит.


Этот файл является BrickBreaker.java, главный файл.

import javax.swing.JFrame;		/*necessary to add a obj in which game will run.*/
public class BrickBreaker
{
	public static void main(String[] args)
	{
		JFrame obj=new JFrame();
		GamePlay gp=new GamePlay();
		obj.setSize(700,600);		//750,560
		obj.setTitle("Generic Classic BrickBreaker");
		obj.setResizable(true);
		obj.setVisible(true);
		obj.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		obj.add(gp);
	}
}


Ниже приведен второй файл GamePlay.java
import javax.swing.JPanel;									//Lets you create GUI components like buttons,scroll bars,etc.
import javax.swing.Timer;
import java.awt.event.KeyListener;							//detect key presses*/
import java.awt.event.ActionListener;						//performing actions on objects of game*/
import java.awt.event.ActionEvent;							//awt is Abstract Window Toolkit, used to develop GUI
import java.awt.event.KeyEvent;
import java.awt.Graphics;
import java.awt.Color;

public class GamePlay extends JPanel implements KeyListener, ActionListener
{
	boolean play=true;										//so that game doesn't start by itself
	int score=0;											//the methods from KeyListener and ActionListener 
	int totalBricks=21;										//listed here are compulsory for the code to run
	Timer time;												//Timer is a module, allows timecheck
	int delay=8;											//speed of timer
	int playerX=310;										//starting for slider
	int ballX=120;											//starting X co-ord of ball
	int ballY=350;											//starting Y co-ord of ball
	int ballXdir=-1;										//direction of ball?
	int ballYdir=-2;

	public static void main(String[] args){}

	public void GamePlay()									//Constructor:(Similar to a method)Block of code, that's called when an
	{														//instance of the method is created.
		this.addKeyListener(this);							//to work with KL, need this statement
		setFocusable(true);									//allows object to be focused.
		setFocusTraversalKeysEnabled(false);				//allows keys to be used
		time = new Timer(delay, this);						//initialize timer
		time.start();
	}

	public void paint(Graphics g)
	{
		//background details
		g.setColor(Color.black);
		g.fillRect(1,1,692,592);

		//borders
		g.setColor(Color.blue);
		g.fillRect(0,0,3,592);
		g.fillRect(0,0,692,3);
		g.fillRect(691,0,3,592);

		//user bar
		g.setColor(Color.blue);
		g.fillRect(playerX,550,100,8);

		//ball
		g.setColor(Color.green);
		g.fillOval(ballX,ballY,10,10);

		g.dispose();
	}

	@Override
	public void actionPerformed(ActionEvent e){				//method from ActionListener
		time.start();
	}

	@Override
	public void keyTyped(KeyEvent e){						//method from KeyListener
		repaint();
	}					

	@Override
	public void keyReleased(KeyEvent e){}					//method from KeyListener

	@Override
	public void keyPressed(KeyEvent e)						//method from KeyListener
	{
		if(e.getKeyCode() == KeyEvent.VK_RIGHT)
		{
			if(playerX>=600)
			{
				playerX=600;
			}
			else
			{
				moveRight();
			}
		}

		if(e.getKeyCode() == KeyEvent.VK_LEFT)
		{
			if(playerX<10)
			{
				playerX=10;
			}
			else
			{
				moveLeft();
			}
		}

		repaint();
	}

	public void moveRight()
	{
		play = true;									//need to change as it was set to false initially
		playerX+=100;									//when right key is pressed, move 20 pixels to the right
	}

	public void moveLeft()
	{
		play = true;									//need to change as it was set to false initially
		playerX-=100;									//when right key is pressed, move 20 pixels to the right
	}
}


Что я уже пробовал:

Я перепробовал множество комбинаций и различных вариантов размещения моей функции repaint (). Я также попытался внести изменения в time.start() или таймер в целом. Я подумал, что, возможно, это и было причиной проблемы. Это игра BrickBreaker, я изучаю Java. Ползунок не двигается, когда я нажимаю клавиши со стрелками, и я, кажется, не могу понять, что не так. Я также проверил, обновляю ли я переменные записи, и думаю, что да. Пожалуйста, помогите мне, это сводит меня с ума.

Richard MacCutchan

Пожалуйста, отредактируйте свой вопрос и объясните, в чем проблема. И пожалуйста, не кричите, т. е. печатайте заглавными буквами, так как это считается грубостью.

Member 13474025

Мне очень жаль :) Я исправил то, что я пробовал часть, не могли бы вы помочь мне, пожалуйста?

Richard MacCutchan

В вашем коде чего - то не хватает- он никогда не запускается.

Member 13474025

У меня уже было это в моем коде, то, что я думаю, вы имеете в виду .. Я упомянул, что у меня есть JFrame. Я просто добавил его сюда. Будьте добры, взгляните.

Richard MacCutchan

Ладно, я не совсем понимаю, что происходит, но ни одно из ваших ключевых событий обработки не срабатывает. Взгляните на пример кода по адресу Пример Кода Java Tutorials[^] чтобы увидеть, что вы можете делать по-другому.

Member 13474025

Ладно, я обязательно посмотрю. Но, пожалуйста, позвольте мне немного объяснить эту вещь.
Всякий раз, когда я нажимаю клавишу, ползунок должен двигаться, шарик должен двигаться. Поэтому холст нужно перекрасить, чтобы показать движение. Проблема с моим кодом заключается в том, что либо холст не перекрашивается, потому что я неоднократно вызываю свою функцию repaint() в неправильном положении, либо мои ключи не улавливаются моим Java-кодом.
В последнем случае я не совсем понимаю, почему это происходит.
Кроме того, изменения координат, которые я делаю, не настолько малы, чтобы даже если доска движется, я не мог бы ее увидеть.

Richard MacCutchan

Я знаю, что должен делать код, и, насколько это возможно, он выглядит логически правильным. Единственная проблема заключается в том, что ваши события keylistener не принимаются в вашей программе. Это должно быть как-то связано с тем, как вы создали свой JFrame, но я не эксперт в программировании JAVA GUI, поэтому не могу понять, что не так. Я добавил несколько операторов печати, чтобы проверить его, и единственный, который вышел, был из вашего метода рисования.

Member 13474025

Так что же, по-вашему, происходит не так? Какие выводы вы могли бы сделать из печатных заявлений и их результатов?
Кроме того, если вы знаете кого-то, потому что я новичок на этом сайте, не могли бы вы порекомендовать кому-то взглянуть на эту проблему?

Richard MacCutchan

Я уже объяснял, что не уверен, что это неправильно. Но очевидно, что что-то в структуре вашего кода препятствует отправке ключевых событий вашим обработчикам событий. Вам нужно перейти к документации и изучить правила, а также некоторые примеры кода.

У нас нет группы экспертов, к которым вы можете обратиться для исправления вашего кода. Каждый здесь предлагает свою помощь в свое время и бесплатно для вас, и никаких гарантий обслуживания не дается. Если никто не приходит с решением, то вы должны попробовать другие вещи сами.

ThilinaMD

Вместо VK_RIGHT и VK_LEFT попробуйте использовать фактический код ключа 39 и 37. evt.getKeyEvent==39

0 Ответов