Почему, когда я запускаю свой код, панель открывается, но никогда не достигает функции actionPerformedJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Гость
 Почему, когда я запускаю свой код, панель открывается, но никогда не достигает функции actionPerformed

Сообщение Гость »


Панельный вид моей игры 2048Я пытаюсь создать игру 2048. Я сделал терминальную версию, чтобы проверить логику игры, и вроде все работает. Теперь я добавил класс GameFrame и GamePanel. Моя цель — иметь возможность нажимать на клавиши со стрелками, чтобы перемещать плитки в нужном направлении. Моя текущая проблема заключается в том, что при запуске моего кода он никогда не достигает моей функции actionPerformed. Я использую очередь блокировки, чтобы дождаться, пока пользователь примет решение о своем следующем шаге. При запуске моего кода появляется панель с двумя начальными плитками (как и должно быть), но когда я нажимаю на любую стрелку, ничего не меняется. С помощью оператора печати я вижу, что он не достигает функции actionPerformed, но я не понимаю, почему. Насколько я понимаю, эта функция должна запускаться каждые 75 миллисекунд (это я выбрал DELAY), и у меня есть setFocusable(true), поэтому я думаю, что она должна прослушивать события клавиатуры. В другом посте я читал о подобной проблеме, и там говорилось, что нужно использовать addActionListener, но я не уверен, куда мне его добавить, если мне этого не хватает. Любая помощь приветствуется! Я добавлю все классы GamePanel, GameFrame и основные:
import java.awt.*; импортировать java.awt.event.*; импортировать javax.swing.*; импортировать java.util.Random; импортировать java.util.concurrent.BlockingQueue; импортировать java.util.concurrent.LinkedBlockingQueue; публичный класс GamePanel расширяет JPanel и реализует ActionListener { статический финал int SCREEN_WIDTH = 600; статический финал int SCREEN_HEIGHT = 600; статический финал int DELAY = 75; BlockingQueue очередь; таймер таймер; логическое значение = ложь; Случайный случайный; Доска сетка; ГеймПанель(){ случайный = новый случайный (); this.setPreferredSize(new Dimension(SCREEN_WIDTH, SCREEN_HEIGHT)); this.setBackground(Color.white); this.setFocusable(истина); this.queue = новая LinkedBlockingQueue(); this.addKeyListener(новый MyKeyAdapter()); начать игру(); } общественная недействительность startGame(){ сетка = новая доска(); сетка.newTile(); сетка.newTile(); работает = правда; таймер = новый таймер (ЗАДЕРЖКА, это); таймер.старт(); System.out.println("игра началась"); } @Override protected void PaintComponent(Graphics g) { супер.paintComponent(г); Graphics2D g2d = (Graphics2D) g; int tileSize = SCREEN_WIDTH/this.grid.SIZE; // Рассчитываем размер плитки на основе размера панели и размера платы for (int row = 0; row < this.grid.SIZE; row++) { for (int col = 0; col < this.grid.SIZE; col++) { int x = col * tileSize; int y = строка * tileSize; g2d.drawRect(x, y, tileSize, tileSize); } } for (int row = 0; row < this.grid.SIZE; row++) { for (int col = 0; col < this.grid.SIZE; col++) { int x = col * tileSize; int y = строка * tileSize; Плитка плитка = Grid.board[строка][столбец]; если (плитка != ноль) { g2d.setColor(tile.getColor()); g2d.fillRect(x, y, tileSize, tileSize); g2d.setColor(Цвет.ЧЕРНЫЙ); g2d.drawString(String.valueOf(tile.getValue()), x + tileSize/2, y + tileSize/2); } } } } @Override общественный недействительный actionPerformed (ActionEvent e) { пытаться{ логическое значение = Queue.take(); System.out.println("Я пытаюсь"); если (работает) { System.out.println("Работа верна"); сетка.переместить(); сетка.newTile(); если (!grid.gridHasSpace()) { //TODO Здесь обрабатывается игра, а не логика очередь.put(ложь); } } перекрасить(); } поймать (InterruptedException e1){ //ДЕЛАТЬ } } публичный класс MyKeyAdapter расширяет KeyAdapter{ @Override общественный недействительный keyPressed (KeyEvent e) { переключатель (e.getKeyCode()) { случай KeyEvent.VK_LEFT: Grid.setDirection('L'); System.out.println("Нажата левая клавиша"); перерыв; случай KeyEvent.VK_RIGHT: Grid.setDirection('R'); перерыв; случай KeyEvent.VK_UP: Grid.setDirection('U'); перерыв; случай KeyEvent.VK_DOWN: Grid.setDirection('D'); перерыв; } пытаться { очередь.put(истина); } catch (InterruptedException e1) { // TODO Автоматически сгенерированный блок catch e1.printStackTrace(); } } } } импортировать javax.swing.JFrame; публичный класс GameFrame расширяет JFrame { Геймфрейм(){ this.add(новая GamePanel()); this.setTitle("Game2048"); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setResizable(ложь); этот.пакет(); this.setVisible(истина); this.setLocationRelativeTo(null); } } импортировать javax.swing.SwingUtilities; публичный класс Game2048 { public static void main(String[] args) { SwingUtilities.invokeLater(() -> {GameFrame gameFrame = new GameFrame();}); }
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»