Овальная движущаяся программа.Овал не двигается, что-нибудь я могу уточнить здесь? - PullRequest
0 голосов
/ 12 декабря 2018

Мне нужна небольшая помощь с моим кодом прямо здесь.Я прошел через процесс создания события клавиатуры, чтобы переместить овал вниз, если я нажимаю клавишу со стрелкой вниз, вверх, если я нажимаю клавишу со стрелкой вверх, и так далее.Однако я не смог этого сделать.Есть что-нибудь, что я могу уточнить из моего кода здесь?Также планируем реализовать это тоже двумя кнопками, Right Translation и Left Translation здесь.

Заранее спасибо! Вот пример пользовательского интерфейса, который я сделал до сих пор.

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

public class page309_4 extends JFrame { //implements ActionListener 
    private JButton btnLeftMvmt, btnRightMvmt;
    int oval_x = 150;
    int oval_y = 150;

    public page309_4(){
        setTitle("Oval Mover");
        setSize(600, 150);
        setLayout(new BorderLayout());
        JPanel panel1, panel2;

        panel1 = new JPanel();
        panel2 = new JPanel();

        panel1.setSize(500,300);
        panel1.add(new MyPanel());
        panel1.addKeyListener(new KeyAdapter(){
            public void keyPressed(KeyEvent e) {
            int keycode = e.getKeyCode();
            switch (keycode) {
            case KeyEvent.VK_UP:  oval_y += 10; break; 
            case KeyEvent.VK_DOWN: oval_y -= 10; break;
            case KeyEvent.VK_LEFT: oval_x -= 10; break;
            case KeyEvent.VK_RIGHT: oval_x += 10; break;
            }
            }
        });
        panel1.setBackground(Color.YELLOW);

        btnLeftMvmt = new JButton("Left Translation");
        btnRightMvmt = new JButton("Right Translation");
        btnLeftMvmt.addActionListener(bleft -> {


        });
        btnRightMvmt.addActionListener(bright -> {


        });


        panel2.add(btnLeftMvmt);
        panel2.add(btnRightMvmt);


        add(panel1);
        add(panel2, BorderLayout.SOUTH);
        pack();
        setLocationRelativeTo(null);
        setVisible(true);

    }

    class MyPanel extends JPanel {

        public MyPanel() {
            setPreferredSize(new Dimension(600, 150));
        }

    @Override
    public void paintComponent(Graphics g) {
            super.paintComponents(g);
            g.setColor(Color.RED); 
            int oval_x = (getWidth() - 150) / 2;
            int oval_y = (getHeight() - 150) / 2;
            g.fillOval(oval_x, oval_y, 150, 150);
        }
    }   

    public static void main (String[] args) {
        // TODO Auto-generated method stub
        page309_4 f = new page309_4();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

}

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Давайте начнем с ...

@Override
public void paintComponent(Graphics g) {
        super.paintComponents(g);
        g.setColor(Color.RED); 
        int oval_x = (getWidth() - 150) / 2;
        int oval_y = (getHeight() - 150) / 2;
        g.fillOval(oval_x, oval_y, 150, 150);
    }
}   

Позиция x / y определяется внутри метода, поэтому она никогда не изменится, независимо от того, что вы делаете.

Сказав, что, MyPanel должен отвечать за непосредственное управление позицией x / y, это означает, что в ней должны быть определены переменные oval_x и oval_y.Затем вы должны определить функциональность, которая может изменять эти значения, например ...

  class MyPanel extends JPanel {

    private int oval_x = 150;
    private int oval_y = 150;

    public MyPanel() {
    }

    @Override
    public Dimension getPreferredSize() {
      return new Dimension(600, 150);
    }

    public void moveVerticallyBy(int delta) {
      oval_y += delta;
      repaint();
    }

    public void moveHorizontallyBy(int delta) {
      oval_x += delta;
      repaint();
    }

    @Override
    protected void paintComponent(Graphics g) {
      super.paintComponents(g);
      g.setColor(Color.RED);
      g.fillOval(oval_x, oval_y, 150, 150);
    }
  }

Это базовая концепция инкапсуляции

Далее, я настоятельно рекомендую использовать привязки клавиш API более KeyListener, поскольку он решит проблемы, связанные с фокусом.

Например ...

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;

public class Page309_4 extends JFrame { //implements ActionListener 

  private JButton btnLeftMvmt, btnRightMvmt;
  private MyPanel myPanel;

  public Page309_4() {
    setTitle("Oval Mover");
    setSize(600, 150);
    setLayout(new BorderLayout());
    JPanel panel1, panel2;

    panel2 = new JPanel();

    myPanel = new MyPanel();
    InputMap im = myPanel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
    ActionMap am = myPanel.getActionMap();

    im.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), "Pressed.up");
    im.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0), "Pressed.down");
    im.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0), "Pressed.left");
    im.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), "Pressed.right");

    am.put("Pressed.up", new VerticalMovementAction(-10, myPanel));
    am.put("Pressed.down", new VerticalMovementAction(10, myPanel));
    am.put("Pressed.left", new HorizontalMovementAction(-10, myPanel));
    am.put("Pressed.right", new HorizontalMovementAction(10, myPanel));

    btnLeftMvmt = new JButton("Left Translation");
    btnRightMvmt = new JButton("Right Translation");
    btnLeftMvmt.addActionListener(bleft -> {

    });
    btnRightMvmt.addActionListener(bright -> {

    });

    panel2.add(btnLeftMvmt);
    panel2.add(btnRightMvmt);

    add(myPanel);
    add(panel2, BorderLayout.SOUTH);
    pack();
    setLocationRelativeTo(null);
    setVisible(true);

  }

  public class VerticalMovementAction extends AbstractAction {

    private int delta;
    private MyPanel myPanel;

    public VerticalMovementAction(int delta, MyPanel myPanel) {
      this.delta = delta;
      this.myPanel = myPanel;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
      myPanel.moveVerticallyBy(delta);
    }

  }

  public class HorizontalMovementAction extends AbstractAction {

    private int delta;
    private MyPanel myPanel;

    public HorizontalMovementAction(int delta, MyPanel myPanel) {
      this.delta = delta;
      this.myPanel = myPanel;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
      myPanel.moveHorizontallyBy(delta);
    }

  }

  class MyPanel extends JPanel {

    private int oval_x = (600 - 150) / 2;
    private int oval_y = (300 - 150) / 2;

    public MyPanel() {
      setBackground(Color.YELLOW);
    }

    @Override
    public Dimension getPreferredSize() {
      return new Dimension(600, 300);
    }

    public void moveVerticallyBy(int delta) {
      oval_y += delta;
      repaint();
    }

    public void moveHorizontallyBy(int delta) {
      oval_x += delta;
      repaint();
    }

    @Override
    protected void paintComponent(Graphics g) {
      super.paintComponents(g);
      g.setColor(Color.RED);
      g.fillOval(oval_x, oval_y, 150, 150);
    }
  }

  public static void main(String[] args) {

    EventQueue.invokeLater(new Runnable() {
      @Override
      public void run() {
        // TODO Auto-generated method stub
        Page309_4 f = new Page309_4();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      }
    });
  }
}
0 голосов
/ 12 декабря 2018

Вы не перекрашиваете panel1 после нажатия клавиши, поэтому вы никогда не увидите изменения.Чтобы исправить, добавьте panel1.repaint () в конце обработчика keyPressed ().

...