【问题标题】:How do I make a panel repaint in Java?如何在 Java 中重新绘制面板?
【发布时间】:2012-10-19 11:44:59
【问题描述】:

我有一个专门的框架类和一个专门的面板类。我有一个按键监听器设置来监听“右”键(->)的按键,然后我调用重绘但是当我按下“右”键时没有任何反应。我相信我的 keylistener 做得很好,所以我认为这一定是我调用 repaint(); 的方式。请告诉我如何解决此问题。

Edit* 我想补充一点,我将 CircleFrame 中的 x 和 y 设为静态,因为我找不到调用我编写的 incX() 和 incY() 方法的方法。这是因为,最初,面板的创建是在 CircleBox 的构造函数中完成的。我把它拿出来放在 main 中,以便有一种方法可以为面板调用 repaint() ,但这不起作用。我觉得这里缺少一些重要的步骤。

package circlebox;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.util.Random;

public class CircleBox extends JFrame implements KeyListener {
    CircleBox() {

    }

    public void keyPressed(KeyEvent e) {
        int location = e.getKeyLocation();
        if(location == KeyEvent.KEY_LOCATION_NUMPAD) {
            CircleFrame.y += 1;
            repaint();
        }
    }

    public void keyReleased(KeyEvent e) {

    }

    public void keyTyped(KeyEvent e) {

    }

    public static void main(String[] args) {
        CircleBox frame = new CircleBox();
        frame.setSize(400,400);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        CircleFrame frame2 = new CircleFrame();
        frame.setLayout(new GridLayout(1,1));
        frame.add(frame2);

        frame.setVisible(true);
    }
}

class CircleFrame extends JPanel {
    static int x = 20;
    static int y = 20;
    int radius = 20;

    CircleFrame() {
        setSize(400,400);
    }

    @Override
    protected void paintComponent(Graphics g) {
        g.drawOval(x,y,radius,radius);
    }

    public void incX(int inc) {
        x += inc;
    }

    public void incY(int inc) {
        y += inc;
    }

    public int checkCollisions() {
        if(x <= 0) {
            return 0;
        }
        else if(y <= 0) {
            return 1;
        }
        else if(x >= 400) {
            return 2;
        }
        else if(y >= 400) {
            return 3;
        }
        else {
            return -1;
        }
    }
}

【问题讨论】:

    标签: java swing jpanel repaint keylistener


    【解决方案1】:

    您的重绘工作正常。问题出在关键监听器上。

    您首先需要实际注册您的关键侦听器。因此,在CircleBox 构造函数中添加这一行:

    addKeyListener(this);
    

    那么,你必须正确处理keyPressed

    public void keyPressed(KeyEvent e) {
        // TODO: your are actually moving the circle down, so it should be VK_DOWN
        if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
            CircleFrame.y += 1;
            repaint();
        }
    }
    

    【讨论】:

    • 非常感谢您,先生。这有很大帮助,应该有助于大大加快这个项目。你的帮助非常宝贵。 (我知道这听起来很俗气,但说真的,谢谢)。
    • 我必须再等一分钟才能接受,我一定会的。有没有办法让它不断地注册两个被按下的键?喜欢同时向右和向上移动圆圈吗?
    • 你绝对可以。您可以在 keyPressed 方法中随意使用条件: if (code == something || code == something else) {...} else {...}
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多