不知道为什么,但当我尝试使用KeyEvents进行ImageIcon移动时,它不起作用。我想,当我按下"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(); } );
}
}发布于 2017-09-09 17:34:44
InputMap inputMap = panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
ActionMap actionMap = panel.getActionMap();将键绑定添加到面板,但从不使用面板。
应该将键绑定添加到要操作的组件中:
InputMap inputMap = label.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
ActionMap actionMap = label.getActionMap();或者,如果确实希望设置面板上的绑定,则需要将标签添加到面板中,然后将面板添加到框架中。因此,框架将使用默认的BorderLayout,面板将使用空布局。
不要随意设置组件的大小:
label.setSize(500,500);相反,您可以根据首选的大小来确定大小:
label.setSize( label.getPreferredSize() );另外,为什么要扩展AbstracAction?
public class MainClass extends AbstractAction {该类中的代码用于创建GUI,您不应该仅为此扩展AbstractAction。
阅读有关如何使用动作的Swing教程中的部分。ActionDemo.java源代码将向您展示如何更好地构造代码,并将动作作为单独的内部类使用。
发布于 2017-09-09 17:50:52
尝试以下代码(左箭头图像,分别是右箭头图像,嵌入到Base64格式的代码中):
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);
}
}https://stackoverflow.com/questions/46133177
复制相似问题