2014-05-05 66 views
0

我的代碼不會清除上一個矩形。我想通過使用getRect(),然後在我的keyPressed()方法中使用repaint(),這將解決問題。按下按鍵後,繪製的對象不會清除上一個矩形

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; 


public class Rectangle extends JFrame 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(); 


    setSize(1000,1000); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setLocationRelativeTo(null); 
    setVisible(true); 


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

} 


public void keyPressed(KeyEvent e) 
{ 

    if (e.getKeyCode() == KeyEvent.VK_DOWN) 
    { 
     g2.clearRect(x, y, width, height); 
     repaint(); 
     y = y + 5; 
     repaint(); 
    } 
    if (e.getKeyCode() == KeyEvent.VK_LEFT) 
    { 
     g2.clearRect(x, y, width, height); 
     repaint(); 
     x = x - 5; 
     repaint(); 
    } 
    if (e.getKeyCode() == KeyEvent.VK_UP) 
    { 
     g2.clearRect(x, y, width, height); 
     repaint(); 
     y = y - 5; 
     repaint(); 
    } 
    if (e.getKeyCode() == KeyEvent.VK_RIGHT) 
    { 
     g2.clearRect(x, y, width, height); 
     x = x + 5; 
     repaint(); 
    } 
} 


public void keyReleased(KeyEvent e) {} 

public void keyTyped(KeyEvent e) {} 




public void paint(Graphics g) { 

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

} 

} 

測試方法:

public class Test { 

public static void main(String[] args) 
{ 
    Rectangle rectangle = new Rectangle(400,200,500,500); 

} 
} 
+0

請勿重寫paint並直接在JFrame上繪製。而是使用添加到JFrame中的JPanel。看看這個教程:http://docs.oracle.com/javase/tutorial/uiswing/painting/step2.html。你也可以發佈一個現在正在發生的事情的圖像,這是不受歡迎的嗎? – BitNinja

回答

2
  1. setVisible(true)應該是最後一行代碼在公共Rectangle(...,因爲你加JComponent S到已經顯現Swing GUI的。

  2. JFrame默認情況下不支持KeyEvent

  3. JPanelJFrameCENTER區域,默認爲:myFrame.add(myPanel)

  4. 覆蓋getPreferredSize代替JPanel而不是設置爲JFrame尺寸;應通過調用myFrame.pack()初始化大小。

  5. JPanel必須專注於接收KeyEvent,setFocusable(true);使用KeyBindings而不是在JComponent層次結構中搜索焦點。

  6. 覆蓋paintComponent對於JPanel;第一條代碼行應該是super.paintComponent,否則會出現繪畫工件。

0

你可以添加更多的細節? 從我所看到的,你可能想要做一個清除按鈕&方法。

+0

問題是我不想用按鈕清除矩形,而是當我按下箭頭鍵時。如果我按下,我想要矩形向上移動,並且要清除前一個矩形。這有幫助嗎? – iii

+0

哦,矩形重複了嗎? – Cdog101

+0

從某種意義上說,它是。 – iii