首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ActionEvent - KeyEvent问题?

ActionEvent - KeyEvent问题?
EN

Stack Overflow用户
提问于 2017-09-09 17:16:42
回答 2查看 256关注 0票数 2

不知道为什么,但当我尝试使用KeyEvents进行ImageIcon移动时,它不起作用。我想,当我按下"A“键时,我的形象会向左移动。

这是我的代码,由一个助手完成:

代码语言:javascript
复制
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(); } );
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-09-09 17:34:44

代码语言:javascript
复制
    InputMap inputMap = panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
    ActionMap actionMap = panel.getActionMap();

将键绑定添加到面板,但从不使用面板。

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

代码语言:javascript
复制
    InputMap inputMap = label.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
    ActionMap actionMap = label.getActionMap();

或者,如果确实希望设置面板上的绑定,则需要将标签添加到面板中,然后将面板添加到框架中。因此,框架将使用默认的BorderLayout,面板将使用空布局。

不要随意设置组件的大小:

代码语言:javascript
复制
label.setSize(500,500);

相反,您可以根据首选的大小来确定大小:

代码语言:javascript
复制
label.setSize( label.getPreferredSize() );

另外,为什么要扩展AbstracAction?

代码语言:javascript
复制
public class MainClass extends AbstractAction {

该类中的代码用于创建GUI,您不应该仅为此扩展AbstractAction。

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

票数 3
EN

Stack Overflow用户

发布于 2017-09-09 17:50:52

尝试以下代码(左箭头图像,分别是右箭头图像,嵌入到Base64格式的代码中):

代码语言:javascript
复制
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);
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46133177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档