我想在java中使用事件处理的图形

我想在java中使用事件处理的图形,java,graphics,Java,Graphics,问题定义:我想用java中的图形来打印球和一个矩形,球应该通过箭头键或移动鼠标朝矩形移动 代码的问题是它一次又一次地打印球,我只想打印一次球 public class MouseGui extends javax.swing.JFrame implements MouseMotionListener, MouseListener, KeyListener { int x = 10, y = 10; public MouseGui() { ini

问题定义:我想用java中的图形来打印球和一个矩形,球应该通过箭头键或移动鼠标朝矩形移动

代码的问题是它一次又一次地打印球,我只想打印一次球

public class MouseGui extends javax.swing.JFrame implements
        MouseMotionListener, MouseListener, KeyListener {

    int x = 10, y = 10;

    public MouseGui() {
        initComponents();
        addKeyListener(this);
        addMouseListener(this);
    }

    @Override
    public void paint(final Graphics g) {
        g.setColor(Color.red);
        g.fillOval(x, y, 50, 50);
        g.setColor(Color.blue);
        g.fillRect(200, 300, 100, 80);
        if (x > 180 || y > 280) {
            g.drawString("Target hit!!", 80, 20);

        }
    }

    public static void main(final String args[]) {
        MouseGui obj = new MouseGui();

        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new MouseGui().setVisible(true);
            }

        });
    }

    @Override
    public void mouseMoved(final MouseEvent e) {
        x = e.getX();
        y = e.getY();
        repaint();

    }

    @Override
    public void keyPressed(final KeyEvent e) {
        int a = e.getKeyCode();
        if (e.getKeyCode() == VK_UP) {
            y = y - 10;
            repaint();
        } else if (e.getKeyCode() == VK_DOWN) {
            y = y + 10;
            repaint();
        } else if (e.getKeyCode() == VK_RIGHT) {
            x = x + 10;
            repaint();
        } else if (e.getKeyCode() == VK_LEFT) {
            x = x - 10;
            repaint();
        }
    }

}
下面是此代码如何显示输出:


问题不在于球被涂了多次,而在于旧的图纸从未被清除

重写绘制方法时,建议调用超级方法,以便它首先执行自己的操作

在此处调用
super.paint(g)
将清除
Graphics
对象:

@Override
public void paint(final Graphics g) {
    super.paint(g);
    g.setColor(Color.red);
    g.fillOval(x, y, 50, 50);
    g.setColor(Color.blue);
    g.fillRect(200, 300, 100, 80);
    if (x > 180 || y > 280) {
        g.drawString("Target hit!!", 80, 20);

    }
}
此外,正如@JoopEggen所建议的,在对Swing组件进行自定义绘制时,通常使用较低级别的组件,如
JPanel
,并覆盖其
paintComponent
方法,即:

@Override
public void paintComponent(final Graphics g) {
    super.paintComponent(g);
    g.setColor(Color.red);
    g.fillOval(x, y, 50, 50);
    g.setColor(Color.blue);
    g.fillRect(200, 300, 100, 80);
    if (x > 180 || y > 280) {
        g.drawString("Target hit!!", 80, 20);

    }
}

请参阅本课程以获取一些示例:

调用
super.paintComponent(g)
是必须的。

如果您希望人们尝试阅读代码,请考虑正确缩进代码。使用paintComponent而不是paint.thnx大量使用代码