【问题标题】:Get an FLabel or image to move with keyboard获取 FLabel 或图像以使用键盘移动
【发布时间】:2018-05-19 20:34:19
【问题描述】:

我正试图让这个 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();
                }
            });

    }
}

【问题讨论】:

    标签: java eclipse swing jlabel


    【解决方案1】:
    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());
            }
        });
    

    【讨论】:

    • it just won't work. - 它不起作用的原因是因为 KeyEvents 仅被分派到具有焦点的组件而标签没有焦点。此解决方案仅适用于简单场景。更好的解决方案是使用Key Bindings。有关更多信息和工作示例,请参阅 Motion Using the Keyboard
    猜你喜欢
    • 2012-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多