Движении кнопки по нажатию клавиши

118
08 марта 2022, 19:30

такое задание у меня:

Обработайте стрелки на клавиатуре так, чтобы кнопка двигалась в сторону соответствующей нажатой клавише.

Обработал кнопки, но кнопка при первом нажатии стрелки отпрыгивает в верхний левый угол окна и далее при нажатии стрелок движется непонятно как и только на один шаг, хотелось бы по всему окну увидеть движение.

public class KeyboardEvent {
  public static void main(String[] args) {
    JFrame frame = new JFrame("клавиатура");
    frame.setBounds(0, 0,600,400);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JPanel panel = new JPanel();
    JButton button = new JButton("777");
    button.setBounds(250,150,100,30);
    button.setBackground(new Color(152,191,44));
    panel.add(button);
    panel.setLayout(null);
    frame.add(panel);
    button.addKeyListener(new KeyListener() {
      @Override
      public void keyTyped(KeyEvent e) {
      }
      @Override
      public void keyPressed(KeyEvent e) {
        int key = e.getKeyCode();
        if(key==37){
          int x = -10;
          button.setLocation(x--, 0);
          x--;
        }
        if(key==38) {
          int y = -10;
          button.setLocation(0,y);
          y--;
        }
        if(key==39) {
          int x = 10;
          button.setLocation(x, 0);
          x++;
        }
        if(key==40) {
          int y =10;
          button.setLocation(0, y);
          y++;
        }
      }
      @Override
      public void keyReleased(KeyEvent e) {
      }
    });
    frame.setVisible(true);
  }
}
Answer 1
  @Override
  public void keyPressed(KeyEvent e) {
    int key = e.getKeyCode();
    if(key==37){
        button.setLocation(button.getX() - 10, button.getY());
    }
    if(key==38) {
        button.setLocation(button.getX(), button.getY() - 10);
    }
    if(key==39) {
        button.setLocation(button.getX() + 10, button.getY());
    }
    if(key==40) {
        button.setLocation(button.getX(), button.getY() + 10);
    }
  }
Answer 2

Проблема в том, что вы задаёте абсолютные значения кнопки всякий раз когда нажимаете на неё, значение x и y всегда перезаписывается одним и тем же значением, вам нужно взять текущую позцию кнопки, а только затем вычислять следующую позицию.

public class KeyboardEvent {
  public static void main(String[] args) {
    JFrame frame = new JFrame("клавиатура");
    frame.setBounds(0, 0, 600, 400);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JPanel panel = new JPanel();
    JButton button = new JButton("777");
    button.setBounds(250, 150, 100, 30);
    button.setBackground(new Color(152, 191, 44));
    panel.add(button);
    panel.setLayout(null);
    frame.add(panel);
    button.addKeyListener(new KeyListener() {
      @Override
      public void keyTyped(KeyEvent e) {
      }
      @Override
      public void keyPressed(KeyEvent e) {
        int key = e.getKeyCode();
        int x = button.getX();
        int y = button.getY();
        switch (key){
          case KeyEvent.VK_LEFT:
            button.setLocation(x-1, y);
            break;
          case KeyEvent.VK_UP:
            button.setLocation(x, y-1);
            break;
          case KeyEvent.VK_RIGHT:
            button.setLocation(x+1, y);
            break;
          case KeyEvent.VK_DOWN:
            button.setLocation(x, y+1);
            break;
          default:
            //do nothing
        }
      }
      @Override
      public void keyReleased(KeyEvent e) {
      }
    });
    frame.setVisible(true);
  }
}
READ ALSO
Notification не отображает картинку

Notification не отображает картинку

Notification уведомление не на всех телефона подтягивает картинкуиспользую

115
Как повернуть часть SVG элемента с помощью CSS?

Как повернуть часть SVG элемента с помощью CSS?

Я хочу повернуть только часть SVGНапример, колеса велосипеда с помощью transform: rotate()

176
Проблема с отступами css

Проблема с отступами css

В одном браузере вид чата вот такой: картинка #1Хотя должен быть как на картинке #2

135
задание параметров в метод

задание параметров в метод

существует метод со своими условиями

159