Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ActionEvent-关键事件问题?_Java_Swing - Fatal编程技术网

Java ActionEvent-关键事件问题?

Java ActionEvent-关键事件问题?,java,swing,Java,Swing,不知道为什么,但当我尝试使用KeyEvents移动图像图标时,它不起作用。我想,当我按下“A”键时,让我的图像向左移动 这是我的代码,由助手润色: import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; public class MainClass extends AbstractAction { JLabel label;

不知道为什么,但当我尝试使用KeyEvents移动图像图标时,它不起作用。我想,当我按下“A”键时,让我的图像向左移动

这是我的代码,由助手润色:

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


public class MainClass extends AbstractAction {
    JLabel label;

    int x = 300;
    int y = 300;

    public MainClass() {
        final JPanel panel = new JPanel();
        final ImageIcon image = new ImageIcon("Character Face Left - Bronze.png");

        label = new JLabel(image,JLabel.CENTER );

        label.setSize(500,500);
        label.setLocation(x, y); 

        final JFrame frame = new JFrame( "Rover: Bound to Earth" );
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        frame.setLayout(null);
        frame.add(label);
        frame.setSize(500, 500);
        frame.setVisible(true);

        InputMap inputMap = panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
        ActionMap actionMap = panel.getActionMap();

        inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_A, 0), "LEFT");
        actionMap.put("LEFT", this);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        x -= 10;
        label.setLocation(x, y);
    }

    public static void main( String[] args ) {
        SwingUtilities.invokeLater( () -> { new MainClass(); } );
    }
}
您将密钥绑定添加到面板,但从不使用面板

应将键绑定添加到要操作的组件:

    InputMap inputMap = label.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
    ActionMap actionMap = label.getActionMap();
或者,如果确实要在面板上设置绑定,则需要将标签添加到面板,然后将面板添加到框架。因此,框架将使用默认的BorderLayout,而面板将使用null布局

不要随机设置零部件的尺寸:

label.setSize(500,500);
相反,您可以根据首选尺寸确定尺寸:

label.setSize( label.getPreferredSize() );
还有,你为什么要延长这一行动

public class MainClass extends AbstractAction {
此类中的代码用于创建GUI,您不应仅为此扩展抽象操作

阅读上的Swing教程中的部分。
ActionDemo.java
源代码将向您展示如何更好地构造代码并将操作用作单独的内部类。

尝试此代码(左箭头图像和右箭头图像以Base64格式嵌入代码中):


那么,使用您的代码,我将如何更改图像?例如,当我按下“LEFT”键时,我想要有这样的图像:ImageIcon characterLeft=new ImageIcon(“Character Face LEFT.png”);但是当我按下“RIGHT”键时,我希望它切换到这个图像:ImageIcon characterRight=newImageIcon(“Character Face RIGHT.png”);我更新了代码,向您展示了如何根据按下的键更改标签图像。不要使用KeyListener。这是AWT的旧解决方案。Swing的“键绑定”解决方案是一个更新更好的解决方案。当新API可用时,请使用它们。阅读我在回答中提供的教程链接。还有一节介绍如何使用键绑定。
public class MainClass extends AbstractAction {
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.Base64;

public class MainClass extends JFrame {

    private static final String LEFT_ARROW = "iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAA3NCSVQICAjb4U/gAAAACXBIWXMAAAbsAAAG7AEedTg1AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAVNQTFRF////AAAAAAAAVVVVQEBAMzMzKysrJCQkQEBAYGBgLi4uKysrNzc3SUlJMzMzLS0tNjY2aGhoQ0NDMzMzNzc3MzMzPDw8MjIyXFxcNzc3TExMNTU1XV1dZWVlMTExampqPDw8ZmZmSkpKNDQ0Xl5eQUFBPDw8VFRUaGhoQUFBOzs7SkpKYWFhR0dHREREWFhYampqR0dHQUFBUVFRZWVlSEhIUVFRXV1dbm5uSkpKUFBQWFhYaGhoUFBQWFhYZGRkdHR0UlJSWFhYXl5eb29vWVlZYWFhbGxseXl5W1tbY2Njd3d3ZmZmbW1tdXV1gICAZ2dnb29vh4eHf39/cnJyfX19h4eHc3Nzenp6h4eHj4+PfHx8hoaGjo6Ofn5+hYWFjo6OlZWVfHx8goKChoaGiIiIioqKjIyMjo6OkJCQkpKSk5OTlJSUlpaWl5eXmJiYmZmZ40GS6gAAAGJ0Uk5TAAECAwQFBgcICAsMDg4PERMWFxkcHiIkJC4vMDQ1OTo8PD5AQUtNT1ZeX2BkcHF0e4SFh4uYmJyiqqqusbu8wMbLy87R19jc4eLj6Ovs7vHy8vT19/j5+vv7/P39/f7+/v7HrT76AAABKUlEQVRYw+3XxVIDQQCE4YYQCBAI7hbcHYJbcPfgDoENw/T7n3Ldwy4F1Reoyn+e/mpuUwNk+hc1ifvehLYffTbKPGf6jQoQXnaoABVbhgpQf2ipAJ0JUgEG76gAWROvVIDQ/AcVoGTNUAGqdy1dQJt3Id99yynd2SfvGvz2Pdf8UVGf/cgLFSAw804FKFz5pAKUb1sqQO0RqQAdF5SAgXtKwGSSCpC7kKICRNYtFaByj7+v2QUUxA2lGyAw62gAMJYUAfTdiABaz0QAVfsigOINqwEILhoNAGKOCGDoQQTQdSkCqDsRAZTtiADyVt0HTdS7/O8e9zntcQUwnhIB9N+KANrPRQA1ByKAok0RQPaSCABTXyKA4UcRQPeVCKDxWP3ylGZ+fX++NPvqVHl2jq5HAAAAAElFTkSuQmCC";
    private static final String RIGHT_ARROW = "iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAADzklEQVR4Xu2bX0jaaxjHX/8s+2NIQnFOjqYyi7YMbFLSzMqyYrk2DiWMbvbnMOjAgg1h29W2mwOHwc6hiLStdoi2RuDO8aJdNMvWoX8rDTMPTpsEugRZJqyGJup5vPCuiyNkSI9fePndKe+X930/z+/7vD9KLBYjmEUlyJUxIGMAcmUMyBhwzKqpqeFVV1f/gNYAmLyyoqLCVlVVdQ6lARQKhSaRSNhSqdQMq0GOlgKwChhNTU3vZTLZz2gpwOVyqa2trc8VCsVTtBQoLCwkbW1taqVS+bdYLD6FEoP5+flxE67weLxlMIGFsg7IysoicCaIgBD/ggklKAshKpVKamtri4ESNhgX0FaClZWVzIaGhiUgxFW0pTCfz6e3tLS8BVSq0eYBRUVFFCDEUyDECwqIpEB0cohg/52ORCJnSQpUXl6e1O+yWCwCtcKt3NxcfmNj4yWj0RhMuQFCofARuJ+SCi07O5skKwaDQRpBi4uLFiDExdXV1a/kiHRoKKpWq/8qLS29StJQa2tr/qWlJQk8nSjzAJFIxG5ubrbW19fL0AYiAoGAATvCCJS4jjYRKi4upgIiX7a3t/+KNhIrKCggsAoednV16VQqFQ1lJpiTk0PkcvlP8C7xETIGJspQlEajkbq6uipImeyAyR9RpsLxQhFyRg7QwQEpUyXaWLysrIwJhDDBAXkZbV+Aw+HQIWbTd3R03EXbGGGz2RRYCc86Ozu1aDtDeXl5BEy43d3dbYhjEmVrLBgMxodpYmIigs6AnZ2d6MzMzE2dTncf3RbweDwhyA7kk5OTL9FRwOl0Bqanp89PTU19QEWBeLaxvr7uMhgMvPn5+c//LxE6IYIIj5jN5n8gKGmCESYgNAaEQiGysrLy5+jo6A10L0P7+/uxhYWFB4nJozLA7/dHYPKd4+Pjv5FDdKK3wPb29nfY61K9Xr+GLhFyuVw+KHDOJiaPyoCNjQ3b8vLymbm5OW8KGiPpq2g0SiwWyzuNRqOMgVLaGOnp6eHAH/JICsRkMlUQWtwhSejg4CBe4Pw+NDR071h6g4ODg1/gAePo1dvbK04Wc3DY/QKY06DrDu/u7oZNJpMiMXlUBni93m8weeHY2Ng0uvsBW1tbntnZ2RIIMT6huyHicDhWNjc3ufAuHyDHIHo6Yc5ms73p7++/hu6aXDgcJlar9Uli8qgMAMxFgfHdAwMDj9FdlQ0EAiEobaVarfY1urvCPp/Pb7fbBcPDw4vobou73e7PcNqXjIyMuEkSOhEU2Nvbe9XX1/cHSRNlPp0lyJUxIGMAcv0HB8VtSN5KVe4AAAAASUVORK5CYII=";
    private JLabel label;
    private ImageIcon leftArrow;
    private ImageIcon rightArrow;

    MainClass() {
        loadResources();
        buildUI();
        registerListeners();
    }

    private void loadResources() {
        leftArrow = new ImageIcon(Base64.getDecoder().decode(LEFT_ARROW));
        rightArrow = new ImageIcon(Base64.getDecoder().decode(RIGHT_ARROW));
    }

    private void buildUI() {
        label = new JLabel("test");
        label.setIcon(leftArrow);
        label.setSize(100, 64);
        label.setOpaque(true);
        label.setBackground(Color.CYAN);
        label.setLocation(0, 0);

        JPanel panel = new JPanel();
        panel.setOpaque(true);
        panel.setLayout(null);
        panel.add(label);

        this.setContentPane(panel);
    }

    private void registerListeners() {
        this.addKeyListener(new KeyAdapter() {

            @Override
            public void keyPressed(KeyEvent e) {
                int x = 0;
                int y = 0;
                ImageIcon newImageIcon = null;
                switch (e.getKeyCode()) {
                    case KeyEvent.VK_LEFT:
                        newImageIcon = leftArrow;
                        x -= 10;
                        break;
                    case KeyEvent.VK_RIGHT:
                        newImageIcon = rightArrow;
                        x += 10;
                        break;
                    case KeyEvent.VK_UP:
                        y -= 10;
                        break;
                    case KeyEvent.VK_DOWN:
                        y += 10;
                        break;
                }
                if (x != 0 || y != 0) {
                    Point location = label.getLocation();
                    label.setLocation(location.x + x, location.y + y);
                    if (newImageIcon != null) {
                        label.setIcon(newImageIcon);
                    }
                }
            }

        });
    }

    public static void main(String[] args) {
        JFrame frame = new MainClass();
        frame.setSize(500, 500);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}