2014-05-16 41 views
0

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

这是空闲矩形:http://imgur.com/D9orK9F

这是当我按住右箭头键:enter image description here

这里是我的代码:

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); 

    } 

} 

回答

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

enter image description here

0

我能想到其他办法,你没有画父组件。

致电drawRect之前,您可以清除旧的呼叫clearRect。您必须保存当前矩形的尺寸和位置。