Java ActionEvent-关键事件问题?
不知道为什么,但当我尝试使用KeyEvents移动图像图标时,它不起作用。我想,当我按下“A”键时,让我的图像向左移动 这是我的代码,由助手润色: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;
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);
}
}