How to change an image after a keyboard input in java?

后端 未结 1 1982
小鲜肉
小鲜肉 2020-12-22 07:55

I have the following code to show you:

public class Test extends JPanel implements ActionListener, KeyListener
{
     Timer tm = new Timer(5, this);
     int         


        
相关标签:
1条回答
  • 2020-12-22 08:32
    1. Override paintComponent instead of paint. See Performing Custom Painting and Painting in AWT and Swing for more details
    2. Use the key bindings API instead of KeyListener, it will cause you less issues. See How to Use Key Bindings for more details

    Essentially, you could just have a Image as a class instance field, which was painted by the paintComponent method. When the key was pressed, you would change the image to the "move image" and when it was released, change it back to the "default image"

    Updated with example

    Walk the pony

    import java.awt.Dimension;
    import java.awt.EventQueue;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.KeyEvent;
    import java.awt.image.BufferedImage;
    import java.io.IOException;
    import javax.imageio.ImageIO;
    import javax.swing.AbstractAction;
    import javax.swing.Action;
    import javax.swing.ActionMap;
    import javax.swing.InputMap;
    import javax.swing.JComponent;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.KeyStroke;
    import javax.swing.Timer;
    import javax.swing.UIManager;
    import javax.swing.UnsupportedLookAndFeelException;
    
    public class Test {
    
        public static void main(String[] args) {
            new Test();
        }
    
        public Test() {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                        ex.printStackTrace();
                    }
    
                    JFrame frame = new JFrame("Testing");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.add(new TestPane());
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
            });
        }
    
        public interface Mover {
    
            public enum Direction {
    
                LEFT, RIGHT, NONE;
            }
    
            public void setDirection(Direction direction);
    
            public Direction getDirection();
    
        }
    
        public class TestPane extends JPanel implements Mover {
    
            private BufferedImage left;
            private BufferedImage right;
            private BufferedImage stand;
    
            private BufferedImage current;
            private Direction direction = Direction.NONE;
            private int xPos;
            private int yPos;
    
            public TestPane() {
                try {
                    left = ImageIO.read(getClass().getResource("/Left.png"));
                    right = ImageIO.read(getClass().getResource("/Right.png"));
                    stand = ImageIO.read(getClass().getResource("/Stand.png"));
                    current = stand;
                    xPos = 100 - (current.getWidth() / 2);
                    yPos = 100 - (current.getHeight() / 2);
                } catch (IOException exp) {
                    exp.printStackTrace();
                }
    
                bindKeyStrokeTo(WHEN_IN_FOCUSED_WINDOW, "move.left", KeyStroke.getKeyStroke(KeyEvent.VK_LEFT,   0, false), new MoveAction(this, Direction.LEFT));
                bindKeyStrokeTo(WHEN_IN_FOCUSED_WINDOW, "stop.left", KeyStroke.getKeyStroke(KeyEvent.VK_LEFT,   0, true), new MoveAction(this, Direction.NONE));
    
                bindKeyStrokeTo(WHEN_IN_FOCUSED_WINDOW, "move.right", KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0, false), new MoveAction(this, Direction.RIGHT));
                bindKeyStrokeTo(WHEN_IN_FOCUSED_WINDOW, "stop.right", KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0, true), new MoveAction(this, Direction.NONE));
    
                Timer timer = new Timer(40, new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        updatePosition();
                        repaint();
                    }
                });
                timer.start();
            }
    
            protected void bindKeyStrokeTo(int condition, String name, KeyStroke keyStroke, Action action) {
                InputMap im = getInputMap(condition);
                ActionMap am = getActionMap();
    
                im.put(keyStroke, name);
                am.put(name, action);
            }
    
            @Override
            public Direction getDirection() {
                return direction;
            }
    
            @Override
            public void setDirection(Direction direction) {
                this.direction = direction;
            }
    
            protected void updatePosition() {
    
                switch (getDirection()) {
                    case LEFT:
                        current = left;
                        xPos -= 1;
                        break;
                    case RIGHT:
                        current = right;
                        xPos += 1;
                        break;
                    case NONE:
                        current = stand;
                        break;
                }
    
                if (xPos < 0) {
                    xPos = 0;
                    current = stand;
                } else if (xPos + current.getWidth() > getWidth()) {
                    current = stand;
                    xPos = getWidth() - current.getWidth();
                }
    
            }
    
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(200, 200);
            }
    
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                Graphics2D g2d = (Graphics2D) g.create();
                g2d.drawImage(current, xPos, yPos, this);
                g2d.dispose();
            }
    
        }
    
        public class MoveAction extends AbstractAction {
    
            private Mover mover;
            private Mover.Direction direction;
    
            public MoveAction(Mover mover, Mover.Direction direction) {
                this.mover = mover;
                this.direction = direction;
            }
    
            @Override
            public void actionPerformed(ActionEvent e) {
                mover.setDirection(direction);
            }
    
        }
    
    }
    
    0 讨论(0)
提交回复
热议问题