Движение объекта (квадрата) по экрану, управление клавишами-стрелками и WASD - Java
Формулировка задачи:
Всем доброго времени суток! Всё, что нужно от программы: двигать квадрат размером 20*20 кв. пикселей клавишами вверх-влево-вниз-вправо, а так же клавишами WASD. И от того, нажата ли Shift одновременно с вышеназванными клавишами, зависит длина шага этого квадрата. Проблема в том, что фигура отрисовывается нормально, и прога никаких ошибок в консоль не выводит, но квадрат не реагирует на клавиши. Вообще. Тупо стоит на месте. Скорее всего (на мой взгляд), проблема связана с фокусом, да вот сам не разбираюсь ещё в таких вещах, поэтому могу ошибиться. Подскажите, что не так?
Вот код:
P.S. Потоки и исключения ещё не учил, а потому хочу реализовать данную программу с минимум необходимых знаний. Конечно, если это получится. В противном случае - пните по нужным темам для изучения.
И да, каково качество исполнения схемы MVC?
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Toolkit;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.geom.Rectangle2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class SwingSquareMoving {
public static void main(String[] args) {
SwingSquareMovingFrame frame=new SwingSquareMovingFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
class SwingSquareMovingFrame extends JFrame {
SwingSquareMovingFrame() {
int screenWidth=Toolkit.getDefaultToolkit().getScreenSize().width;
int screenHeight=Toolkit.getDefaultToolkit().getScreenSize().height;
setLocation(screenWidth/6, screenHeight/6);
setSize((screenWidth*2)/3, (screenHeight*2)/3);
setTitle("Square Moving Test Program");
setContentPane(new SquareView());
}
}
class SquareModel {
SquareModel(int squareX, int squareY, int squareSide) {
x=squareX;
y=squareY;
side=squareSide;
}
public Rectangle2D createSquare() {
return new Rectangle2D.Float((float)x, (float)y, (float)side, (float)side);
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public int getSide() {
return side;
}
public void setX(int inputX) {
x=inputX;
}
public void setY(int inputY) {
y=inputY;
}
public void setSide(int inputSide) {
side=inputSide;
}
private int x;
private int y;
private int side;
}
class SquareView extends JPanel {
SquareView() {
data=new SquareModel(INITIAL_X, INITIAL_Y, SQUARE_SIDE);
square=data.createSquare();
addKeyListener(new SquareController());
setFocusable(true);
}
public void moveSquare(int dx, int dy) {
data.setX(data.getX()+dx);
data.setY(data.getY()+dy);
square=data.createSquare();
repaint();
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2=(Graphics2D)g;
g2.setPaint(Color.BLUE);
g2.fill(square);
}
private SquareModel data;
private Rectangle2D square;
public static final int INITIAL_X=100;
public static final int INITIAL_Y=100;
public static final int SQUARE_SIDE=20;
private class SquareController extends KeyAdapter {
public void KeyPressed(KeyEvent event) {
int keyCode=event.getKeyCode();
int d;
if(event.isShiftDown()) d=STEP_INCREMENT;
else d=PIXEL_INCREMENT;
if(keyCode==KeyEvent.VK_LEFT) moveSquare(-d, 0);
else if(keyCode==KeyEvent.VK_RIGHT) moveSquare(d, 0);
else if(keyCode==KeyEvent.VK_UP) moveSquare(0, -d);
else if(keyCode==KeyEvent.VK_DOWN) moveSquare(0, d);
}
public void KeyTyped(KeyEvent event) {
char keyChar=event.getKeyChar();
int d;
if(Character.isUpperCase(keyChar)) {
d=STEP_INCREMENT;
keyChar=Character.toLowerCase(keyChar);
} else {
d=PIXEL_INCREMENT;
}
if(keyChar=='a' || keyChar=='ф') moveSquare(-d, 0);
else if(keyChar=='d' || keyChar=='в') moveSquare(d, 0);
else if(keyChar=='w' || keyChar=='ц') moveSquare(0, -d);
else if(keyChar=='s' || keyChar=='ы'|| keyChar=='і') moveSquare(0, d);
}
public static final int PIXEL_INCREMENT=1;
public static final int STEP_INCREMENT=SQUARE_SIDE;
}
}Решение задачи: «Движение объекта (квадрата) по экрану, управление клавишами-стрелками и WASD»
textual
Листинг программы
package easybudda.movingsquare;
import javax.swing.SwingUtilities;
import javax.swing.JFrame;
public class MovingSquare {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frm = new JFrame("Moving Square");
frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frm.add(new PaintPanel());
frm.pack();
frm.setVisible(true);
}
});
}
}