获取 FLabel 或图像以使用键盘移动

Get an FLabel or image to move with keyboard

我正在尝试让这个 JLabel 移动,我尝试了所有的方法和每个代码,但它就是行不通。它似乎从来没有用过,我把 repaint() 放在任何有意义的地方,还有移动代码,但它似乎仍然无法以任何方式工作。我只是没有尝试用导入的图像来做,因为也很难找到一个好的方法。

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.swing.ImageIcon;

public class Move extends JFrame {

    private JPanel contentPane;


    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Move frame = new Move();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public Move() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);    


            JLabel label = new JLabel("");
            label.setIcon(new ImageIcon(Move.class.getResource("/images/Untitled-2.png")));
            label.setBounds(192, 130, 87, 58);
            contentPane.add(label);

            label.addKeyListener(new KeyAdapter() {
                public void keyPressed(KeyEvent ke) {
                    if(ke.getKeyCode() == KeyEvent.VK_DOWN) {
                        label.setLocation(label.getX(),label.getY()+1);
                        label.repaint();
                    }
                    if(ke.getKeyCode() == KeyEvent.VK_UP) {
                        label.setLocation(label.getX(),label.getY()-1);
                        label.repaint();
                    }
                    if(ke.getKeyCode() == KeyEvent.VK_LEFT) {
                        label.setLocation(label.getX()+1,label.getY());
                        label.repaint();
                    }
                    if(ke.getKeyCode() == KeyEvent.VK_RIGHT) {
                        label.setLocation(label.getX()-1,label.getY());
                        label.repaint();
                    }
                    label.repaint();
                }
            });

    }
}
  1. KeyListener 附加到 Move 实例本身,而不是其中的 label,即仅使用以下内容:

    addKeyListener(new KeyAdapter() { ...
    
  2. 删除多余的 label.repaint(); 语句。

  3. 你混淆了左右运动。所以也解决这个问题。

将它们放在一起时,Move() 构造函数的最后部分应如下所示:

    addKeyListener(new KeyAdapter() {
        public void keyPressed(KeyEvent ke) {
            if (ke.getKeyCode() == KeyEvent.VK_DOWN)
                label.setLocation(label.getX(), label.getY() + 1);
            if (ke.getKeyCode() == KeyEvent.VK_UP)
                label.setLocation(label.getX(), label.getY() - 1);
            if (ke.getKeyCode() == KeyEvent.VK_LEFT)
                label.setLocation(label.getX() - 1, label.getY());
            if (ke.getKeyCode() == KeyEvent.VK_RIGHT)
                label.setLocation(label.getX() + 1, label.getY());
        }
    });