【问题标题】:My drawn object doesn't clear previous rectangle after key is pressed按下键后,我绘制的对象不会清除前一个矩形
【发布时间】:2014-05-16 18:27:57
【问题描述】:

当我按下其中一个箭头键时,我的代码不会清除前一个矩形。我认为通过在我的keyPressed() 方法中使用repaint() 可以解决问题。我也尝试过使用clearRect(),但这没有任何作用。

这是空闲矩形:

这是我按住右箭头键时:

这是我的代码:

import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.KeyEvent;
import java.awt.geom.Rectangle2D;

import javax.swing.Icon;

import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.geom.AffineTransform;
import java.awt.geom.Arc2D;
import java.awt.geom.PathIterator;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList;

import javax.swing.Icon;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;


public class Rectangle extends JPanel implements KeyListener{

private int height;
private int width;
private int x;
private int y;
private Graphics2D g2;



public Rectangle(int width, int height,int x, int y)
{
    this.height = height;
    this.width = width;
    this.x = x;
    this.y = y;

    JLabel label = new JLabel();
    label.addKeyListener(this);
    label.setFocusable(true);
    label.setOpaque(true);
    label.addKeyListener(this);
    this.add(label);
    label.requestFocusInWindow();
    setVisible(true);

}
 public Dimension getPreferredSize() {
        return new Dimension(500,500);
    }

public void keyPressed(KeyEvent e)
{   

    if (e.getKeyCode() == KeyEvent.VK_DOWN)
    {
        y = y + 5;
        repaint();
    }
    if (e.getKeyCode() == KeyEvent.VK_LEFT)
    {
        x = x - 5;
        repaint();
    }
    if (e.getKeyCode() == KeyEvent.VK_UP)
    {
        y = y - 5;
        repaint();
    }

    if (e.getKeyCode() == KeyEvent.VK_RIGHT)
    {
        x = x + 5;
        repaint();
    }

}


public void keyReleased(KeyEvent e) {}

public void keyTyped(KeyEvent e) {}




public void paintComponent(Graphics g) {

this.g2 = (Graphics2D) g;
g2.drawRect(x, y, width, height);

}

} 

测试类

import java.awt.Dimension;
import java.awt.FlowLayout;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;






public class Test {

 public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI(); 
            }
        });
    }

    private static void createAndShowGUI() {

        JFrame f = new JFrame("Rectangle");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add( new Rectangle(40,20,250,250));
        f.pack();
        f.setVisible(true);

    }

}

【问题讨论】:

    标签: java user-interface


    【解决方案1】:

    您错过了添加 super.paintComponent(g); 的错误。

    通过进行单行更改,您的代码可以正常工作。

    public void paintComponent(Graphics g) {
        super.paintComponent(g); // add this line
    
        this.g2 = (Graphics2D) g;
        g2.drawRect(x, y, width, height);
    
    }
    

    请阅读更多关于Painting in AWT and Swing

    【讨论】:

      【解决方案2】:

      我可以换个方式想,你不必绘制父组件。

      在调用drawRect之前,你可以清除旧的调用clearRect。您必须保存当前矩形的尺寸和位置。

      【讨论】:

        猜你喜欢
        • 2014-06-22
        • 2015-04-28
        • 2012-09-22
        • 1970-01-01
        • 1970-01-01
        • 2018-09-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多