【问题标题】:repaint() doesn't work if I add a KeyListener如果我添加 KeyListener,repaint() 不起作用
【发布时间】:2017-09-23 12:30:46
【问题描述】:

所以我关注了一个 youtube 教程,该教程教你如何用 Java 编写一个小游戏。即使我的代码与视频中的那个人完全相同,但我还是有一点问题。

public class Screen extends JPanel implements Runnable {
    Thread thread = new Thread(this);
    Frame frame;
    int fps = 0; 
    int scene;
    boolean running = false;

    public Screen(Frame frame) {
        this.setFocusable(true);
        this.frame = frame;
        frame.addKeyListener(new KeyHandler(this)); 
        thread.start(); 
    }

    @Override
    public void paintComponent(Graphics g) { 
        super.paintComponent(g);
        g.clearRect(0, 0, this.frame.getWidth(), this.frame.getHeight()); 
        if (scene == 0) {
            g.setColor(Color.BLUE);
        } else if (scene == 1) {
            g.setColor(Color.GREEN);
        } else {
            g.setColor(Color.WHITE);
    }

    g.fillRect(0, 0, getWidth(), getHeight());
    g.setColor(Color.BLACK);
    g.drawString(fps + "", 10, 10);  
    }

    public void run() {
        System.out.println("[Success] Frame Created!");
        long lastFrame = System.currentTimeMillis(); 
        int frames = 0;
        running = true;
        scene = 0;

        while (running) {
            repaint(); 
            frames++; 

            if (System.currentTimeMillis() - 1000 >= lastFrame) { 
                fps = frames;
                frames = 0;
                lastFrame = System.currentTimeMillis();
            }

            try {
                Thread.sleep(1); 
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }

        System.exit(0); 

}

问题是似乎 repaint() 在我将 KeyListener 添加到我的框架后并没有被调用。如果删除 KeyListener,它会起作用。我认为问题不在于我的 KeyHandler 类,因为如果我使用标准 KeyListener,问题仍然存在。

【问题讨论】:

    标签: java keylistener repaint


    【解决方案1】:

    如果不知道游戏的目的或使用的特定 KeyHandler 实现,很难回答这个问题。以下对我有用:

    public class Screen extends JPanel implements Runnable {
        Thread thread = new Thread(this);
        Frame frame;
        int fps = 0;
        int scene;
        boolean running = false;
    
        public Screen(Frame frame) {
            this.setFocusable(true);
            this.frame = frame;
            frame.setFocusable(true);
            frame.addKeyListener(new KeyListener() {
    
                @Override
                public void keyTyped(KeyEvent e) {}
    
                @Override
                public void keyPressed(KeyEvent e) {
                    handleKeyChar(e.getKeyChar());
                }
    
                @Override
                public void keyReleased(KeyEvent e) {}
    
                private void handleKeyChar(char c) {
                    switch (c) {
                    case '0':
                        scene = 0;
                        break;
                    case '1':
                        scene = 1;
                        break;
                    default:
                        scene = 2;
                    }
                }
    
            });
            thread.start();
        }
    
        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.clearRect(0, 0, this.frame.getWidth(), this.frame.getHeight());
            if (scene == 0) {
                g.setColor(Color.BLUE);
            } else if (scene == 1) {
                g.setColor(Color.GREEN);
            } else {
                g.setColor(Color.WHITE);
            }
    
            g.fillRect(0, 0, getWidth(), getHeight());
            g.setColor(Color.BLACK);
            g.drawString(fps + "", 20, 40);
        }
    
        public void run() {
            System.out.println("[Success] Frame Created!");
            long lastFrame = System.currentTimeMillis(); 
            int frames = 0;
            running = true;
            scene = 0;
    
            while (running) {
                repaint(); 
                frames++; 
    
                if (System.currentTimeMillis() - 1000 >= lastFrame) { 
                    fps = frames;
                    frames = 0;
                    lastFrame = System.currentTimeMillis();
                }
    
                try {
                    Thread.sleep(1); 
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
    
            }
    
            System.exit(0); 
    
        }
    
        public static void main(String[] args) {
            JFrame frame = new JFrame("Example");
            frame.setSize(600, 600);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            Screen panel = new Screen(frame);
            frame.add(panel);
            frame.setVisible(true);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-14
      相关资源
      最近更新 更多