2014-11-08 2 views
0

Я пытаюсь написать программу, которая позволяет пользователю перемещать фигуру с помощью клавиш со стрелками и менять цвет с помощью клавиши ввода. Мне ничего не учили графические интерфейсы или программирование на основе событий, так что это мой первый опыт в этом. Я думаю, что я понимаю основы этого, но мне трудно только закончить синтаксис, чтобы все работало. Учебники, которые я нахожу в Интернете, используют таймеры, которые я не использую. Вот мой текущий код:Перемещение фигур с помощью KeyListener в Java

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

public class Lab15Panel extends JPanel 
{ 
    Color[] colors = new Color[]{Color.blue, Color.green, Color.red, Color.orange, Color.yellow}; 
    int initialX = 90; 
    int initialY = 80; 

public void paintComponent(Graphics g) 
{ 
    super.paintComponent(g); 

    g.setColor(colors[0]); 


    g.fillRect(initialX, initialY, 100, 100); 


    Lab15Key listen = new Lab15Key(); 

} 

private class Lab15Key implements KeyListener 
{ 
    @Override 
    public void keyTyped(KeyEvent event) 
    { 
     if (event.getKeyChar() == KeyEvent.VK_LEFT) 
     { 
      initialX++; 
     } 
    } 

    @Override 
    public void keyReleased(KeyEvent event) 
    {} 

    @Override 
    public void keyPressed(KeyEvent event) 
    {} 
} 

}

Я делаю свой кадр в другом классе. Сейчас я не уверен в двух вещах: 1. Как использовать addKeyListener с заполненной формой? Есть ли способ ссылаться на заполненную форму? 2. Является ли моя идея «перемещать» форму правильно? То есть, создавая переменные за пределами методов для расположения фигуры, а затем используя мои KeyEvents для изменения этих чисел? Или форма не будет перемещена в этом случае? (Примечание. Я только написал код для события ключа вверх.)

Любая помощь, которую вы можете мне дать, будет оценена по достоинству. Я определенно новичок в Java, и я просто пытаюсь понять эти основные понятия, но ресурсы, которые у меня есть, не помогают.

+0

Упс! Я так часто возился с кодом, что забыл изменить его. Он должен читать g.fillRect (intialX, initialY, 100, 100); Я только что отредактировал его. –

ответ

0

Вам нужно добавить KeyListener на свою панель, чтобы заставить его прослушивать нажатия клавиш. Это называется регистрацией слушателя. Я бы поставил его в конструкторе:

public Lab15Panel() 
{ 
    Lab15Key listen = new Lab15Key(); 
    this.addKeyListener(listen); 
} 

Без этого шага, вы создаете слушателя, но это не имеет никого, чтобы сказать, когда он слышит что-то.

Если вы просто хотите, чтобы ваша панель, чтобы перекрасить каждый раз, когда ключ получает нажата, то вы могли бы сделать что-то подобное в вашем KeyListener:

@Override 
public void keyTyped(KeyEvent event) 
{ 
    if (event.getKeyChar() == KeyEvent.VK_LEFT) 
    { 
     initialX++; 
    } 
    Lab15Panel.this.repaint(); // Calls repaint on the instance of the enclosing class 
} 
+0

Это также называется регистрацией слушателя. – BitNinja

+0

А, да. Спасибо @BitNinja, я добавил, что в. – gla3dr

+0

А, ладно - мне было интересно, где на самом деле это поставить. К сожалению, мой код все еще не работает. Я думаю, что это имеет какое-то отношение к моему методу перемещения фигуры, изменяя переменные, потому что я думаю, что, возможно, форма только нарисована один раз и должна каким-то образом перерисоваться. –

0

Есть целый ряд вопросов, работающих против вас ...

  1. вы не зарегистрированы KeyListener с компонентом, поэтому он никогда не будет получать ключевые события
  2. вы не перекрашивать панели при изменении состояния прямоугольника, помните, Swing использует алгоритм пассивной живописи, поэтому он только рисует интерфейс, когда он думает, что ему нужно. Вам нужно дать Swing подталкивание, позвонив по телефону repaint
  3. Ваш компонент не поддается фокусировке, а это значит, что даже если бы вы выполнили две другие вещи, вы, вероятно, все равно не сможете заставить его работать.

KeyListener боль, она будет срабатывать только компонента он присоединен фокусирующейся и имеет фокус, как правило, вы лучше использовать Key Bindings

См How to use key bindings для более подробной информации

+0

Я ценю ваш вход. К сожалению, я ограничился использованием KeyListener для этого назначения. Я ничего не знаю о фокусировке. Это простое решение? –

+0

Не совсем, есть соманины, которые могут украсть фокус. Начните с того, что компонент фокусируется (setFocusable (true)), используйте requestFocusInWindow, чтобы получить компонентный фокус. Возможно, вы захотите присоединить MouseListener и использовать mouseClicked и вызвать requestFocusInWindow – MadProgrammer

+0

Должны ли они быть в конструкторе? Я прошу прощения за все эти вопросы ... Я не знаком с почти всем, что вы только что сказали. –