Java 如何正确使用ActionListener?

Java 如何正确使用ActionListener?,java,actionlistener,Java,Actionlistener,我试图做一个“简单的tetras”游戏作为一个开始的编码器。如下图所示的代码,当在计时器内无法执行(y=y+10)操作时,按下箭头键可以移动白色块。我猜ActionListener放错位置了。我想做的就是能够在块下降时左右移动块 这是我的密码: import java.awt.event.*; import java.awt.Color; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.ev

我试图做一个“简单的tetras”游戏作为一个开始的编码器。如下图所示的代码,当在计时器内无法执行(
y=y+10
)操作时,按下箭头键可以移动白色块。我猜
ActionListener
放错位置了。我想做的就是能够在块下降时左右移动块

这是我的密码:

import java.awt.event.*;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;

public class Experiment extends JFrame {
    int x = 100;
    int y = 100;
    ASD exp = new ASD();

    public Experiment() {
        add(exp);
        exp.setFocusable(true);
    }

    public class ASD extends JPanel {
        public ASD() {
            addKeyListener(new KeyAdapter() {
                public void keyPressed(KeyEvent e) {
                    switch (e.getKeyCode()) {
                        //case KeyEvent.VK_DOWN: y += 10;break;
                        //case KeyEvent.VK_UP: y -= 10; break;
                        case KeyEvent.VK_LEFT:
                            x -= 10;
                            break;
                        case KeyEvent.VK_RIGHT:
                            x += 10;
                            break;
                    }
                    repaint();
                }
            });
        }

        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            setBackground(Color.BLACK);

            g.setColor(Color.WHITE);
            g.fillRect(x, y, 30, 30);
        }

        public class Movement extends JPanel implements ActionListener {
            Timer tm = new Timer(5, this);

            public void actionPerformed(ActionEvent e) {
                y = y + 10;
                repaint();
            }
        }
    }

    public static void main(String[] args) {
        Experiment frame = new Experiment();
        frame.setTitle("ASD");
        frame.setSize(600, 400);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}

代码的主要问题是

  • 计时器需要通过调用
    tm.start()
  • 块“落下”后,需要重新上漆
  • 下面是类
    ASD

       public class ASD extends JPanel implements ActionListener {
    
            private Timer tm;
    
            public ASD() {
                addKeyListener(new KeyAdapter() {
                    public void keyPressed(KeyEvent e) {
                        switch (e.getKeyCode()) {
                            //case KeyEvent.VK_DOWN: y += 10;break;
                            //case KeyEvent.VK_UP: y -= 10; break;
                            case KeyEvent.VK_LEFT:
                                x -= 10;
                                break;
                            case KeyEvent.VK_RIGHT:
                                x += 10;
                                break;
                        }
                        repaint();
                    }
                });
    
                tm = new Timer(200, this);
                tm.setRepeats(true);
                tm.start();
            }
    
            @Override
            public void actionPerformed(ActionEvent e) {
                y = y + 10;
                repaint();
            }
    
            public void paintComponent(Graphics g) {
                super.paintComponent(g);
                setBackground(Color.BLACK);
    
                g.setColor(Color.WHITE);
                g.fillRect(x, y, 30, 30);
            }
        }