2012-05-22 3 views
3

이 질문을 확인해 주셔서 감사합니다. 나는 좌절감으로 내 두개골을 긁어 본 것 같아. 그래서 'JPanel'이 포함 된 'JFrame'이 있습니다. 'JPanel'에는 창을 클릭 할 때마다 X 픽셀을 움직이는 작은 사각형이 있습니다.내가 움직이는이 사각형은 그 뒤에 흔적을 남기고 있습니다. 왜 누군가가 운동을 할 수 있습니까?

기본적으로 한 가지 예외를 제외하고는 모든 것이 기본적으로 동작합니다. 파란색 사각형이 오른쪽으로 움직이면 뒤에 다른 사각형의 흔적이 남습니다. 그러나 흔적을 남기지 않아야합니다. 그러나 창 크기를 조정하면 흔적이 사라집니다.

Catalyst.java

package Prototype; 

import java.awt.*; 

public class Catalyst { 

public static void main(String[] args){ 
    World theWorldInstance = new World("Prototype", 100,100, 600,100); /*title,xpos,ypos,width,height*/ 
} 

} 

World.java

package Prototype; 

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class World extends JFrame { 

Level mainPanel;  

public World(String title, int x, int y, int width, int height) { 

    setTitle(title); 
    setBounds(x,y,width,height); 
    setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
    setBackground(new Color(0x00000000)); 
    initLevel(); 

} 

public void initLevel(){ 
    mainPanel = new Level(); 
    Container visibleArea = getContentPane(); 
    visibleArea.add(mainPanel); 
    setVisible(true); 
    add(mainPanel); 
} 



} 

Level.java

package Prototype; 

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class Level extends JPanel implements MouseListener, ActionListener { 
Square x; 


public Level() { 
    System.out.println("This is working correctly[JPANEL Cons]"); 
    addMouseListener(this); 
    x = new Square(); 
} 

public void paintComponent(Graphics g){ 
    x.draw(g); 
} 

public void actionPerformed(ActionEvent e){ 
} 

public void mousePressed(MouseEvent e){ 
    requestFocus(); 
    x.move(); 
    repaint(); 
    System.out.println("Focus Acquired"); 


} 

public void mouseClicked(MouseEvent e) {} 
public void mouseReleased(MouseEvent e) {} 
public void mouseExited(MouseEvent e) {} 
public void mouseEntered(MouseEvent e) {} 
} 

Square.java

package Prototype; 

import java.awt.*; 

public class Square { 

private Point position; 
private int size; 
private final int displacement; 

public Square(){ 
    position = new Point(10,10); 
    size = 20; 
    displacement = 5; 

} 

public void draw(Graphics g){ 
    g.setColor(Color.blue); 
    g.fillRect(position.x-(size/2), position.y-(size/2), size,size); 
    g.setColor(Color.black); 
    g.drawRect(position.x-(size/2), position.y-(size/2), size,size); 

} 

public void move() { 
    position.x += displacement; 
} 
} 
,174,

모두 내 파일입니다. 나는 모든 것을 올바르게 표현하고 필요한 모든 내용을 제공했기를 바랍니다. 내가 과거에 비슷한 것을했을 때마다 이것은 결코 일어난 적이 없다. 나는 작은 것을 놓치고 있다고 생각하거나, 어리석은 짓을했습니다. 당신이 나를 도울 수 있다면, 미리 감사드립니다!

답변

3

다른 방법이 있습니다. 부모 객체의 paintComponent 메소드를 호출하여 패널을 지울 수 있습니다.

레벨에 생성자이 추가 :

this.setBackground(Color.BLACK); 

그리고이 paintComponent에에서 첫 번째 전화로 : 끝 내 친구

super.paintComponent(g); 
+0

Ahha, 흥미로운 것은이 물건에 대해 몰랐거나 결코 시도하지 않았다고 말할 수 있습니다 :-) +1 –

+0

Beautiful. 간단하고 우아한. 고맙습니다. – yoonsi

+0

스윙 튜토리얼 어딘가에 대해 배웠다. 수년 동안 두통이 번뜩하게했다. – Ewald

3

g.clearRect(x, y, width, height)을 사용하여 그림을 지우고 자하는 상기 좌표를 제공 할 수 있습니다. 또는 그림을 그리는 곳의 전체 크기를 줄 수 있습니다. 단 한 가지 명심해야 할 것은 그림이 무거운 작업이 아니라는 것입니다. 그렇지 않으면 너무 많은 양의 청소로도 회화에 부담이 생깁니다.

+0

감사합니다. 그러나, 나는 방금 JPanel에 직접 그림을 그리는 것을 깨달았습니다. 배경 그림을 추가하거나 그 위에 검은 색 사각형을 추가하면 문제가 해결됩니다. D : 시간 내 주셔서 감사합니다. – yoonsi

+0

대부분의 사람들에게 환영 받고 있습니다 .--), 여기이 스레드를 보시고,이 모든 것을 훌륭하게 작동시키는 예제를 가지고 있습니다. [볼 애니메이션] (http://stackoverflow.com/a/9852739/1057230) –

+0

위대한 링크 @nIcEcOw – Ewald

관련 문제