Движение объекта (квадрата) по экрану, управление клавишами-стрелками и 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);
- }
- });
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д