How to use KeyListener with JFrame?

后端 未结 4 1736
萌比男神i
萌比男神i 2020-11-30 14:42

So, I was trying to make a rectangle move with a KeyEvent (KeyListener) and whenever I try to hit the key, the rectangle doesn\'t move.

The

4条回答
  •  甜味超标
    2020-11-30 15:26

    The rectangle is not moving because you are not using JFrame correctly. You have to assign frame to new mainFrame() instead of ignoring the instantiated mainFrame object.

    There are several other issues as @MadProgrammer points out.

    Here is the code that fixes some of the issues:

    mainFrame.java

    import java.awt.*;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    import javax.swing.JFrame;
    
    
    public class mainFrame extends JFrame implements KeyListener{
        private mainDraw draw;
    
        public void keyPressed(KeyEvent e) {
            System.out.println("keyPressed");
        }
    
        public void keyReleased(KeyEvent e) {
            if(e.getKeyCode()== KeyEvent.VK_RIGHT)
                draw.moveRight();
            else if(e.getKeyCode()== KeyEvent.VK_LEFT)
                draw.moveLeft();
            else if(e.getKeyCode()== KeyEvent.VK_DOWN)
                draw.moveDown();
            else if(e.getKeyCode()== KeyEvent.VK_UP)
                draw.moveUp();
    
        }
        public void keyTyped(KeyEvent e) {
            System.out.println("keyTyped");
        }
    
        public mainFrame(){
            this.draw=new mainDraw();
            addKeyListener(this);
            setFocusable(true);
            setFocusTraversalKeysEnabled(false);
        }
    
        public static void main(String[] args) {
            javax.swing.SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    mainFrame frame = new mainFrame();
                    frame.setTitle("Square Move Practice");
                    frame.setResizable(false);
                    frame.setSize(600, 600);
                    frame.setMinimumSize(new Dimension(600, 600));
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.getContentPane().add(frame.draw);
                    frame.pack();
                    frame.setVisible(true);
                }
            });
        }
    }
    

    mainDraw.java

    import java.awt.Color;
    import java.awt.Graphics;
    import javax.swing.JComponent;
    
    public class mainDraw extends JComponent {
    
        public int x = 50;
        public int y = 50;
    
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawRect(x, y, 50, 50);
            g.fillRect(x, y, 50, 50);
            g.setColor(Color.BLACK);
        }
    
        public void moveRight() {
            x = x + 5;
            repaint();
        }
    
        public void moveLeft() {
            x = x - 5;
            repaint();
        }
    
        public void moveDown() {
            y = y + 5;
            repaint();
        }
    
        public void moveUp() {
            y = y - 5;
            repaint();
        }
    }
    

    BTW, use SwingUtilities to put the gui update code because swing objects are not thread-safe.

提交回复
热议问题