Метод ActionPerformed не работает из другого класса

1

Я пытаюсь добавить объект класса RedSquare в JFrame в классе CatchMeV2. В чем проблема?

public class CatchMeV2 implements ActionListener{
int width = 400;
int height = 450;

public static void main(String[] args) {
    JFrame frame = new JFrame();
    frame.setVisible(true);
    frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
    frame.setResizable(false);
    frame.setSize(400, 400);
    frame.setTitle("CatchMe.V2");
    RedSquare r = new RedSquare();
    frame.add(r);

}

@Override
public void actionPerformed(ActionEvent e) {

    }
}

public class RedSquare extends JPanel implements ActionListener {
int x = 20; int y = 20;
int velX = 4; int velY = 4;
public RedSquare(){
    addActionListener(this);
}
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.setColor(Color.green);
    g.fillRect(x, y, 50, 50);
    repaint();
}

@Override
public void actionPerformed(ActionEvent e) {
    x += velX;
    y += velY;
    if (x < 0) {
        velX = 0;
        x = 0;
    }
    if (x > 400 - 50) {
        velX = 0;
        x = 400 - 50;
    }
    if (y < 0) {
        velY = 0;
        y = 0;
    }
    if (y > 400 - 40) {
        velY = 0;
        y = 400 - 40;
    }
    repaint();
    }
}

Метод actionPerformed ничего не делает. Может ли кто-нибудь помочь? Или есть простой способ сделать это? Предпосылки: Я пытался создать игру, используя один класс. Я сделал это, но проблема заключалась в том, что я мог принимать только один ключевой ввод за раз, и он был отстающим. И мой учитель сказал, что если я разделил его на разные классы, он не отстанет. Это правда?

  • 0
    Прочитайте учебные руководства по Oracle Graphics2d и пользовательские рисунки для примеров рабочего кода
  • 0
    красный квадрат не является компонентом, расширяющим его от компонента свинга [jpanel]
Показать ещё 1 комментарий
Теги:
class
swing
jframe

1 ответ

3
Лучший ответ

Вы не можете добавить не визуальный компонент в JPanel поэтому вам нужно расширить класс RedSquare от компонента, например JPanel и переопределить метод paintComponent().

public class CatchMeV2 {

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
        frame.setSize(400, 400);
        frame.setTitle("CatchMe.V2");
        RedSquare r = new RedSquare();
        frame.setContentPane(r);
        frame.setVisible(true);
    }
}

class RedSquare extends JPanel implements ActionListener {

    public RedSquare() {

    }

    @Override    
    protected void paintComponent(Graphics g) {
        super.paintComponent(g); // don't forget to call super method
        g.setColor(Color.green);
        g.fillRect(20, 20, 50, 50);
    }

    @Override
    public void actionPerformed(ActionEvent e) {

    }
}

обновить >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

вы не можете использовать действие, выполняемое для панели, только для кнопок или как это. Если вы хотите что-то сделать с щелчком на панели, тогда вам нужно использовать mouselistner для реализации. и поместить код действия внутри метода mouseclick.

import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JFrame;
import static javax.swing.JFrame.EXIT_ON_CLOSE;
import javax.swing.JPanel;

public class CatchMeV2 {

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setVisible(true);
        frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
        frame.setResizable(false);
        frame.setSize(400, 400);
        frame.setTitle("CatchMe.V2");
        RedSquare r = new RedSquare();
        frame.add(r);
    }
}

class RedSquare extends JPanel implements MouseListener {

    int x = 20;
    int y = 20;
    int velX = 4;
    int velY = 4;

    public RedSquare() {
        addMouseListener(this);
    }

    protected void paintComponent(Graphics g) {
        super.paintComponent(g); 
        g.fillRect(x, y, 50, 50);
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        System.out.println("hi");
        x += velX;
        y += velY;
        if (x < 0) {
            velX = 0;
            x = 0;
        }
        if (x > 400 - 50) {
            velX = 0;
            x = 400 - 50;
        }
        if (y < 0) {
            velY = 0;
            y = 0;
        }
        if (y > 400 - 40) {
            velY = 0;
            y = 400 - 40;
        }
        this.repaint();
    }

    @Override
    public void mousePressed(MouseEvent e) {}

    @Override
    public void mouseReleased(MouseEvent e) {}

    @Override
    public void mouseEntered(MouseEvent e) {}

    @Override
    public void mouseExited(MouseEvent e) {}


}

в то время вам нужно только перемещать квадрат с помощью мыши, поэтому вы все равно можете использовать событие awt mouse, но когда вы используете ключи, вы должны использовать key binding

  • 0
    Спасибо. Будет ли это работать, если RedSquare расширил JFrame.
  • 0
    @MertKarakas да, но тогда вы не можете добавить его на панель, но вы можете создать. Но лучше использовать панель для этого, а не jframe. Не переопределяйте jframe paintcomponent метод переопределяйте метод панели вместо
Показать ещё 17 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню